最近我正在为我的应用编写照片扩展程序。
但是,我发现扩展程序的故事板无法正确识别每个视图的框架。
例如我在故事板中设置了这个:
然而,当我运行模拟器时,它显示:
另外,当我在didMoveToWindow()
中检查自定义视图的框架时,它也显示错误的框架:
(66.0,512.0,468.0,30.0)
实际上,自定义滑块在我应用的故事板中运行良好。
我怎么了?
Ps:此处的滑块是自定义UIView
而不是UISlider
修改
通过在故事板上将类替换为UIView(带颜色),我现在确定它不是Autolayout约束的问题,因为一切正常。
然后我发现问题在于我在初始化这个自定义的UIView的过程中,我在方法didMoveToWindow()
中设置我的旋钮和条,其框架取决于View的框架。当我在didMoveToWindow()
顶部打印视图的框架时,框架根本不正确。
因此,在使用Autolayout时,我无法在其didMoveToWindow()
方法中获得UIView的正确框架?
但是在我原来的应用程序中工作正常。所以我很困惑。
EDIT2
我使用延迟功能在5秒后重新检查其帧:
func delay(#seconds: Double, completion:()->()) {
let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64( Double(NSEC_PER_SEC) * seconds ))
dispatch_after(popTime, dispatch_get_main_queue()) {
completion()
}
}
override func didMoveToWindow() {
delay(seconds: 5, {
println(self.frame)
})
}
5秒后,框架正确!因此,当调用该方法时,尚未应用约束。所以现在我需要做的是当它的superView的ViewController完成ViewDidLoad
时在UIView中回调。
EDIT3
我找到了答案。我应该在UIView的layoutSubviews()
方法中设置subView的框架。在这种情况下,我可以在使用Autolayout时获得正确的框架。
实际上,在应用了UIView的约束之后,它会调用它的layoutSubviews()
答案 0 :(得分:1)
阅读本条=>它可以帮助你很多:)
learn-to-love-auto-layout 或强> 如果你想要LOVE AUTO LAYOUT… PROGRAMMATICALLY
答案 1 :(得分:0)
不是给出尾随和前导空格,而是应用这个简单的约束。
就是这样!你已经完成了。