UIPageViewController 中的 UIImageView 大小调整问题



我正在构建一个新的应用程序,并希望在开始时有一个"欢迎演练",其中我有一个故事板,其中包含UIPageViewController中显示的一系列图像。我让它加载图像,所有这些都很好,但是每当图像超出"上一个"或"下一个"视图控制器时,它们就会调整大小。我正在使用Swift来开发。

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

我已经尝试了所有不同的视图模式(宽高比拟合、宽高比填充、重绘等),它们的行为都是一样的。

我正在使用自动布局+尺寸类,因为我希望简化不同屏幕尺寸的开发。我当前使UIImage以正确大小显示的约束是:

Align Centre X  to Superview
Top Space to Top Layout Guide
Bottom Space to Bottom Layout Guide + Equals: 50

我目前正在使用Aspect Fit它为我提供了正确的图像(在他们完成"调整大小行为"之后)。

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

从您的视频中,我注意到您的UIImageView总是在顶部而不是底部"调整大小"。 这肯定是因为您的自动布局约束,您称之为"顶部空间到顶部布局指南"。 当您的UIImageView视图控制器通过滚动页面视图控制器转换时,它不知道顶部布局指南在哪里,因此其topLayoutGuide.length0。 只有在动画完成后,视图控制器才会获得 topLayoutGuide.length 的正值。 是的,页面视图控制器应该比这更智能一些,但事实并非如此。
您可以停止使用顶部布局参考线,并相对于其超级视图的顶部进行自动布局约束。或者,您可以继续使用顶部布局指南,但要说明何时length 0。 为此,您可以为情节提要的NSLayoutConstraint创建一个出口,并覆盖包含UIImageView ViewController中的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
    }
}

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

从视频中,我认为您可以通过阻止UIPageViewController在顶部栏下扩展来解决此问题。

在 xcode 中,您可以使用页面视图控制器的属性检查器执行此操作,方法是取消选择"顶栏下的扩展边缘"。

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

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

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

最新更新