V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
gloryDay
V2EX  ›  iDev

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

  •  
  •   gloryDay · 2015-05-05 21:28:15 +08:00 · 4934 次点击
    这是一个创建于 3285 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    21 条回复    2015-05-06 21:57:31 +08:00
    Elethom
        1
    Elethom  
       2015-05-05 21:31:32 +08:00 via iPhone   ❤️ 1
    如果 constraints 無錯誤不會出現這樣的問題。
    vincentxue
        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
    wanganjun
        3
    wanganjun  
       2015-05-05 22:19:14 +08:00   ❤️ 1
    一个正方形的view用了cornerRadius才会是圆形, 想让圆形不变形, 把view宽度和高度约束成一样大小应该就可以了
    black
        4
    black  
       2015-05-05 22:41:23 +08:00
    @Elethom 非常赞同,lz 的问题很明显是 constrains 设置得不对。
    gloryDay
        5
    gloryDay  
    OP
       2015-05-05 23:00:36 +08:00
    @black 重新复习了遍autolayout,明的再设置下
    vincentxue
        6
    vincentxue  
       2015-05-06 10:16:10 +08:00
    @black

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

    所以如果要通过设置圆角来把视图变成圆形,并且要适应动态的尺寸变化而保持视图不变形,那么你只能在尺寸变化后再重新设置圆角。
    black
        7
    black  
       2015-05-06 10:23:30 +08:00
    @vincentxue 楼主给的信息不足,无法确定楼主是否在适配不同屏幕大小的同时改变了 view 的 size(这里我认为是没有),如果确实是想不同的屏幕对应不同 size 的 view,那么你说的有道理。
    cheng4741
        8
    cheng4741  
       2015-05-06 13:15:25 +08:00
    Aspect Ratio 这个约束就是为了不变形。为什么楼上没人说?
    cheng4741
        9
    cheng4741  
       2015-05-06 13:16:56 +08:00
    哦。看错了,你指的是圆角半径随大小适应是吧
    gloryDay
        10
    gloryDay  
    OP
       2015-05-06 14:22:35 +08:00
    @vincentxue 正如你所说,在不同屏幕下view大小会改变,而圆角大小不随着view的变化而变化,然后圆形就会变形
    gloryDay
        11
    gloryDay  
    OP
       2015-05-06 14:23:34 +08:00
    @cheng4741 是啊,就是不同大小屏幕,view适配后变化,圆角随大小变化再适应
    vincentxue
        12
    vincentxue  
       2015-05-06 14:58:56 +08:00
    @cheng4741 怎么设置这个 Aspect Ratio 约束 求教。
    gloryDay
        13
    gloryDay  
    OP
       2015-05-06 16:11:44 +08:00
    @vincentxue 再xib或者storyboard画布右下角有三个和布局有关的button,点击中间那个就有aspect radio,它会根据你要设置的view的长宽比设置一个比,之后该view的尺寸变化就是按照这个比率进行
    vincentxue
        14
    vincentxue  
       2015-05-06 16:25:05 +08:00
    @gloryDay 原来如此,我是纯代码流。。。很少用那些。
    vincentxue
        15
    vincentxue  
       2015-05-06 16:25:24 +08:00
    @gloryDay 原来如此,我是纯代码流。。。很少用那些。受教了。
    wanganjun
        16
    wanganjun  
       2015-05-06 18:11:23 +08:00
    view.layer.cornerRadius = view.frame.size.height / 2 应该就可以了吧
    wanganjun
        17
    wanganjun  
       2015-05-06 18:26:25 +08:00   ❤️ 1
    试了一下, 一个高度和宽度比例约束成 1:1 的 view, 把 view.layer.cornerRadius = view.frame.size.height / 2 放到 viewDidLayoutSubviews 里面就可以有你想要的效果了
    gloryDay
        18
    gloryDay  
    OP
       2015-05-06 19:37:58 +08:00
    @wanganjun 难道我打开的方式不对,我刚试了下,还是不行,在计算view.frame.size.height / 2的时候这时的frame是在nib或者storyboard上绘制view时的frame,在屏幕次寸变化时,view新的frame是无法得知的(记得好像是这样子。。)
    wanganjun
        19
    wanganjun  
       2015-05-06 20:06:18 +08:00   ❤️ 1
    如果 view.frame.size.height / 2 要用到 view controller 类里面, 就重写viewDidLayoutSubviews 方法, 把计算的代理放到这个方法里面
    如果用到 view 类里面, 就重写 layoutSubviews 方法, 把计算代码放到这个方法里面
    gloryDay
        20
    gloryDay  
    OP
       2015-05-06 21:08:16 +08:00
    @wanganjun 谢啦,这么去写真是可以
    wanganjun
        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楼的回复了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2049 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:38 · PVG 09:38 · LAX 18:38 · JFK 21:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.