【发布时间】:2016-05-16 00:57:10
【问题描述】:
我正在尝试使 UIScrollView 只允许在水平方向上缩放。滚动视图是使用纯自动布局方法设置的。通常的方法是在许多堆栈溢出答案(例如this one)和other 资源中所建议的。在自动布局存在之前,我已经在应用程序中成功使用了它。做法如下:在滚动视图的内容视图中,我覆盖setTransform(),并将传入的transform修改为只在x方向缩放:
override var transform: CGAffineTransform {
get { return super.transform }
set {
var t = newValue
t.d = 1.0
super.transform = t
}
}
我还重置了滚动视图的内容偏移量,使其在缩放期间不会垂直滚动:
func scrollViewDidZoom(scrollView: UIScrollView) {
scrollView.contentSize = CGSize(width: scrollView.contentSize.width, height: scrollView.frame.height)
scrollView.contentOffset = CGPoint(x: scrollView.contentOffset.x, y: 0.0)
}
这在不使用自动布局时效果很好:
但是,当使用自动布局时,内容偏移在缩放过程中最终会出错。虽然内容视图仅在水平方向缩放,但它会垂直移动:
我放了一个示例项目on GitHub(用于制作此问题中的视频)。它包含两个故事板,Main.storyboard 和 NoAutolayout.storyboard,除了 Main.storyboard 启用了自动布局而 NoAutolayout 没有之外,它们是相同的。通过更改主界面项目设置在它们之间切换,您可以看到两种情况下的行为。
我真的不想关闭自动布局,因为它以比手动布局所需的更好的方式解决了许多实现 UI 的问题。有没有办法在使用自动布局进行缩放时保持垂直内容偏移正确(即零)?
编辑:我在示例项目中添加了第三个故事板 AutolayoutVariableColumns.storyboard。这会添加一个文本字段来更改 GridView 中的列数,从而更改其固有内容大小。这更接近地显示了我在提示此问题的真实应用中需要的行为。
【问题讨论】:
标签: ios swift uiscrollview autolayout zooming