一、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的分类中