《iOS进阶指南》读书笔记

Autolayout

Intrinsic Content Size

UIView等控件重写intrinsicContentSize 方法,可以增加UIView等的内间距。

同时可以不设置宽高,只设置top,left。

  1. 纯代码

    - (CGSize)intrinsicContentSize
      {
        CGSize originalSize = [super intrinsicContentSize];
        CGSize size = CGSizeMake(originalSize.width+20, originalSize.height+20); 
        return size;
      }复制代码
  2. XIB

    Instrinsic Size 属性设置为 Placeholder

  3. 案例

    UIView中添加两个高度不确定的Label。并自动适配两个Label的高度。

  4. Content Hugging Priority 内容高度变大的优先级

    用于两个Label其中一个跟随拉伸

  5. Content Compression Resistance 内容高度变小优先级

    用于两个Label其中一个跟随压缩

layoutSubviews 调用时机
  1. frame 发生变化时会调用

  2. 直接调用setLayoutSubviews

  3. setNeedsLayout ()复制代码

    标记此处需要刷新,但是不会立即调用layoutSubviews()

  4. layoutIfNeeded()  复制代码

    如果有需要刷新的标记,立即调用layoutSubviews()

  5. 如果要立即刷新,先调用view.setNeedsLayout() ,在然后马上调用layoutIfNeeded() 。

xib布局小技巧
  1. 设置此处可以在不同机型上使用不同的布局。

  2. UIStackView

给view添加到UIStackView上,可以是的view有流布局的效果。

UITableView

cell的高度计算
  1. 手动计算

    手动计算所有cell内控件的高度,相加求和。

  2. 使用self-satisfied

    - (CGSize)systemLayoutSizeFittingSize: (CGSize)targetSize;复制代码

    调用上面的方法,控件可以自动计算cell的高度,但是控件的约束要符合self-satisfied标准。

  3. 使用self-sizing , 此方法会很慢。

    tableView.estimatedRowHeight = 44.0
    tableView.rowHeight = UITableViewAutomaticDimension复制代码

避免离屏渲染

设置圆角

离屏渲染

self.contentView.layer.masksToBounds = YES; 
self.contentView.layer.cornerRadius = 4; 复制代码
使用UIImageView装载一个圆角图片来处理

避免离屏渲染

+ (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();
    
    NSData* imageData = UIImageJPEGRepresentation(image, 1.0f);
    image = [UIImage imageWithData:imageData];
    return image;
}复制代码
- (UIImage *)imageByRoundCornerRadius:(CGFloat)radius
                              corners:(UIRectCorner)corners
                          borderWidth:(CGFloat)borderWidth
                          borderColor:(UIColor *)borderColor
                       borderLineJoin:(CGLineJoin)borderLineJoin {
    
    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
    CGContextScaleCTM(context, 1, -1);
    CGContextTranslateCTM(context, 0, -rect.size.height);
    
    CGFloat minSize = MIN(self.size.width, self.size.height);
    if (borderWidth < minSize / 2) {
        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectInset(rect, borderWidth, borderWidth) byRoundingCorners:corners cornerRadii:CGSizeMake(radius, borderWidth)];
        [path closePath];
        
        CGContextSaveGState(context);
        [path addClip];
        CGContextDrawImage(context, rect, self.CGImage);
        CGContextRestoreGState(context);
    }
    
    if (borderColor && borderWidth < minSize / 2 && borderWidth > 0) {
        CGFloat strokeInset = (floor(borderWidth * self.scale) + 0.5) / self.scale;
        CGRect strokeRect = CGRectInset(rect, strokeInset, strokeInset);
        CGFloat strokeRadius = radius > self.scale / 2 ? radius - self.scale / 2 : 0;
        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:strokeRect byRoundingCorners:corners cornerRadii:CGSizeMake(strokeRadius, borderWidth)];
        [path closePath];
        
        path.lineWidth = borderWidth;
        path.lineJoinStyle = borderLineJoin;
        [borderColor setStroke];
        [path stroke];
    }
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}复制代码
设置阴影

离屏渲染

CALayer *shadowLayer = [CALayer layer]; 
shadowLayer = [UIColor blackColor].CGColor; 
shadowLayer.shadowOpacity = 1.0; 
shadowLayer.shadowRadius = 4.0; 
shadowLayer.shadowOffset = CGSizeMake(4.0, 4.0);复制代码

避免离屏渲染

shadowLayer.shadowPath = CGPathCreateWithRect(shadowLayer.bound
  s, NULL);复制代码

尽量让View不透明

Blending 在iOS中指混合颜色判断。不透明的View叠加,系统需要对图层进行计算。会拖慢速度。

UITableView的解耦

  • 使用plist文件存储静态资源
  • 动态Cell的绑定方法



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值