Yee’s Blog

Practicing Thinking Learning Sharing .

Cocoa Touch Develop Tips : Session1

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不会改变。