1 - 设置斜体
UILabel *lab = [[UILabel alloc] init];
lab.frame = CGRectMake(100, 100, 100, 50);
[self.view addSubview:lab];
lab.backgroundColor = MCColor(@"#aaaaaa", 1.0); //自己定义的颜色宏
lab.text = @"斜体字体测试";
CGAffineTransform matrix =CGAffineTransformMake(1, 0, tanf(25 * (CGFloat)M_PI / 180), 1, 0, 0);//设置反射。倾斜角度。
UIFontDescriptor *desc = [ UIFontDescriptor fontDescriptorWithName :[UIFont systemFontOfSize:14].fontName matrix:matrix];//取得系统字符并设置反射。
lab.font = [UIFont fontWithDescriptor:desc size :14];
2 - 对象内部尽量直接访问实例变量
摘要: 在写入实例变量时,通过 设置方法 来做,而在读取的时候 ,通过直接访问的方式
在对象之外访问实例变量时,应该通过属性来做,然而在对象内部访问实例变量,强烈建议读取实例变量的时候通过直接访问的形式,而在设置实例变量的时候通过属性来做。
一 self.property 和_property 区别
直接访问实例变量,不经过OC 的 "方法派发" (下篇写),访问速度快,编译器生成的代码会直接访问保存对象实例变量的内存
直接访问实例变量,不会调用 设置方法,绕过了相关属性所定义的“内存管理语义”,例如在ARC 中,直接方法copy的属性,不会拷贝而是直接覆盖
直接访问实例变量,不会触发KVO
通过属性访问,可以设置断点调试
综合上面的情况:在写入实例变量时,通过 设置方法 来做,而在读取的时候 ,通过直接访问的方式。既可以提高读取操作速读,又能控制对属性的写入,保证相关属性的 "内存管理语义" 得以贯彻。
二 注意点
2.1 懒加载
懒加载的情况下,必须通过 获取方法 来访问属性,或者,实例变量不会别初始化
- (NSMutableArray *)modelArray {
if (!_modelArray) {
_modelArray = [[NSMutableArray alloc] initWithCapacity:9];
}
return _modelArray;
}
2.2 不要在 init 和 dealloc 方法中使用 self.property 因为在 init 和 dealloc 中,对象的存在与否还不确定,所以给对象发消息可能不会成功
- (instancetype)init
{
self = [super init];
if (self) {
_models = [NSArray array];
}
return self;
}
三 总结
在对象内部读取数据时,应该直接通过实例变量来读,在写入数据时,则应该通过属性来写
在初始化方法和 dealloc 方法中,应该直接通实例变量名直接来读写数据,避免用self.property访问
使用懒加载时,需要通过属性来读取数据
3 - 通过按钮的事件来设置背景色
1.通过按钮的事件来设置背景色
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *button1 = [[UIButton alloc] initWithFrame:CGRectMake(50, 200, 100, 50)];
button1.backgroundColor = [UIColor orangeColor];
[button1 setTitle:@"button1" forState:UIControlStateNormal];
[button1 addTarget:self action:@selector(button1BackGroundHighlighted:) forControlEvents:UIControlEventTouchDown];
[button1 addTarget:self action:@selector(button1BackGroundNormal:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button1]; }
// button1普通状态下的背景色
- (void)button1BackGroundNormal:(UIButton *)sender {
sender.backgroundColor = [UIColor orangeColor]; } // button1高亮状态下的背景色
- (void)button1BackGroundHighlighted:(UIButton *)sender {
sender.backgroundColor = [UIColor greenColor]; }
2.通过把颜色转换为UIImage来作为按钮不同状态下的背景图片
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *button2 = [[UIButton alloc] initWithFrame:CGRectMake(170, 200, 100, 50)];
[button2 setTitle:@"button2" forState:UIControlStateNormal];
[button2 setBackgroundImage:[self imageWithColor:[UIColor redColor]] forState:UIControlStateNormal];
[button2 setBackgroundImage:[self imageWithColor:[UIColor grayColor]] forState:UIControlStateHighlighted];
[self.view addSubview:button2];
}
// 颜色转换为背景图片
- (UIImage *)imageWithColor:(UIColor *)color {
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
4 - scrollview滑动到一定距离后现在不能滑动
CGFloat offsetY = scrollView.contentOffset.y;
// 最多向下拉伸200
if (offsetY < -200) {
CGPoint point = scrollView.contentOffset;
point.y = -200;
scrollView.contentOffset = point;
}