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

时间:2017-10-29 09:50:33

标签: swift uiview uisegmentedcontrol xcode9 swift4

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

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

2 个答案:

答案 0 :(得分:3)

UIControl 继承自 UIView 类,您可以使用 layoutSubviews 函数在应用约束后获取正确的框架 < / p>

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

答案 1 :(得分:0)

看起来你在设置约束之前得到了框架,尝试获取框架 viewDidLayoutSubviews viewDidAppear 事件

下面是事件和约束状态:

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