日期: 2021 年 9 月 14 日

iOS_Swift之UICollectionView详解

一、简单介绍
UICollectionView是一种很常用的控件,与常用控件UITableView有很多相似的地方,它们都是UIScrollView的子类。UICollectionView可以实现很多不同布局的设计,比如常见的九宫格就是通过UICollectionView来实现的。下面通过一个Demo来详细介绍它的使用。

二、Demo介绍
1)UICollectionViewDataSource和UICollectionViewDelegate的代理方法

// #MARK: –UICollectionViewDataSource的代理方法
/**
– 该方法是可选方法,默认为1
– returns: CollectionView中section的个数
*/
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}

/**
– returns: Section中Item的个数
*/
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 8
}

/**
– returns: 绘制collectionView的cell
*/
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(“MyCell”, forIndexPath: indexPath) as! CollectionViewCell

cell.imageView.image = UIImage(named: “\(indexPath.row + 2).png”)
cell.label.text = “美景\(indexPath.row + 1)”

return cell
}

/**
– returns: 返回headview或者footview
*/
func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
let headView = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: “headView”, forIndexPath: indexPath)
headView.backgroundColor = UIColor.whiteColor()

return headView
}

// #MARK: –UICollectionViewDelegate的代理方法
/**
Description:当点击某个Item之后的回应
*/
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
print(“(\(indexPath.section),\(indexPath.row))”)
}

2)UICollectionViewFlowLayout基本设置如下:

//定义collectionView的布局类型,流布局
let layout = UICollectionViewFlowLayout()
//设置cell的大小
layout.itemSize = CGSize(width: width/2, height: height/3)
//滑动方向 默认方向是垂直
layout.scrollDirection = .Vertical
//每个Item之间*小的间距
layout.minimumInteritemSpacing = 0
//每行之间*小的间距
layout.minimumLineSpacing = 0

3)自定义UICollectionViewCell

A:新建CollectionViewCell.swift继承UICollectionViewCell并同时创建相应的xib

import UIKit

class CollectionViewCell: UICollectionViewCell {
@IBOutlet weak var imageView: UIImageView!

@IBOutlet weak var label: UILabel!

override func awakeFromNib() {
super.awakeFromNib()

self.contentView.backgroundColor = UIColor(red: 23/255, green: 232/255, blue: 233/255, alpha: 1)
}

}

B:UICollectionViewCell的注册

//CollectionViewCell的注册
collectionView.registerNib(UINib(nibName: “CollectionViewCell”, bundle: nil), forCellWithReuseIdentifier: “MyCell”)

4)Header和Footer的注册,以及使用UICollectionViewDelegateFlowLayout的代理方法

在XCode中通过CMD键+单击可以查看UICollectionViewDelegateFlowLayout,可以发现它继承于UICollectionViewDelegate,从它协议内部方法可以发现,都是与布局相关的回调方法。其中有定义item大小,section之间的间距以及绘制header和footer的回调方法,当我看到这里发现这与UICollectionFlowLayout里面部分属性一样,于是打开UICollectionViewFlowLayout协议,将里面的属性一比对,发现很多属性方法都一致,如设置itemSize,也就是定义item的大小,minimumLineSpacing是定义*小行距等。不难发现,在UICollectionViewDelegateFlowLayout里面的回调方法是可以单独定制某个item的,如果有不同类型item的需求,只能通过回调方法。

header的绘制如下(footer原理一样):

/**
– returns: 返回headview或者footview
*/
func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
let headView = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: “headView”, forIndexPath: indexPath)
headView.backgroundColor = UIColor.whiteColor()

return headView
}
header的注册如下:

//header的注册
collectionView.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: “headView”)
定制不同的item,回调方法如下:

/**
Description:可以定制不同的item

– returns: item的大小
*/
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
if indexPath.row % 2 == 1{
return CGSize(width: width/2, height: height/3)
}
else{
return CGSize(width: width/2, height: height/2)
}
}

三、Demo gif(下载源码)
定制item前:

%title插图%num

定制item后:

%title插图%num

iOS开发中总结的小技巧(持续更新中)

1、设置导航栏

//设置导航栏
//#MARK: 背景颜色
UINavigationBar.appearance().barTintColor = UIColor(red: 33/255, green: 150/255, blue: 243/255, alpha: 0.5)
//导航栏图标颜色
UINavigationBar.appearance().tintColor = UIColor.whiteColor()
//导航栏上的titleView字体
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor()]

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: “”, style: .Plain, target: nil, action: nil) //返回按钮文字空

2、设置工具栏

//设置工具栏
UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.blackColor(), NSFontAttributeName : UIFont.systemFontOfSize(12)], forState: .Selected)

UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.grayColor(), NSFontAttributeName : UIFont.systemFontOfSize(12)], forState: .Normal)

3、初始化变量的写法

//初始化变量的写法
private var tableView: UITableView = {
let tableView = UITableView(frame: CGRectMake(0,0,UIScreen.mainScreen().bounds.width,UIScreen.mainScreen().bounds.height), style: UITableViewStyle.Plain)
tableView.separatorStyle = UITableViewCellSeparatorStyle.None
return tableView
}()

4、UITableView和UICollectionView中的返回cell或者item个数回调方法的写法

//tableView or collectionView number
//return optional ?? 0//空合运算符

5、iPhone 各种型号屏幕的宽和高

//iphone 5s屏幕宽和高 320/568
//iPhone 6和6s屏幕宽和高 375/667
//iPhone 6plus和6splus屏幕宽和高 414/736

6、统计代码行数(在项目目录下)

find . -name “*.swift” |xargs wc -l

 

iOS项目开发实战(Swift)—查询天气小应用

1.新建Xcode项目,创建single view application,项目名称为swift_Weather,选择语言为Swift。

2.打开Main.storyboard,新建三个控件,一个用于输入城市的TextField,一个查询按钮Button,一个用于显示天气信息的TextView。如下图:

%title插图%num

3.然后直接将storyboard中的三个控件拖到ViewController.swift中,进行绑定,绑定是否成功可以看代码左边是否有一个小实的圆圈。如下图:

%title插图%num

4.为查询按钮Button添加一个Action,用于查询对应城市的天气。此时就需要各地天气信息的API接口,可以通过“http://www.weather.com.cn/data/cityinfo/城市对应的编码.html”url得到一个JSON串,然后进行相应的解析,获取所需要的天气信息。

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var cityInput: UITextField!
@IBOutlet weak var btnSearch: UIButton!
@IBOutlet weak var result: UITextView!

var cityDictinary = [“北京” : 101010100,”杭州” : 101210101,”常德” : 101250601,”黄冈” : 101200501]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

@IBAction func btnPressed(sender: AnyObject) {
loadWeathInfo()
}

func loadWeathInfo(){
//注意当启动应用程序的时候,会执行viewDidLoad
if let cityName = cityInput.text{
if let code = cityDictinary[cityName]{
let str = “http://www.weather.com.cn/data/cityinfo/\(code).html”
let url = NSURL(string: str)
let data = NSData(contentsOfURL: url!)
//编码出现error:Call can throw, but it is not marked with ‘try’ and the error is not handled,通过加一个try解决。原因就是没有处理错误
do{
let json =
try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments)
let weatherInfo = json.objectForKey(“weatherinfo”)

let city = weatherInfo?.objectForKey(“city”)
let maxTemp = weatherInfo?.objectForKey(“temp1”)
let minTemp = weatherInfo?.objectForKey(“temp2”)
let weather = weatherInfo?.objectForKey(“weather”)
result.text = ” 城市:\(city!)\n *高温度:\(maxTemp!)\n *低温度:\(minTemp!)\n 天气:\(weather!)\n”
}catch{
print(“error”)
}

}

}
//没查询完一次就进行清空
cityInput.text = “”
}
}

5.代码添加完成之后,成功运行结果如下图:

%title插图%num

如何把网络全部劫持到一个 IP?实在不知道在哪个节点提问

需求是这样的,一个无线路由器,一个 linux 电脑
无线路由器不联网,只是跟 linux 电脑相连, linux 电脑上是房子装修的广告网站

wifi 名字例如是:老王装修公司
打开 wifi 后所有的 URL 都劫持到 linux 这台电脑的 IP 上,怎么打开都是装修公司

跟 CMCC 上网认证那个差不多的意思

Linux 装修 劫持 路由器28 条回复 • 2015-10-06 13:42:55 +08:00
cnkuner 1
cnkuner 2015-10-06 08:16:24 +08:00 via Android
重定向。建议弄个好点的带重定向的路由器。
tntsec 2
tntsec 2015-10-06 08:25:41 +08:00
@cnkuner 我需要全部重定向,不是单个域名的
mrhuiyu 3
mrhuiyu 2015-10-06 08:29:43 +08:00
这和我当初在公司搭建邮箱出现的问题差不多,当时就是用深信服 ac 把所有 80 端口数据指定到了邮件服务器。。。。
这种需要类似重定向要么就是广告插件来做了。
ruandao 4
ruandao 2015-10-06 08:32:06 +08:00
arp 欺骗?
Showfom 5
Showfom 2015-10-06 08:33:49 +08:00
dnsmasq 全部解析到某个 IP
tntsec 6
tntsec 2015-10-06 08:38:13 +08:00
@Showfom dnsmasq 能不能配置 address=/./203.208.37.0 直接全部泛解析?
tntsec 7
tntsec 2015-10-06 08:39:18 +08:00
@ruandao 这个应该是 DNS 投毒吧,劫持 DNS 重定向
tntsec 8
tntsec 2015-10-06 08:39:34 +08:00
@mrhuiyu 我想找个简单的实现办法
Showfom 9
Showfom 2015-10-06 08:45:10 +08:00 ❤️ 3
@tntsec 这里有教程

https://sskaje.me/2015/09/dnsmasq-%E5%8A%AB%E6%8C%81%E6%89%80%E6%9C%89%E5%9F%9F%E5%90%8D/
Showfom 10
Showfom 2015-10-06 08:45:50 +08:00
@tntsec address=/#/127.0.0.1
tntsec 11
tntsec 2015-10-06 08:49:49 +08:00
@Showfom 卧槽 66666 ,就是这个了,我试试效果
Showfom 12
Showfom 2015-10-06 08:53:33 +08:00
@tntsec 23333333 你要干什么坏事!
Tink 13
Tink 2015-10-06 09:02:14 +08:00 via iPhone
这样治标不治本吧,改个 dns 不就不管用了吗
tntsec 14
tntsec 2015-10-06 09:07:14 +08:00
@Tink 主要针对的是闲的蛋疼的蹭网用户, wifi 名字营销和内容营销,再往上的 HTTP 劫持,这就需要更高级的路由器了
smileawei 15
smileawei 2015-10-06 09:20:39 +08:00
@tntsec
@Tink
可以在路由上劫持 udp53 怎么改都是一个样子。
xenme 16
xenme 2015-10-06 09:21:04 +08:00 via iPhone
直接 Hotspot 模式,一致跳到这里来认证,然后他们又没法认证就一直看网页了呗
tntsec 17
tntsec 2015-10-06 09:26:24 +08:00
@Showfom 666666 ping xxxx.com

正在 Ping xxxx.com [192.168.171.1] 具有 32 字节的数据:

ping ddd.com

正在 Ping xxxx.com [192.168.171.1] 具有 32 字节的数据:
kslr 18
kslr 2015-10-06 09:36:14 +08:00
https://gist.github.com/kslr/5decb3eea1a7b8a09cf0 显示 Gist 代码
SharkIng 19
SharkIng 2015-10-06 09:36:57 +08:00
这个是不是就和 WIFI 登录一样啊?免费 WIFI 刚链接的时候,不管你是什么网址,都会跳转到登录页面
tntsec 20
tntsec 2015-10-06 09:40:46 +08:00
@SharkIng 对!
l0wkey 21
l0wkey 2015-10-06 10:23:22 +08:00
可以 dnsmasq
或者复杂点, openwrt + wifidog
cjjia 22
cjjia 2015-10-06 10:37:24 +08:00 via Android
一个路由器就可以实现,不过页面只能 html ,当然路由器性能强悍的话也可以 php ,详情搜索 营销路由器 ,有现成的方案,也可以自己刷机折腾。
cjjia 23
cjjia 2015-10-06 10:43:51 +08:00 via Android
*好买那种天线可拆的路由器,然后自己换个玻璃钢天线,或者支持 usb 的路由器,然后挂载个大功率网卡,再加个玻璃钢全向天线,可以大大的增加覆盖范围。。
superkey 24
superkey 2015-10-06 11:16:15 +08:00
http://www.freebuf.com/tools/47863.html 这就可以。
tntsec 25
tntsec 2015-10-06 11:55:47 +08:00
@superkey 这是个 arp 劫持工具,而我不需要劫持,路由器是我的,上面的 dnsmasq 正合适
powergx 26
powergx 2015-10-06 11:56:23 +08:00 via iPhone
开放 ssid 做 L3 web 认证
lty1993 27
lty1993 2015-10-06 12:11:07 +08:00 via iPhone
DNS 不好用啊,用 NAT 的方法做 Capative Portal 更好一些!
TheCure 28
TheCure 2015-10-06 13:42:55 +08:00
wifidog + openwrt
我做过很多次
你把那个默认的 php 改了就行了

有没有国内电信百兆共享的限流量服务器

起码要 500g 流量,要便宜
流量 百兆 服务器 共享12 条回复 • 2015-10-11 21:13:03 +08:00
wy315700 1
wy315700 2015-10-11 12:47:23 +08:00
云服务都有按流量计费的,不限带宽,,
qiuai 2
qiuai 2015-10-11 12:52:04 +08:00 ❤️ 1
去看看 hypo.cn 吧…
zjl15551 3
zjl15551 2015-10-11 13:00:05 +08:00 via Android
要 vps
qiuai 4
qiuai 2015-10-11 13:18:09 +08:00
@zjl15551 那你说的那门子服务器…… VPS 假如说给你百兆共享,那就是坑你呢…
49 5
49 2015-10-11 14:06:11 +08:00 via Android
那就 Azure 咯
webjin 6
webjin 2015-10-11 14:10:55 +08:00 via Android
www.71idc.com
lshero 7
lshero 2015-10-11 14:11:43 +08:00
百兆共享 限 500G 流量 估计折腾下来 还没有国内的一个 IP 值钱吧
zjl15551 8
zjl15551 2015-10-11 14:24:11 +08:00 via Android
@webjin 你这个 vps 是什么线路
qiuai 9
qiuai 2015-10-11 14:39:31 +08:00
@lshero 国内一个 IP 一个月也就 30 左右.这还是零售价.你确定???
lshero 10
lshero 2015-10-11 14:52:17 +08:00
@qiuai 这个你也要看具体的资源吧,比如帮别人在成都电信机房租用的机柜由于都是政企用户的老机房没有多少 IP , 价格被哄抬到了 600-700 一年,要不然就是给电信一年贡献多少的利润。

作为零售的话青云一个 IP 一月也就 30 块

CNNIC 的入会费也不算太夸张 IP 价格这里有 http://www.cnnic.net.cn/jczyfw/ipas/ipasCNNICfplm/201508/t20150831_52801.htm
但是你成本价拿上后没有运营商替你广播你有啥办法?互联互通网间流量结算价格几个人承担的起?
qiuai 11
qiuai 2015-10-11 14:55:46 +08:00
@lshero 既然要租.就不要去租缺 IP 的老机房.国内机房缺 IP 的不多.只是可能一些机房因为一些原因被炒起来了.你不能以这种 IP 的价格来衡量国内 IP 的价格.
webjin 12
webjin 2015-10-11 21:13:03 +08:00 via Android
@zjl15551 linode

国内用某云服务器的看过来~

想问下你们的云盾都卸载了么?
然后默认的 apt-get 的源或者 yum 的源都改了吗?如果改了,都改成哪些了呢?貌似默认是某云自己的源。
除了上面两个还做了哪些必要的操作呢?

18 条回复    2015-10-16 10:45:36 +08:00
Marfal
    1

Marfal   2015-10-15 00:45:11 +08:00

为什么需要改源(心累
XiaoxiaoPu
    2

XiaoxiaoPu   2015-10-15 01:29:49 +08:00

系统都重装了,毕竟偏爱洗发水
aheadlead
    3

aheadlead   2015-10-15 07:03:54 +08:00 via iPad

没卸载…
yanyandenuonuo
    4

yanyandenuonuo   2015-10-15 08:22:14 +08:00 via Android

@a33004407 貌似某云自身的软件源里的软件版本都比较低啊
yanyandenuonuo
    5

yanyandenuonuo   2015-10-15 08:22:38 +08:00 via Android

@XiaoxiaoPu 云服务器怎么重装系统?
yanyandenuonuo
    6

yanyandenuonuo   2015-10-15 08:23:19 +08:00 via Android

@aheadlead 那你上次中*了没
aheadlead
    7

aheadlead   2015-10-15 09:43:54 +08:00

@yanyandenuonuo 我那几台都没中*

重装系统可以从控制台重装

XiaoxiaoPu
    8

XiaoxiaoPu   2015-10-15 10:29:50 +08:00

@yanyandenuonuo 我是下载 iso 到主机,启动主机时在图形控制台用 grub 引导 iso ,然后安装
yanyandenuonuo
    9

yanyandenuonuo   2015-10-15 12:08:42 +08:00

@aheadlead 控制台重装不也是用的某云自身的系统==并且感觉所谓的重装就是重新分配了一台虚拟机器 IP 不变而已==

@XiaoxiaoPu 云服务器怎么进 grub 引导?

ivmm
    10

ivmm   2015-10-15 12:24:23 +08:00

云栖大会上去问。

他们云盾部门,当时所有人每人总共手写了几千封道歉信,受过这种惩罚,我觉得他们不会再犯这种二错误了

XiaoxiaoPu
    11

XiaoxiaoPu   2015-10-15 13:56:51 +08:00

@yanyandenuonuo 编辑 /boot/grub/grub.cfg ,把 timeout 调高,重启服务器,立刻打开图形控制台(可能需要多试几次),然后就能看到 grub 界面,这时候按 c 就可以进入 grub 的命令模式,手动输入命令引导 iso 即可
XiaoxiaoPu
    12

XiaoxiaoPu   2015-10-15 13:59:27 +08:00

@yanyandenuonuo 重装系统前需要备份网络配置,因为阿里云的网络是要手动配置的。另外因为纯净的系统缺少阿里云的一些东西,磁盘镜像无法用来创建新虚拟机。
yanyandenuonuo
    13

yanyandenuonuo   2015-10-15 20:53:10 +08:00

@ivmm 23333 好机智啊 不过所谓的信不是盛传为代笔么
yanyandenuonuo
    14

yanyandenuonuo   2015-10-15 20:55:22 +08:00

@XiaoxiaoPu soga 涨姿势了又 我去试下
不过要手动配置网络的话不会在安装系统的时候断开链接么 这样通过系统的控制台还可以登录系统么
ivmm
    15

ivmm   2015-10-15 21:04:45 +08:00

@yanyandenuonuo 我去云栖问了,他们说那几天真的是写到手抽筋。
XiaoxiaoPu
    16

XiaoxiaoPu   2015-10-15 22:03:22 +08:00

@yanyandenuonuo 管理控制台相当于虚拟机的显示器,和网络无关
yanyandenuonuo
    17

yanyandenuonuo   2015-10-16 10:45:20 +08:00

@ivmm 23333 都是辛酸泪啊
yanyandenuonuo
    18

yanyandenuonuo   2015-10-16 10:45:36 +08:00

@XiaoxiaoPu soga Thx~

千万条数据级服务器的配置应该是什么样子

现在有个服务器,每天新增两百万条数据左右,然后总数据已经达到 5000W+,但是 PV 较小,每天 1000+左右吧。请问至少服务器要达到什么样的配置才能不吃力。

服务器 数据 吃力 请问12 条回复 • 2015-10-20 13:48:46 +08:00
ryd994 1
ryd994 2015-10-20 09:50:53 +08:00
0.现在什么情况?什么配置?为什么吃力查清了么?
1.是什么数据?旧数据能不能优化走?分库分机
2.有多少索引?索引多大?内存大小应当参照索引大小配。
既然请求量不大,那可以忽略缓存部分( memcached/redis 在没有大量重复查询的时候没什么用)
3.机械硬盘应该是顶的住的,如果你不介意延迟的话
4.如果软 raid ,考虑软 raid 的计算量
zrp1994 2
zrp1994 2015-10-20 10:17:58 +08:00
@ryd994
1. 主要是 8G 内存几乎占满, CPU 和 IO 占用都稍低。主要是 Select 语句查询太慢,现在正在考虑分表,但是感觉按天分是不是太多了
2. 由于数据量大的部分的表结构是其他人规定的,发现他们没有给索引……而且查询的时候也不按索引查询。
3.机械硬盘,没有加缓存。
vibrance 3
vibrance 2015-10-20 10:21:14 +08:00 via iPhone
站群? 5000 万多才千访问,为什么不关啦
zrp1994 4
zrp1994 2015-10-20 10:22:25 +08:00
@vibrance 不是站群
HentaiMew 5
HentaiMew 2015-10-20 10:36:00 +08:00
5000 万的数据量 oracle 应该能驾驭,不过没索引当然慢了…
newtonisaac 6
newtonisaac 2015-10-20 10:36:01 +08:00
索引
kn007 7
kn007 2015-10-20 10:40:11 +08:00
没索引,你怎么换都坑爹
zrp1994 8
zrp1994 2015-10-20 10:45:44 +08:00
@kn007
@newtonisaac
@HentaiMew
确实是,但是要改也只能等到下一期了,至少还有半个月……坑爹
ryd994 9
ryd994 2015-10-20 10:46:10 +08:00 via Android
必须加索引!没索引你居然也能活到现在……
没索引除非你内存能放下整个数据库,然而即使那样也比索引慢
没索引,换什么配置都药丸
zrp1994 10
zrp1994 2015-10-20 10:48:44 +08:00
@ryd994 好吧……吓得我立马滚去在本地鸡上测试下
uleh 11
uleh 2015-10-20 12:06:19 +08:00
每天才 1000+的 PV ,好一点的 PC 配置都可以承受了吧
关键还是数据库要索引。。
oott123 12
oott123 2015-10-20 13:48:46 +08:00 via Android
难道每次查询都要扫全表吗…
为服务器的硬盘感到默哀

国外那里有便宜的大宽带服务器?

国外那里有便宜的大宽带服务器?特别是 G 口或者百兆独享的那种,至于服务器配置没啥要求, 512 内存单核都行
服务器 宽带 便宜 国外12 条回复 • 2015-12-05 12:20:39 +08:00
yytsjq 1
yytsjq 2015-10-13 23:35:04 +08:00
LeaseWeb
OVH
fengxiang 2
fengxiang 2015-10-13 23:45:08 +08:00
百度了下 LeaseWeb ,吓死我了。
http://www.hostloc.com/thread-252090-1-1.html
dog
vibbow 3
vibbow 2015-10-13 23:51:30 +08:00
@fengxiang 我在 leaseweb 用的挺好的啊…
fengxiang 4
fengxiang 2015-10-14 00:01:50 +08:00
@vibbow 查身份证吗?
vibbow 5
vibbow 2015-10-14 00:13:36 +08:00
@fengxiang 没查啊,但是会打电话验证地址的。
em70 6
em70 2015-10-14 00:19:21 +08:00 via Android ❤️ 1
Linode 10 美元的 VPS 是 125M 带宽 2T 流量每月,不够再买几个 10 美元 VPS 即可,同账号下流量共享。

20 美元 250M 带宽, 40 美元 500M 带宽
lolicon 7
lolicon 2015-10-14 00:20:47 +08:00 via Android
online 5 欧 G 口共享 150M 保证
ericFork 8
ericFork 2015-10-14 01:25:07 +08:00
原始需求是什么,看需求来推荐
ryd994 9
ryd994 2015-10-14 01:54:42 +08:00
@lolicon 6 欧, 200M 保证
不过机器性能太差,怎么都跑不满 200M 就是了
Rayyyw 10
Rayyyw 2015-10-14 08:56:15 +08:00
美国洛杉矶百分百 百兆独享
G2120 /4G/500G/100M 独享 2G 防御 3IP 首月 299 元,续费 399 元;
I3-3320 /4G/500G/100M 独享 2G 防御 3IP 首月 499 元,续费 599 元;
E3-1230 /8G/500G/100M 独享 2G 防御 3IP 首月 699 元,续费 799 元;
测试 IP 162.212.32.1 33.1 34.1 35.1
QQ2514658965
shangpan 11
shangpan 2015-11-28 19:28:18 +08:00
带宽*便宜的应该就是 online.net 了。

6 欧的机器, G 口不限流量,保证 200M 。
snsd 12
snsd 2015-12-05 12:20:39 +08:00
@shangpan 硬盘多大

AndroidStudio权威教程 AS添加第三方库的6种方式(Jar module so等)

AndroidStudio权威教程 AS添加第三方库的6种方式(Jar module so等)

点击项目设置按钮

这里写图片描述

依次选择 App > Dependencies

这里写图片描述

1. 直接搜索法

依次选择 + > Library dependency

这里写图片描述

这里的搜索一定要是全名的,不然搜不到哦

这里写图片描述

下图所表示的库和Gradle文件是对应的,后面我们会将Gradle

这里写图片描述

点击OK后,我们会看到AS下边中心位置出现了刷新,以及重新Build项目

这里写图片描述

测试

这里写图片描述

这里如果你想问我的背景怎么设置的那么请看这里:[Android Studio 权威教程]Android Studio 三种添加插件的方式,注意先顶帖哦,可以自己设置图片哦

2. libs添加法

这里直接复制你的第三方jar包到如下目录,我们这里以UML为例子,首先点击Android ,切换到Project

这里写图片描述

找到app > libs ,如果没有libs就新建一个;如果是eclipse导出过来的项目那么这个libs目录直接在根目录下,这点切记

这里写图片描述

现在我们点击下图的按钮重新Build一下项目

这里写图片描述

测试

这里写图片描述

3. Module添加法

这在这里新建了一个Module名称为 mylibrary,和新建项目差不多,这里先不多讲,然后我新建了一个UserTest.class做测试,我们在App中调用这个类

这里写图片描述

然后我们开始添加Module,点击项目设置小按钮

这里写图片描述

app >Dependencies > + >3.Module dependency

这里写图片描述

选择Module

这里写图片描述

然后就看到我们添加的Module了,然后点击ok

这里写图片描述

Build项目中,等到Build完毕我们测试

这里写图片描述

测试

这里写图片描述

4. Gradle 直接添加法

找到build.gradle(Module:app),然后找到dependencies,
这里我们可以看到我们刚才添加的库,刚才那个项目设置是和这里是一一对应的。

这里写图片描述

我们这里以github上android 中Star*多的网络请求框架[android-async-http],我们来到它的官网,我们可以看到这样一段描述:

这里写图片描述

再看看上边的那个图,我们是不是可以直接复制下面的内容就可以了

1.<code class="hljs bash">compile 'com.loopj.android:android-async-http:1.4.5'</code>

这里写图片描述

然后我们重新点击Build按钮,然后开始测试
(注意:这里有时候build一两次是不可以的,需要多build几次,原因你懂得)

这里写图片描述

测试

这里写图片描述

5. 添加.so链接库法

如果你的app需要集成百度地图之类的,一定有这样的so动态库,这里是我自己编译的一个简单的so库,我们做测试:

这里写图片描述

然后复制lib下的所有文件,到AS的app > libs下

这里写图片描述

然后找到build.gradle(Module:app) 文件,在android节点下添加如下内容

1.<code class="hljs bash"><code class="language-java hljs ">sourceSets {
2.main {
3.jniLibs.srcDirs =['libs']
4.}
5.}</code></code>

这里写图片描述

然后build一下

这里写图片描述

看到如下说明成功构建了

这里写图片描述

测试,使用jni给TextView赋值

这里写图片描述

这里写图片描述

这里我们就测试成功了,下面我们讲一种更加简单粗暴的方法

6. 添加.so简单粗暴法

直接创建一个jniLibs目录就可以了,然后复制就好了
路径为:app > src > main >jniLibs

这里写图片描述

到这里我们的添加第三方库的教程就结束了,如果有问题请留言,感谢

01.<code class="hljs bash"><code class="language-java hljs "><code class="language-java hljs ">/**
02.* --------------
03.* 欢迎转载   |  转载请注明
04.* --------------
05.* 如果对你有帮助,请点击|顶|
06.* --------------
07.* 请保持谦逊 | 你会走的更远
08.* --------------
09.* @author zsl
10.* @github https://github.com/yy1300326388
11.* @blog http://blog.csdn.net/yy1300326388
12.*/
13.</code></code></code>

TextView设置*多显示指定个字符,超过部分显示…(省略号)

TextView设置*多显示指定个字符,超过部分显示…(省略号)

今天在公司遇到一个需求;TextView设置*多显示8个字符,超过部分显示…(省略号),网上找了很多资料,有人说分别设置TextView的android:signature=”true”,并且设置android:ellipsize=”end”;但是我试了,并没有成功,*后自己试出一种方式如下:供大家参考

 

[java]

  1. <TextView
  2. android:id=“@+id/tv”  
  3. android:layout_width=“wrap_content”  
  4. android:layout_height=“wrap_content”  
  5. android:maxEms=“18”  
  6. android:singleLine=“true”  
  7. android:ellipsize=“end”  
  8. />

这里我们不说那些复杂的属性,光说我们通常用的比较多的,android:maxlength

官网API对其的解释为:

%title插图%num

 

*句,也就是说,他是个inputfilter(输入过滤器)他的作用是通过specified  , number(你指定的数字)来限制text   ,length(文本长度),这里特指的是文本长度,而无论我们输入什么内容,英文,符号,数字,汉字………………这些都属于文本范围,所以maxlength的作用就是直接限制显示的长度,

比如:

%title插图%num

 

界面效果就是:

%title插图%num

7个字母+3个汉字。

今天做到这里的时候发现不能单纯利用这个属性做限制,就看了别的,发现还有个maxEms的属性,官网对其的解释为:

%title插图%num

 

*句:翻译过来是使得textview的宽度不少于很多ems的宽度

What???????此时超级不理解ems是啥?反正*对不能是邮政快递吧,很迷茫在网上查了下各种开发者的解释,如下:

%title插图%num

 

这位说是限制字符数量,那么我的理解就是严格按照中文两个字符长度,字母占一个这样的规则,于是写了个例子进行测试,

%title插图%num

 

界面结果是:

%title插图%num

的确是自动换行了,但是*行显示了7个字母加2个汉字,按照字节数来说的话应该是7+4=11才对啊,完全不是五个,但是往下看,第二行,是四个汉字加一个中文标点,10个字符长度,5个字符,莫非是这个意思?

然后我进行了下面几种测试:

%title插图%num

%title插图%num

 

*行是10个a,我就想难道在这里,中文算1个字符长度,字母算半个?

继续测试

%title插图%num

%title插图%num

 

*行显示的是25个字符(包含三个英文标点),阿西吧,刚刚建立的世界观就毁了,看来也不是这种计算方式。

继续测++:

%title插图%num

%title插图%num

 

到这里的时候我就欢乐了,应该就是指中文汉字数目吧,继续验证

%title插图%num

%title插图%num

 

我了个去…………*行咋又出现了11个字呢………………

于是我从1开始验证到了18,发现如下不成规律的规律:

 

设你输入的参数为n, 屏幕显示的数量为m。

值为1-5时,m = n..

6-11时,m = n+1。

12-18时,m = n+2。

再大我就没测试了,因为屏幕放不下了……………

基本是符合规律的,对于结果+1和+2,我的猜想是,汉字间是有间隙的,汉字一多,加上间隙,宽度就会增大。也只是猜想,再反过来看看API。

%title插图%num

 

虽然还是不明白ems是什么,但是这里有个很重要的词,wide,宽度范围,而没有强调长度,那么我想应该就是字符在屏幕中所占的宽度了,既然这样,就和屏幕宽度和字体大小有直接的关系。

本文到此基本能结束了,相信大家也有点了解了,虽然我也不能确定自己的猜想是正确的,但是拿来用应该没问题了,但是我对这个方法还有点吐槽:

1, GoogleAPI会以汉字为基准吗?地位一下提高的感觉啊……

2, 对于ems这种英文符号,没有意义,我们该怎么猜测。

3, 在android条件下,各种分辨率,各种屏幕标准,山寨手机还喜欢篡改默认字体的情况下用这种空间布局属性实在不太好适配呀……有较大的局限性

4, 综上所述,这个属性和方法不好用……over。

我不知道自己的验证和理解到底对不对,还是我根本就理解错了,希望对此有更靠谱理解的大神多多指点,在此谢过。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速