UIImageView在UIPageViewController中调整大小问题

时间:2015-01-06 07:14:46

标签: ios swift uiimageview uipageviewcontroller

我正在构建一个新的应用程序,并希望在开头有一个“欢迎演练”,其中我有一个故事板,其中包含一系列在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,它可以为我提供正确的图片(在他们完成'调整大小行为'之后。

有人可以进一步指导我如何解决这个问题吗?

2 个答案:

答案 0 :(得分:14)

在您的视频中,我发现您的UIImageView总是"已调整大小"在顶部,而不是在底部。这肯定是因为您调用的自动布局约束"顶部空间到顶部布局指南"。当您的UIImageView视图控制器正在通过滚动页面视图控制器进行转换时,它不知道顶部布局指南的位置,因此其topLayoutGuide.length为{{1} }。只有在动画完成后,视图控制器才会获得0的正值。是的,页面视图控制器应该比这更聪明,但它不是。
您可以停止使用顶部布局指南,并相对于其超级视图的顶部进行自动布局约束。或者,您可以继续使用顶部布局指南,但考虑其topLayoutGuide.lengthlength的时间。您可以通过为自己的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中,您可以使用页面视图控制器的属性检查器通过取消选择“在顶部栏下延伸边缘”来执行此操作。

这应该可以防止它在状态栏下进行分页,我认为有助于避免你看到的转换。