Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS设置视图圆角失效的解决方案

iOS设置视图圆角失效的解决方案

作者头像
公众号iOS逆向
发布于 2022-08-22 04:59:18
发布于 2022-08-22 04:59:18
2.4K00
代码可运行
举报
文章被收录于专栏:iOS逆向与安全iOS逆向与安全
运行总次数:0
代码可运行

前言

操作按钮常常需要设置视图圆角,比如注册页面的注册按钮。

I iOS设置视图cornerRadius属性失效的解决方案

1.1 解决步骤

1、尝试设置_numberLab.clipsToBounds = YES;2、尝试设置 [self.numberLab layoutIfNeeded]; 之后再执行cornerRadius

在设置完约束后, 并不能马上得到它的frame, 只要添加[self.view layoutIfNeeded]; 就能拿到frame设置圆角了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

- (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 只设置顶部的圆角

用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)layoutSubviews {
    [super layoutSubviews];
    [self.titleV layoutIfNeeded];
    
    [self.titleV setCornerOnTop:kAdjustRatio(20)];
    
}

setCornerOnTop:方法的实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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的一个数据存到数据库供随时取用。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iOS逆向 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
iOS CornerRadius失效的解决方案
1、尝试设置_numberLab.clipsToBounds = YES;2、尝试设置 [self.numberLab layoutIfNeeded]; 之后再执行cornerRadius
公众号iOS逆向
2021/07/29
7950
iOS 设置圆角
如图[上报]背景图右边圆角,当然切图也是可以的,写一个UIView的分类就可以实现。
赵哥窟
2021/06/29
1.4K0
iOS开发设置view某几个角为圆角
有时候为了设计的美观我们需要将一些控件的某几个角设置为圆角,很多朋友就会开始挠头不知道怎么去弄,我们知道设置四个角都为圆角很简单,创建一个view,设置其layer.cornerRadius即可,代码如下:
Lee坚武
2019/12/13
4.1K0
iOS_UITableView性能优化
// 滑动时按需加载, 防止卡顿 配合SDWebImage https://github.com/johnil/VVeboTableViewDemo
mikimo
2022/07/20
7420
iOS-圆角、边框、阴影
圆角 给view设置圆角,只需要设置view的layer属性的conrnerRadius,它表示图层角的曲率,默认值是0 圆角还可以用贝塞尔曲线来切,这样还可以实现单切某一个角,其它角不切的效果,我的demo中就是用该方法实现的,有兴趣的可以下下来看一看 conrnerRadius只影响背景颜色不影响背景图和子图层,所以往往我们在设置圆角时还会开启view的masksToBounds(剪裁属性),当设置成YES时,图层里面所有东西都会被截取 边框 边框需要设置layer的两个属性,borderW
用户2215591
2018/06/29
2.9K0
iOS 不规则的ImageView「建议收藏」
1.使用layer去实现, 见http://blog.csdn.net/johnzhjfly/article/details/39993345
全栈程序员站长
2022/07/08
9320
iOS 不规则的ImageView「建议收藏」
分分钟解决iOS开发中App启动广告的功能
allluckly.cn 前不久有朋友需要一个启动广告的功能,我说网上有挺多的,他说,看的不是很理想。想让我写一个,于是乎,抽空写了一个,代码通俗易懂,简单的封装了一下,各种事件用block回调的,有俩种样式的广告,一种是全屏广告,另一种是下面露logo的,类似网页新闻的启动广告。依赖SDWebImage主要用来下载网络的广告图片,一般项目里面网络图片都用的这个框架,所以在此不做过多的阐述。下面让我们来看看我封装的过程,对于新手来说,可以学习一下这种封装的思想。 1.首先建一个继承View的LBLaunch
Bison
2018/07/04
3.5K0
高性能设置圆角,告别离屏渲染
今天来写一个老生常谈的话题,也是一个面试的高频问题,我也在面试时不止一次被问到过这个问题——如何高性能的设置圆角。就用他作为2017年春节上班之后的第一篇文章。
Originalee
2018/08/30
9800
ios view 圆角
我们给一个View设置圆角一般都是用如下代码 // 设置layer超出父图层的部分剪切掉 self.cornerView.layer.masksToBounds = YES; // 设置圆角半径,若imageView1为正方形,设置圆角半径为边长的一半可实现圆效果 self.cornerView.layer.cornerRadius = 20.0; 但是如果需求是只要左上和右上圆角以上方法肯定不能实现,直接上代码 UIBezierPath *bezierPath = [UIBezierPath bezier
赵哥窟
2018/10/12
1.1K0
UIImageView圆角,教你远离cornerRadius
由于设置masksToBounds 会导致离屏渲染(离屏渲染:GPU在当前屏幕缓冲区外新开辟一个渲染缓冲区进行工作),这会给我们带来额外的性能损耗,如果这样的圆角操作达到一定数量,会触发缓冲区的频繁合并和上下文的的频繁切换,性能的代价会宏观地表现在用户体验上----掉帧。 当然这些效果不会直接显示在屏幕上,可以使用Instruments的CoreAnimation检测,当然你也可以自己写一个检测帧频的方法。
sweet说好的幸福
2020/12/23
2.3K0
[iOS]swift中UITableView使用.grouped样式时设置cell两侧边距以及实现圆角
在iOS13之后苹果为我们提供了新的样式选项.insetGrouped,如果使用这个样式的话,苹果会为我们自动实现每个section的圆角,而且cell两侧有相应的间距。这个我在这里不再说明,大家可以自行体验。
柯柯哥
2023/12/22
9090
常用开发技巧系列(一)
前言:         在我们iOS开发的过程中,你要是知道一些特别的小技巧的话,其实是可以帮你省很多事的,当然这东西也不需要我们专门去记,估计没有几个开发人员喜欢死记硬背,有需要,上网找,边学边用才是技巧的正确的打开方式。毕竟,这东西也是一个随着时间去积累总结的一个过程。这里总结了一些平时积累到的一些开发的小技巧,其实有一些要是碰不到那个问题我也记不起来,所以打算一直更新下去,把碰到的小技巧一点点的都总结起来,把它最后做成一个系列。你要有什么好的,欢迎在下面评论里展示出来给大家看,大家相互学习。 一:给凡
Mr.RisingSun
2018/01/12
9550
常用开发技巧系列(一)
学会不一样的Loading图
上述效果,其实很多app就单纯这样使用了,但是我们为了更美化,决定为其增加动态效果
Dwyane
2018/12/19
9660
学会不一样的Loading图
iOS_UIButton可点范围为六边形
导入该分类,将button的属性drawHexagon设为YES,就会将该按钮画成六边形了,并且可点击访问也是在六边形内。
mikimo
2022/07/20
4400
ios 图像处理
CGContextRef context = UIGraphicsGetCurrentContext();
conanma
2021/05/12
1.8K1
视觉效果 -- iOS Core Animation 系列三
本片文章前三章内容大家比较常用,后面的可能会不那么常用,前面的基础内容不想看了可以直接从第4段开始
Charlie_W
2018/10/19
1.3K0
视觉效果 -- iOS Core Animation 系列三
iOS动画(补充)--特殊Layer动画
iOS中有一些特殊的layer,也可以做一些动画效果,本文就补充两个可以做动画效果的layer: CAEmitterLayer 和 CAReplicatorLayer。
Haley_Wong
2018/08/22
9650
iOS动画(补充)--特殊Layer动画
CALayer之mask属性-遮罩
它类似于一个子图层,相对于父图层(即拥有该属性的图层)布局,但是它却不是一个普通的子图层。
周希
2019/10/15
2.3K0
iOS_运用CAShapeLayer和UIBezierPath实现的环形进度条
主要代码如下: #import "MOAnnularProgressView.h" @implementation MOAnnularProgressView { CAShapeLayer *backgroundLayer; // 背景图层 CAShapeLayer *frontFillLayer; // 填充图层 UIBezierPath *backgroundPath; // 背景贝赛尔曲线 UIBezierPath *frontFillPath; // 填充贝赛尔
mikimo
2022/07/20
6300
iOS_运用CAShapeLayer和UIBezierPath实现的环形进度条
从案例出发,由浅到深了解 iOS 动画
iOS 的动画框架很成熟,提供必要的信息,譬如动画的起始位置与终止位置,动画效果就出来了
猿_人类
2019/11/07
8400
相关推荐
iOS CornerRadius失效的解决方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验