索引
- 关于MBProgressHUD
- 关于Block为什么要用copy关键字
- delegate为什么要用weak修饰
- 设置圆角的3种方法
- iOS绘制UITableView分割线
1. MBProgressHUD
在使用MBProgressHUD的时候, 有时候我们需要隐藏背景颜色, 即图中白色的部分
代码
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.View animated:YES];
hud.bezelView.style = MBProgressHUDBackgroundStyleSolidColor;
hud.bezelView.backgroundColor = [UIColor clearColor];
2. Block为什么要用copy关键字?
(1) 说到Block, 不得先不说iOS中的5大内存区, 栈区
堆区
全局区(静态区)
常量区
代码区
栈区: 由编译器自动分配并释放,存放函数的参数值,局部变量等
int i = 1;
int j = 1;
NSLog(@"%d, %d",i,j);
堆区: 由程序员分配和释放,如果程序员不释放,程序结束时,会由操作系统回收. 存放alloc
new
等创建的属性
UILabel *label = [[UILabel alloc]init];
全局区: 存储全局变量和静态变量
stati float x = 100.0f;
常量区: 存放常量
static const int num = 100;
代码区: 存放函数的二进制代码
(2) 3 种Block NSGlobalBlock
NSStackBlock
NSMallocBlock
NSGlobalBlock
: 全局Block -- 没有访问外部变量
void (^globalBlock)() = ^ (){
NSLog(@"globalBlock");
};
globalBlock();
NSStackBlock
: 栈Block
栈
一般是保存局部变量, 局部变量在函数执行完就被释放, 所以栈Block
没有用copy去修饰但访问了外部变量
int i = 100;
void (^stackBlock)() = ^ (){
NSLog(@"%d", i);
};
stackBlock();
NSMallocBlock
: 堆Block
保存在堆中的block 此类型blcok是用copy修饰出来的block, 它会随着对象的销毁而销毁,只要对象不销毁,我们就可以调用的到在堆中的block。
@property (nonatomic, copy)void (^mallocBlock)(NSString *string);
@property (nonatomic, assign)float num;
self.num = 123.0f;
__weak typeof(self) weakSelf = self;
self.mallocBlock = ^(NSString *string) {
__strong typeof(self) strongSelf = weakSelf;
NSLog(@"%f",strongSelf.num);
};
self.mallocBlock(nil);
这种NSMallocBlock
就是需要用copy修饰的Block了, 因为Block一般都是在栈区
里面的, 当我们需要这个Block能够跟这个对象的生命周期一样长的时候, 我们需要把该Block从栈区
里面copy
到堆区, 所以要用copy
3. delegate为什么要用weak修饰 -- 防止循环引用
如果delegate用strong
如果delegate用weak修饰
4. 设置圆角的3种方法
方法1
self.view.layer.cornerRadius = 10;
self.view.layer.masksToBounds = YES;
方法2: UIBezierPath + Core Graphic
UIImageView *iv = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 200, 200)];
[self.view addSubview:iv];
iv.image = [UIImage imageNamed:@"yourImage"];
UIGraphicsBeginImageContextWithOptions(iv.frame.size, 0, 0);
[[UIBezierPath bezierPathWithRoundedRect:iv.bounds cornerRadius:20] addClip];
[iv drawRect:iv.bounds];
iv.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
方法3: UIBezierPath + CAShapeLayer
创建一个继承自UIView的分类, 实现下面的方法即可
- (void)setCornerRadius:(float)radius {
CAShapeLayer *layer = [CAShapeLayer layer];
[layer setFrame:self.bounds];
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:layer.bounds cornerRadius:radius];
layer.path = path.CGPath;
self.layer.mask = layer;
}
方法4: UI给个带圆角的图
方法4
最好, 如果没有带圆角的图, 建议使用方法3
, 性能比较好, 因为方法3
不走drawRect
(CPU渲染), 而是用GPU渲染的, 效率高
如果想要给圆角视图加个阴影效果, 也有几个方案
- 直接添加
- 创建一个透明的View, 给View设置阴影, 然后把目标视图加在View上面
UIView *emptyView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 200, 200)];
[self.view addSubview:emptyView];
emptyView.layer.shadowColor = [UIColor darkGrayColor].CGColor;
emptyView.layer.shadowRadius = 10;
emptyView.layer.shadowOpacity = 0.7;
UIImageView *iv = [[UIImageView alloc]initWithFrame:emptyView.bounds];
//注意要把iv加在emptyView上, 否则就没有阴影了, 因为全透明的view是没有阴影的
[emptyView addSubview:iv];
iv.image = [UIImage imageNamed:@"结义"];
[iv setCornerRadius:10];
- 创建一个CAShapeLayer, 结合UIBezierPath通过
layer.shadowPath
给CAShapeLayer设置阴影, 然后把视图加在CAShapeLayer上面
//这样不需要任何view也能产生阴影
CAShapeLayer *laaa = [CAShapeLayer layer];
[laaa setFrame:CGRectMake(100, 100, 200, 200)];
laaa.shadowColor = [UIColor darkGrayColor].CGColor;
laaa.shadowRadius = 10;
laaa.shadowOpacity = 0.8;
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:laaa.bounds cornerRadius:10];
laaa.shadowPath = path.CGPath;
[self.view.layer addSublayer:laaa];
UIImageView *iv = [[UIImageView alloc]initWithFrame:laaa.frame];
[self.view addSubview:iv];
iv.image = [UIImage imageNamed:@"结义"];
[iv setCornerRadius:10];
注意
- 如果选择了
方法3: UIBezierPath + CAShapeLayer
去实现圆角, 应该选择CAShapeLayer
去实现阴影
因为我们设置目标视图的layer.mask
, 导致目标视图只能显示那一小块内容(阴影是超出layer的bounds的, 所以不能展示阴影), 只能新建一个新的CAShapeLayer
配合UIBezierPath
实现一个无视图的阴影, 注意: 这种方法创建的阴影是不能随着视图移动的, 因为阴影在视图的底下, 不是直接添加的阴影- 如果选择了
UIBezierPath + Core Graphic
实现圆角, 可以直接添加阴影的, 因为这个方法是走drawRect
的, 就是重绘了一个带圆角的image, 原本的Image并没有被使用, 可以看做是UI给了你一张带圆角的图片, 我们只是给图片加了个阴影而已
5. iOS绘制UITableView分割线
思路: 在cell的底部绘制一条线
将一下代码放到cell的.m文件中即可
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
CGContextFillRect(context, rect);
CGContextSetStrokeColorWithColor(context, [UIColor grayColor].CGColor);
CGContextStrokeRect(context, CGRectMake(20, rect.size.height - 0.5, rect.size.width - 20, 0.5));
}