iOS设置视图圆角失效的解决方案
2023-06-13 09:11:18 时间
前言
操作按钮常常需要设置视图圆角,比如注册页面的注册按钮。
I iOS设置视图cornerRadius属性失效的解决方案
1.1 解决步骤
1、尝试设置_numberLab.clipsToBounds = YES;
2、尝试设置 [self.numberLab layoutIfNeeded];
之后再执行cornerRadius
在设置完约束后, 并不能马上得到它的frame, 只要添加[self.view layoutIfNeeded]; 就能拿到frame设置圆角了
- (void)layoutSubviews{
[super layoutSubviews];
[self.numberLab layoutIfNeeded];
[self.contentView bringSubviewToFront:self.numberLab];
self.numberLab.layer.cornerRadius =self.numberLab.height*0.5;
}
3、尝试设置_numberLab.layer.masksToBounds = YES;
1.2 masksToBounds属性是什么?它有什么作用
- masksToBounds指在设置子layer在超出父layer时是否被裁剪,YES表示裁剪,NO表示不裁剪,默认是NO;通常在通过设置layer.cornerRadius属性实现圆角效果时要设置masksToBounds为YES,以保证圆角效果的实现,但这种方法是一种很低效的实现方式,也是最简单直接的。
- masksToBounds和clipsToBounds是不同的,前者指子layer层在超出父layer时是否被裁剪(masksToBounds是CALayer的属性),而后者指子view在超出父view时是否被裁剪(clipsToBounds是UIView的属性)。
1.3 只设置顶部的圆角
用法
- (void)layoutSubviews {
[super layoutSubviews];
[self.titleV layoutIfNeeded];
[self.titleV setCornerOnTop:kAdjustRatio(20)];
}
setCornerOnTop:
方法的实现
#pragma mark - Corner Radius
- (void)setCornerOnTop:(CGFloat)radius {
UIBezierPath *maskPath;
maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)
cornerRadii:CGSizeMake(radius, radius)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;
self.layer.mask = maskLayer;
}
- (void)setCornerOnBottom:(CGFloat)radius {
UIBezierPath *maskPath;
maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerBottomRight)
cornerRadii:CGSizeMake(radius, radius)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;
self.layer.mask = maskLayer;
}
- (void)setCornerOnLeft:(CGFloat)radius {
UIBezierPath *maskPath;
maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerBottomLeft)
cornerRadii:CGSizeMake(radius, radius)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;
self.layer.mask = maskLayer;
}
- (void)setCornerOnRight:(CGFloat)radius {
UIBezierPath *maskPath;
maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
byRoundingCorners:(UIRectCornerTopRight | UIRectCornerBottomRight)
cornerRadii:CGSizeMake(radius, radius)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;
self.layer.mask = maskLayer;
}
- (void)setCornerOnTopLeft:(CGFloat)radius {
UIBezierPath *maskPath;
maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
byRoundingCorners:UIRectCornerTopLeft
cornerRadii:CGSizeMake(radius, radius)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;
self.layer.mask = maskLayer;
}
- (void)setCornerOnTopRight:(CGFloat)radius {
UIBezierPath *maskPath;
maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
byRoundingCorners:UIRectCornerTopRight
cornerRadii:CGSizeMake(radius, radius)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;
self.layer.mask = maskLayer;
}
- (void)setCornerOnBottomLeft:(CGFloat)radius {
UIBezierPath *maskPath;
maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
byRoundingCorners:UIRectCornerBottomLeft
cornerRadii:CGSizeMake(radius, radius)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;
self.layer.mask = maskLayer;
}
- (void)setCornerOnBottomRight:(CGFloat)radius {
UIBezierPath *maskPath;
maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
byRoundingCorners:UIRectCornerBottomRight
cornerRadii:CGSizeMake(radius, radius)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;
self.layer.mask = maskLayer;
}
- (void)setAllCorner:(CGFloat)radius {
UIBezierPath *maskPath;
maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
cornerRadius:radius];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;
self.layer.mask = maskLayer;
}
- (void)setCornerRadius:(CGFloat)radius {
[self.layer setCornerRadius:radius];
[self.layer setMasksToBounds:YES];
}
II 添加发光的阴影(Shadow)
iOS去掉TabBar的顶部黑线,并添加发光的阴影
https://blog.csdn.net/z929118967/article/details/93181646
III 如何对UITableView的滚动加载进行优化,防止卡顿?
表格视图(UITableView)主要用来罗列展示数据项如果数据量很大,那么表格中将需要同样多的cell视图来显示,而cell的大量创建和初始化会造成内存压力,影响界面的流畅性,因此对表格视图的加载优化十分重要。UITableView的·滚动优化·主要在于以下两个方面:
- 1)减少cellForRowAtIndexPath代理中的计算量(cell的内容计算)。
- 2)减少heightForRowAtIndexPath代理中的计算量(cell的高度计算)。
3.1 减少cellForRowAtIndexPath代理中的计算量:
- ① 先要提前计算每个cell中需要的一些基本数据,代理调用的时候直接取出。
- ② 图片要异步加载,加载完成后再根据cell内部UIImageView的引用设置图片。
- ③ 图片数量多时,图片的尺寸要根据需要提前经过transform矩阵变换压缩好(直接设置图片的contentMode让其自行压缩仍然会影响滚动效率),必要的时候要准备好预览图和高清图,需要时再加载高清图。
- ④ 图片的“懒加载”方法,即延迟加载,当滚动速度很快时避免频繁请求服务器数据。
- ⑤ 尽量手动Drawing视图提升流畅性,而不是直接子类化UITableViewCell,然后覆盖drawRect方法,因为cell中不是只有一个contentview。绘制cell不建议使用UIView,建议使用CALayer。
3.2 减少heightForRowAtIndexPath代理中的计算量:
- ① 由于每次tableView进行update(更新)都会对每一个cell调用heightForRowAtIndexPath代理取得最新的height,会大大增加计算时间。如果表格的所有cell高度都是固定的,那么去掉heightForRowAtIndexPath代理,直接设置tableView的rowHeight属性为固定的高度。
- ② 如果高度不固定,那么应尽量将cell的高度数据计算好并储存起来,代理调用的时候直接取,即将height的计算时间复杂度降低到O(1)。
例如,在异步请求服务器数据时,提前将cell高度计算好并作为datasource的一个数据存到数据库供随时取用。
相关文章
- iOS开发之打包上传到App Store——(一)各种证书的理解
- iOS 10 ~ iOS 15 tableview 适配(使用注意事项)
- HBuilder X 连接苹果手机(IOS)详细教程。Windows: 连接iOS手机调试项目
- Hbuilder用自有证书打包 ios App上架AppStore流程
- iOS App上架到appStore
- IOS – OpenGL ES 黑白网状效果 GPUImageCrosshatchFilter
- 【iOS 开发】Objective-C 入门 Xcode 环境详解
- 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)
- IOS常用加密算法详解手机开发
- Linux与iOS之间的技术对比(linux和ios)
- javascript IOS 微信jssdk {“errMsg”:”config:fail”} 解决方案详解编程语言
- html5 IOS 软键盘弹出解决方案详解编程语言
- iOS与Linux:新老技术的融合(ios与linux的关系)
- 越狱工具Unc0ver 6.2.0发布:对iOS 14支持引入重大稳定性改进
- iOS版微信升级至8.0.3版表情包由300个扩展到999个 朋友圈可以发30秒视频
- Linux下安装iOS:解决方案(linux安装ios)
- 基于Linux环境下iOS应用开发实践(linux下开发ios)
- 应用Linux上编译IOS应用:实现跨平台体验(linux编译ios)
- 微软疯了:iOS/安卓应用一键移植Windows 10!
- 开启一个崭新世界:Linux与iOS系统(linux系统ios)
- IOS上可以安装Oracle吗(ios能装oracle吗)
- 移动端iOS技术实现Oracle数据库连接(ios联接oracle)
- iOS 15 Safari新变化:地址栏可根据用户偏好设置在顶部或底部
- IOS开发之路--C语言预处理