UIPageViewController 中的 UIImageView 调整大小问题
Posted
技术标签:
【中文标题】UIPageViewController 中的 UIImageView 调整大小问题【英文标题】:UIImageView resizing issue in UIPageViewController 【发布时间】:2015-01-06 07:14:45 【问题描述】:我正在构建一个新应用程序,并希望在开始时有一个“欢迎演练”,其中我有一个故事板,其中包含一系列图像,显示在 UIPageViewController 中。我让它加载图像,所有这些都很好,但是只要图像超出“上一个”或“下一个”视图控制器,就会调整图像大小。我正在使用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
,它为我提供了正确的图像(在他们完成“调整大小行为”之后。
谁能进一步指导我如何解决这个问题?
【问题讨论】:
【参考方案1】:从您的视频中,我注意到您的 UIImageView
始终在顶部“调整大小”,而不是在底部。这肯定是因为您调用“顶部空间到顶部布局指南”的自动布局约束。当您的UIImageView
的视图控制器正在通过您的滚动页面视图控制器进行转换时,它不知道顶部布局指南在哪里,所以它的topLayoutGuide.length
是0
。只有在动画完成后,视图控制器才会获得topLayoutGuide.length
的正值。是的,页面视图控制器应该比这更聪明一点,但事实并非如此。
您可以停止使用顶部布局指南并相对于其父视图的顶部进行自动布局约束。或者您可以继续使用顶部布局指南,但要考虑到 length
是 0
的时间。您可以通过为情节提要的 NSLayoutConstraint
创建一个出口并在包含您的 UIImageView
s 的 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
。比硬编码值更好的是在初始化期间传递父视图控制器的确切长度,考虑到顶部布局指南的任何可能更改,例如添加导航栏。
【讨论】:
其他人有这个问题吗?这对我不起作用。我在后台有一个全屏 imageView,它仍然可以。 不幸的是,这并没有考虑旋转:在手机的横向中,顶部布局指南的长度正确 0。找到父 VC 的指南长度似乎是唯一的解决方案,虽然很恶心。【参考方案2】:从视频中,我认为您可以通过阻止 UIPageViewController 延伸到顶栏下方来解决此问题。
在 xcode 中,您可以通过取消选择 Extend Edges Under Top Bars 来使用页面视图控制器的属性检查器来执行此操作。
这应该可以防止它在状态栏下翻页,我认为这有助于避免您看到的开关。
【讨论】:
【参考方案3】:我发现我的问题是当视图控制器开始制作动画时,顶部和底部布局指南没有高度。右边距和左边距也没有。当视图完成动画时,它们都收到了高度或宽度,我的视图会自行调整大小。 我通过在我的对象和它们的超级视图之间添加垂直约束而不是顶部/底部布局指南来解决我的项目中的这个问题。我还必须更改我的水平约束以忽略侧边距。
我遇到的最后一个问题是我必须自己考虑状态栏。它可能存在也可能不存在,也可能是双栏,就像您使用地图时一样。
【讨论】:
以上是关于UIPageViewController 中的 UIImageView 调整大小问题的主要内容,如果未能解决你的问题,请参考以下文章
UIPageViewController 中的 UIScrollView 滚动了多少?
如何删除 UIPageViewController 中的 previousViewControllers
UIPageViewController 中的脊椎到底是啥?