iOS 圆形视图的自动布局问题求助

2015-05-05 21:28:15 +08:00
 gloryDay

对应用的view进行自动布局设置时,通过view.layer.cornerRadius处理成圆形的视图,在设置完自动布局后,在不同大小的屏幕下会发生变形,有没有什么办法可以保证圆形的view在自动布局的作用下不变形呢?

5092 次点击
所在节点    iDev
21 条回复
Elethom
2015-05-05 21:31:32 +08:00
如果 constraints 無錯誤不會出現這樣的問題。
vincentxue
2015-05-05 22:10:53 +08:00
如果你在自定义 View 里布局,那么覆盖 `layoutSubviews` 方法,在这里面获取 `view` 的 size,然后设置 `cornerRadius`。

如果你在自定义的 UIViewController 里布局,那么覆盖 `viewDidLayoutSubviews`,余下同上。

另外建议设置 `view.layer.masksToBounds = YES`。

原因: http://stackoverflow.com/questions/11324878/what-is-relation-between-maskstobounds-and-cornerradius
wanganjun
2015-05-05 22:19:14 +08:00
一个正方形的view用了cornerRadius才会是圆形, 想让圆形不变形, 把view宽度和高度约束成一样大小应该就可以了
black
2015-05-05 22:41:23 +08:00
@Elethom 非常赞同,lz 的问题很明显是 constrains 设置得不对。
gloryDay
2015-05-05 23:00:36 +08:00
@black 重新复习了遍autolayout,明的再设置下
vincentxue
2015-05-06 10:16:10 +08:00
@black

我觉得和约束没什么关系吧?约束做不到约束圆角大小,并且圆角大小不会根据视图尺寸的变化而自动变化,它只能被设置为一个确定的值。

所以如果要通过设置圆角来把视图变成圆形,并且要适应动态的尺寸变化而保持视图不变形,那么你只能在尺寸变化后再重新设置圆角。
black
2015-05-06 10:23:30 +08:00
@vincentxue 楼主给的信息不足,无法确定楼主是否在适配不同屏幕大小的同时改变了 view 的 size(这里我认为是没有),如果确实是想不同的屏幕对应不同 size 的 view,那么你说的有道理。
cheng4741
2015-05-06 13:15:25 +08:00
Aspect Ratio 这个约束就是为了不变形。为什么楼上没人说?
cheng4741
2015-05-06 13:16:56 +08:00
哦。看错了,你指的是圆角半径随大小适应是吧
gloryDay
2015-05-06 14:22:35 +08:00
@vincentxue 正如你所说,在不同屏幕下view大小会改变,而圆角大小不随着view的变化而变化,然后圆形就会变形
gloryDay
2015-05-06 14:23:34 +08:00
@cheng4741 是啊,就是不同大小屏幕,view适配后变化,圆角随大小变化再适应
vincentxue
2015-05-06 14:58:56 +08:00
@cheng4741 怎么设置这个 Aspect Ratio 约束 求教。
gloryDay
2015-05-06 16:11:44 +08:00
@vincentxue 再xib或者storyboard画布右下角有三个和布局有关的button,点击中间那个就有aspect radio,它会根据你要设置的view的长宽比设置一个比,之后该view的尺寸变化就是按照这个比率进行
vincentxue
2015-05-06 16:25:05 +08:00
@gloryDay 原来如此,我是纯代码流。。。很少用那些。
vincentxue
2015-05-06 16:25:24 +08:00
@gloryDay 原来如此,我是纯代码流。。。很少用那些。受教了。
wanganjun
2015-05-06 18:11:23 +08:00
view.layer.cornerRadius = view.frame.size.height / 2 应该就可以了吧
wanganjun
2015-05-06 18:26:25 +08:00
试了一下, 一个高度和宽度比例约束成 1:1 的 view, 把 view.layer.cornerRadius = view.frame.size.height / 2 放到 viewDidLayoutSubviews 里面就可以有你想要的效果了
gloryDay
2015-05-06 19:37:58 +08:00
@wanganjun 难道我打开的方式不对,我刚试了下,还是不行,在计算view.frame.size.height / 2的时候这时的frame是在nib或者storyboard上绘制view时的frame,在屏幕次寸变化时,view新的frame是无法得知的(记得好像是这样子。。)
wanganjun
2015-05-06 20:06:18 +08:00
如果 view.frame.size.height / 2 要用到 view controller 类里面, 就重写viewDidLayoutSubviews 方法, 把计算的代理放到这个方法里面
如果用到 view 类里面, 就重写 layoutSubviews 方法, 把计算代码放到这个方法里面
gloryDay
2015-05-06 21:08:16 +08:00
@wanganjun 谢啦,这么去写真是可以

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/188725

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX