UIPageViewController 中的 UIImageView 大小调整问题

UIImageView resizing issue in UIPageViewController

我正在构建一个新应用程序,希望在开头有一个 "Welcome walkthrough",其中我有一个故事板,其中包含一系列图像,显示在 UIPageViewController 中。我让它加载图像,所有这些都很好,但是只要图像超出 "previous" 或 "next" ViewController,就会调整图像的大小。我正在使用 Swift 开发。

这是问题的视频:http://youtu.be/dXcjjT-8Bk0

我已经尝试了所有不同的视图模式(Aspect fit、aspect fill、redraw 等),它们的行为都一样。

我正在使用 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,它为我提供了正确的图像(在他们完成 'resizing behaviour' 之后。

谁能进一步指导我如何解决这个问题?

从你的视频中,我注意到你的 UIImageView 总是 "resized" 在顶部,而不是在底部。这肯定是因为您调用 "Top Space to Top Layout Guide" 的自动布局约束。当您的 UIImageView 的视图控制器正在通过您的滚动页面视图控制器进行转换时,它不知道顶部布局指南在哪里,因此它的 topLayoutGuide.length0。只有在动画完成后,视图控制器才会获得 topLayoutGuide.length 的正值。是的,页面视图控制器应该比这更聪明,但事实并非如此。
您可以停止使用顶部布局指南并相对于其父视图的顶部进行自动布局约束。或者您可以继续使用顶部布局指南,但要考虑到 length0 的情况。您可以通过为故事板的 NSLayoutConstraint 创建一个出口并在包含您的 UIImageViewViewController 中覆盖 viewWillLayoutSubviews() 来做到这一点:

@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
    }
}

假设状态栏始终为 20 点,这将始终将 UIImageView 的顶部放在顶部布局指南中。在布置子视图之前,它会检查顶部布局指南长度是否为 0 并相应地调整您的自动布局约束。过渡动画完成后,再次触发布局,顶部布局引导长度将是预期值,因此约束常量可以回到0。比硬编码更好的是在初始化期间传递父视图控制器的确切长度,考虑到顶部布局指南的任何可能更改,如添加导航栏。

根据视频,我认为您可以通过防止 UIPageViewController 在顶部栏下延伸来解决此问题。

在 xcode 中,您可以使用页面视图控制器的属性检查器通过取消选择“在顶部栏下延伸边缘”来执行此操作。

这应该可以防止它在状态栏下翻页,我认为这有助于避免您看到的切换。

我发现我的问题是当视图控制器开始动画时顶部和底部布局指南没有高度。右边距和左边距也没有。当视图完成动画后,它们都会收到一个高度或宽度,我的视图会自行调整大小。 我通过在我的对象和它们的超级视图之间添加垂直约束而不是 Top/Bottom 布局指南来解决我项目中的这个问题。我还必须更改水平约束以忽略边距。

我遇到的最后一个问题是我必须自己考虑状态栏。它可能存在也可能不存在,或者它可能是一个双栏,就像您使用地图时一样。