我正在构建一个新的应用程序,并希望在开头有一个“欢迎演练”,其中我有一个故事板,其中包含一系列在UIPageViewController中呈现的图像。我有它加载图像和所有这些都很好,但是只要它们超出“前一个”或“下一个”ViewController,图像就会调整大小。我正在使用Swift
开发。
以下是该问题的视频:http://youtu.be/dXcjjT-8Bk0
我尝试了所有不同的视图模式(纵横比,纵横填充,重绘等),它们的行为都相同。
我正在使用Auto-Layout + Size Classes,因为我希望简化不同屏幕尺寸的开发。我目前的限制使得UIImage的大小合适:
Align Centre X to Superview
Top Space to Top Layout Guide
Bottom Space to Bottom Layout Guide + Equals: 50
我目前正在使用Aspect Fit
,它可以为我提供正确的图片(在他们完成'调整大小行为'之后。
有人可以进一步指导我如何解决这个问题吗?
答案 0 :(得分:14)
在您的视频中,我发现您的UIImageView
总是"已调整大小"在顶部,而不是在底部。这肯定是因为您调用的自动布局约束"顶部空间到顶部布局指南"。当您的UIImageView
视图控制器正在通过滚动页面视图控制器进行转换时,它不知道顶部布局指南的位置,因此其topLayoutGuide.length
为{{1} }。只有在动画完成后,视图控制器才会获得0
的正值。是的,页面视图控制器应该比这更聪明,但它不是。
您可以停止使用顶部布局指南,并相对于其超级视图的顶部进行自动布局约束。或者,您可以继续使用顶部布局指南,但考虑其topLayoutGuide.length
为length
的时间。您可以通过为自己的0
NSLayoutConstraint
制作故事板viewWillLayoutSubviews()
并覆盖ViewController
的出口来实现此目的:
UIImageView
这将始终将@IBOutlet weak var topSpaceToTLG: NSLayoutConstraint!
var parentTLGlength: CGFloat = 20
override func viewWillLayoutSubviews() {
if self.topLayoutGuide.length == 0 {
// Lengthen the autolayout constraint to where we know the
// top layout guide will be when the transition completes
topSpaceToTLG.constant = parentTLGlength
} else {
topSpaceToTLG.constant = 0
}
}
的顶部置于顶部布局指南中,假设状态栏始终为UIImageView
点。在布置子视图之前,它将检查顶部布局指南的长度是否为20
,并相应地调整自动布局约束。过渡动画完成后,将再次触发布局,并且顶部布局指南长度将是预期值,因此约束常量可以返回到0
。比硬编码更好的是在初始化期间传递父视图控制器的确切长度,考虑到顶部布局指南的任何可能的更改,如添加导航栏。
答案 1 :(得分:1)
从视频中我认为你可以通过阻止UIPageViewController在顶部栏下扩展来解决这个问题。
在xcode中,您可以使用页面视图控制器的属性检查器通过取消选择“在顶部栏下延伸边缘”来执行此操作。
这应该可以防止它在状态栏下进行分页,我认为有助于避免你看到的转换。