获取运行时子视图的实际宽度(Swift 4)

Get the actual width of a subview at runtime (Swift 4)

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

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

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

以下是事件和约束状态:

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

UIControl 继承自 UIView class 可以使用 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