对应用的view进行自动布局设置时,通过view.layer.cornerRadius处理成圆形的视图,在设置完自动布局后,在不同大小的屏幕下会发生变形,有没有什么办法可以保证圆形的view在自动布局的作用下不变形呢?
1
Elethom 2015-05-05 21:31:32 +08:00 via iPhone 1
如果 constraints 無錯誤不會出現這樣的問題。
|
2
vincentxue 2015-05-05 22:10:53 +08:00 1
如果你在自定义 View 里布局,那么覆盖 `layoutSubviews` 方法,在这里面获取 `view` 的 size,然后设置 `cornerRadius`。
如果你在自定义的 UIViewController 里布局,那么覆盖 `viewDidLayoutSubviews`,余下同上。 另外建议设置 `view.layer.masksToBounds = YES`。 原因: http://stackoverflow.com/questions/11324878/what-is-relation-between-maskstobounds-and-cornerradius |
3
wanganjun 2015-05-05 22:19:14 +08:00 1
一个正方形的view用了cornerRadius才会是圆形, 想让圆形不变形, 把view宽度和高度约束成一样大小应该就可以了
|
6
vincentxue 2015-05-06 10:16:10 +08:00
@black
我觉得和约束没什么关系吧?约束做不到约束圆角大小,并且圆角大小不会根据视图尺寸的变化而自动变化,它只能被设置为一个确定的值。 所以如果要通过设置圆角来把视图变成圆形,并且要适应动态的尺寸变化而保持视图不变形,那么你只能在尺寸变化后再重新设置圆角。 |
7
black 2015-05-06 10:23:30 +08:00
@vincentxue 楼主给的信息不足,无法确定楼主是否在适配不同屏幕大小的同时改变了 view 的 size(这里我认为是没有),如果确实是想不同的屏幕对应不同 size 的 view,那么你说的有道理。
|
8
cheng4741 2015-05-06 13:15:25 +08:00
Aspect Ratio 这个约束就是为了不变形。为什么楼上没人说?
|
9
cheng4741 2015-05-06 13:16:56 +08:00
哦。看错了,你指的是圆角半径随大小适应是吧
|
10
gloryDay OP @vincentxue 正如你所说,在不同屏幕下view大小会改变,而圆角大小不随着view的变化而变化,然后圆形就会变形
|
12
vincentxue 2015-05-06 14:58:56 +08:00
@cheng4741 怎么设置这个 Aspect Ratio 约束 求教。
|
13
gloryDay OP @vincentxue 再xib或者storyboard画布右下角有三个和布局有关的button,点击中间那个就有aspect radio,它会根据你要设置的view的长宽比设置一个比,之后该view的尺寸变化就是按照这个比率进行
|
14
vincentxue 2015-05-06 16:25:05 +08:00
@gloryDay 原来如此,我是纯代码流。。。很少用那些。
|
15
vincentxue 2015-05-06 16:25:24 +08:00
@gloryDay 原来如此,我是纯代码流。。。很少用那些。受教了。
|
16
wanganjun 2015-05-06 18:11:23 +08:00
view.layer.cornerRadius = view.frame.size.height / 2 应该就可以了吧
|
17
wanganjun 2015-05-06 18:26:25 +08:00 1
试了一下, 一个高度和宽度比例约束成 1:1 的 view, 把 view.layer.cornerRadius = view.frame.size.height / 2 放到 viewDidLayoutSubviews 里面就可以有你想要的效果了
|
18
gloryDay OP @wanganjun 难道我打开的方式不对,我刚试了下,还是不行,在计算view.frame.size.height / 2的时候这时的frame是在nib或者storyboard上绘制view时的frame,在屏幕次寸变化时,view新的frame是无法得知的(记得好像是这样子。。)
|
19
wanganjun 2015-05-06 20:06:18 +08:00 1
如果 view.frame.size.height / 2 要用到 view controller 类里面, 就重写viewDidLayoutSubviews 方法, 把计算的代理放到这个方法里面
如果用到 view 类里面, 就重写 layoutSubviews 方法, 把计算代码放到这个方法里面 |
21
wanganjun 2015-05-06 21:57:31 +08:00 1
这位同学,你提问的姿势需要改改,应该把相关的代码和相关的操作都在问题里说出来。现在你已经知道答案了,在回头看看别人的回复,有人直说楼主提供的信息不够,有的回答太宽泛。你在问题里也没有描述清楚你的目的到底是什么,要不是你在回复里面说了园的大小会变,我就一直认为你想要一个固定大小的园。以后应该留心别人是怎么提问的。
尝试别人回答里的说法的时候,也该说清楚你做了什么, 没做什么, 要不是你在回复里说“在计算view.frame.size.height / 2的时候这时的frame是在nib或者storyboard上绘制view时的frame,在屏幕次寸变化时,view新的frame是无法得知的” 我还以为你已经把计算代码放到 viewDidLayoutSubviews 里面去了, 加入你没说计算代码没放到viewDidLayoutSubviews 里,也没说上面那段话,就不会有我在19楼的回复了 |