【问题标题】:Get the actual width of a subview at runtime (Swift 4)在运行时获取子视图的实际宽度(Swift 4)
【发布时间】:2018-04-10 11:06:04
【问题描述】:

Xcode 提供了一个分段控件,但我想要一个带有选择器的自定义分段控件,当您按下它时,该选择器会滑动到每个按钮。我为此使用了 3 个视图。一个是“主”视图,我添加了两个子视图。其中一个子视图是选择器(UIView),另一个是包含按钮的 UIStackView。我使用selector = UIView(frame: CGRect(x: 0, y: 0, width: self.frame.width/CGFloat(buttons.count), height: self.frame.height)) 作为选择器的大小。当我使用我的课程在故事板中查看时,一切看起来都很好。我为超级视图设置了约束,但是当我使用模拟器启动应用程序时,我得到的是在情节提要中设置的宽度,而不是运行时self.frame.width 的实际宽度。

我使用this 视频作为模板。 here 是我运行应用程序时的样子。选择器没有一个按钮那么大,这就是为什么我会在正确的网站上看到这个白条。

【问题讨论】:

    标签: swift uiview uisegmentedcontrol xcode9 swift4


    【解决方案1】:

    UIControl 继承自 UIView 类,您可以使用 layoutSubviews 函数在应用约束后获取正确的 Frame

    override func layoutSubviews() {
         super.layoutSubviews()
        //self.frame will be correct here
    }
    

    参考:

    https://developer.apple.com/documentation/uikit/uiview/1622482-layoutsubviews https://developer.apple.com/documentation/uikit/uicontrol

    【讨论】:

    • 谢谢,帮帮我!此外,当手机旋转时会调用layoutSubviews(),因此它会自动调整宽度。你知道当你在情节提要上做一些调整时这个方法是否也会被调用吗?因为当我在那里调整视图大小时,它也会改变选择器的宽度。
    • 好的,所以它对我有用,但是一天之后,每次我在身份检查器 Xcode 9 中选择我的服装类时都会冻结。当我删除函数layoutSubviews 时,它不会冻结。
    • 确保你在函数覆盖函数 layoutSubviews() 之前有“覆盖”这个词,并确保你正在调用 super.layoutSubviews()
    • 我在函数之前写了'override'并调用了super.layoutSubviews()。还是很冷
    • 更新 - 当我首先向视图添加约束然后添加 Xcode 方法时不会冻结。但是当我第一次在我的代码中添加该方法时,Xcode 会冻结。有谁知道为什么?
    【解决方案2】:

    看起来您在设置约束之前获取框架,尝试获取框架 viewDidLayoutSubviewsviewDidAppear 事件

    以下是事件和约束状态:

    • viewDidLoad -- 尚未设置约束
    • viewWillAppear -- 尚未设置约束
    • viewWillLayoutSubviews -- 正在设置约束
    • viewDidLayoutSubviews -- 已设置约束
    • viewDidAppear -- 已设置约束

    【讨论】:

    • 我不能这样做,因为我的类 UICostumSegmentedController 继承自 UIControl 而不是 UIViewController,这意味着它没有这些功能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2011-08-18
    • 1970-01-01
    相关资源
    最近更新 更多