开发笔记 - 持续更新

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;
    }

你可能感兴趣的:(开发笔记 - 持续更新)