Tips1: UILabel
设置UILabel 的一种比较时尚的方式, 运用了NSMutableParagraphStyle 和 NSAttributedString
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| UILabel *label = [[UILabel alloc] init];
label.backgroundColor = [UIColor clearColor];
label.translatesAutoresizingMaskIntoConstraints = NO;
label.numberOfLines = 0;
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;
paragraphStyle.alignment = NSTextAlignmentCenter;
paragraphStyle.lineSpacing = 7;
NSDictionary *attributes = @{ NSFontAttributeName : [UIFont ajkH3Font],
NSForegroundColorAttributeName: [UIColor brokerLightGrayColor],
NSParagraphStyleAttributeName : paragraphStyle
};
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:@"快去添加更多联系人,\n 邀请他们和你一起聊天吧!"
attributes:attributes];
label.attributedText = attributedText;
[_addContactNotificationView addSubview:label];
[_addContactNotificationView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[label]|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(label)]];
[_addContactNotificationView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[label(50)]|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(label)]];
|
Tips2: UIButton
UIButton有Property UIImageView 和 UILabel, 可以通过设置 imageEdgeInsets 和 titleEdgeInsets 来对这两者进行布局,这里要说明UIImageView 和 UILabel在 UIButton 中默认的位置布局如下:
|[UIImageView]-[UILabel]|
其中系统默认 [UIImageView]–[UILabel] 作为一个整体居中。
我们如何才能将其设置成以下布局
|-10-[UIImageView]-10-[UILabel]|
其中ImageView距离左边的padding 10.0f ,ImageView和Label的padding 也为10.0f
分别计算UIImageView和UILabel的宽度
1
2
3
4
5
6
7
8
| CGFloat imageWith = image.size.width;
CGFloat titleWith = [button.titleLabel.attributedText size].width;
CGFloat imageInsetsLeft = - (button.width - imageWith - titleWith - padding * 2); // negative 是向左偏里中心,其绝对值就是偏移的幅度。
CGFloat titleInsetLeft = imageInsetsLeft + padding;
button.imageEdgeInsets = UIEdgeInsetsMake(0, imageInsetsLeft, 0, 0);
button.titleEdgeInsets = UIEdgeInsetsMake(0, titleInsetLeft , 0, 0);
|
通过 imageEdgeInsets 和 titleEdgeInsets 控制image 和 label 的距离的关键,在于你要知晓,这两者默认的位置一起居中. 这样才能通过UIEdgeInsetsMake创建正确的edgeInsets。
这里顺便研究下 contentEdgeInsets 到底如何使用
Tips3: UITableViewCell
UITableViewCell 在被select 的之后,其背景色会变灰,而且其contentView 上面的所有subView 的backgroundColor 属性都会被设置成灰色。
假设UILabel 是contentView 的subView,那么改如何设计才能保证,其背景色在被选中的时候不会消失呢?
如果说,通过在UILabel 上调用 [label insertView:imageView atIndex:0] 但是不幸的是UILabel 上的文字会被覆盖掉。这样只能再引入一个UIView,但是这样会导致View 的hierachy 太复杂,影响性能。
其实有一个更为简单的办法:
1
2
| label.backgroundColor = [UIColor clearColor];
label.layer.backgroundColor = [UIColor redColor].CGColor;
|
当在cell被selected之后,其label 的backgroundColor会被重新设置,但是layer上的backgroundColor不会改变。