iOS-UIButton

一、UIButton
1.内部结构
1> UIButton内部默认有个UIImageView、UILabel控件,可以分别用下面属性访问:
@property(nonatomic,readonly,retain) UIImageView *imageView;
@property(nonatomic,readonly,retain) UILabel     *titleLabel;

2> UIButton之所以能显示文字,完全是因为它内部的titleLabel
也就是说,UIButton的setTitle:forState:方法设置的字符串就是显示到了titleLabel上

3> UIButton的setImage:forState:方法设置的图片显示到了内部的imageView上

4> 注意
* 设置按钮的文字或文字颜色,必须用下面的方法
- (void)setTitle:(NSString *)title forState:(UIControlState)state;
- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state;
#warnning 不能直接拿到titleLabel设置文字和文字颜色,比如下面的做法是错误的:
button.titleLabel.text = @"12323";
button.titleLabel.textColor = [UIColor redColor];

* 设置按钮内部的小图片,必须用下面的方法
- (void)setImage:(UIImage *)image forState:(UIControlState)state;
#warnning 不能直接拿到imageView设置图片,比如下面的做法是错误的:
button.imageView.image = [UIImage imageNamed:@"abc.png"];

2.其他设置
1> 设置按钮的文字自动换行
button.titleLabel.numberOfLines = 0;

2> 设置按钮的文字字体
button.titleLabel.font = [UIFont systemFontOfSize:16];

3> 设置按钮周边有多少区域不显示内容(不显示里面的小图片和文字)
// 顶部 10,左边 20,底部 10,右边 20
button.contentEdgeInsets = UIEdgeInsetsMake(10, 20, 10, 20);

二、图片拉伸
1.iOS 5.0之前的做法
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;

2.iOS 5.0的做法
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets;

3.iOS 6.0的做法
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode;

三、开发规范
1.枚举
1> 当某个属性的值只有固定的几个取值时,应该用枚举
2> 枚举常量名 以 “枚举类型名” 开头 或者 以 ”k + 枚举类型名“ 开头
* 比如
typedef enum {
    MessageTypeMe = 0, // 我发的
    MessageTypeOther = 1 // 别人发的
} MessageType;
* 或者
typedef enum {
    kMessageTypeMe = 0, // 我发的
    kMessageTypeOther = 1 // 别人发的
} MessageType;

2.readonly
如果某个属性的值只在类的内部修改赋值,外界不需要修改赋值、也不允许修改赋值,尽量加上readonly关键字

四、封装思想
1.如果有一段代码具备以下属性,应该抽到一个单独的类或者分类中:
1> 功能性:用来实现某个独立的功能
2> 工具性:简单易用实用
3> 全局性:整个项目中到处都用到这个功能

2.究竟这段功能代码抽到哪一个类或者分类,就看这个功能主要用到哪个类的方法API,哪个类最清楚这个功能怎么实现
* 比如返回拉伸好图片的功能应该放在UIImage的分类中
原文地址:https://www.cnblogs.com/DarbyCJ/p/3658220.html