And*_*sen 11 zoom uiscrollview ios autolayout swift
我试图让UIScrollView只允许在水平方向上放大.滚动视图使用纯自动布局方法设置.通常的方法是在许多Stack Overflow答案(例如这个)和其他资源中建议的.在自动布局存在之前,我已成功在应用中使用此功能.方法如下:在滚动视图的内容视图中,我覆盖setTransform()并修改传入的变换以仅在x方向上缩放:
override var transform: CGAffineTransform {
get { return super.transform }
set {
var t = newValue
t.d = 1.0
super.transform = t
}
}
Run Code Online (Sandbox Code Playgroud)
我还重置滚动视图的内容偏移量,以便在缩放过程中不会垂直滚动:
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)
}
Run Code Online (Sandbox Code Playgroud)
不使用autolayout时,这非常好用:
但是,使用自动布局时,内容偏移在缩放过程中会导致错误.内容视图仅在水平方向上缩放,但它会垂直移动:
我在GitHub上放了一个示例项目(用于在这个问题中制作视频).它包含两个故事板,Main.storyboard和NoAutolayout.storyboard,它们是相同的,除了Main.storyboard已打开autolayout而NoAutolayout没有.通过更改主界面项目设置在它们之间切换,您可以在两种情况下查看行为.
我真的不想关闭autolayout,因为它解决了以比手动布局要求更好的方式实现我的UI的许多问题.有没有办法在自动布局缩放期间保持垂直内容偏移正确(即零)?
编辑:我已经在示例项目中添加了第三个故事板AutolayoutVariableColumns.storyboard.这会添加一个文本字段来更改GridView中的列数,从而更改其内在内容大小.这更加密切地显示了在提示此问题的真实应用程序中我需要的行为.
想想我明白了.您需要在变换中应用平移以抵消UIScrollView在缩放时尝试执行的居中.
将其添加到GridView:
var unzoomedViewHeight: CGFloat?
override func layoutSubviews() {
super.layoutSubviews()
unzoomedViewHeight = frame.size.height
}
override var transform: CGAffineTransform {
get { return super.transform }
set {
if let unzoomedViewHeight = unzoomedViewHeight {
var t = newValue
t.d = 1.0
t.ty = (1.0 - t.a) * unzoomedViewHeight/2
super.transform = t
}
}
}
Run Code Online (Sandbox Code Playgroud)
要计算变换,我们需要知道视图的未校正高度.在这里,我只是在layoutSubviews()期间抓取帧大小并假设它包含未校正的高度.可能有一些边缘情况不正确; 在视图更新周期中可能是更好的地方来计算高度,但这是基本的想法.
| 归档时间: |
|
| 查看次数: |
1779 次 |
| 最近记录: |