gpt4 book ai didi

ios - 使用自动布局时如何使 UIScrollView 仅在一个方向上缩放

转载 作者:IT王子 更新时间:2023-10-29 05:30:23 28 4
gpt4 key购买 nike

我试图让 UIScrollView 只允许在水平方向上缩放。 ScrollView 是使用纯自动布局方法设置的。通常的方法如许多 Stack Overflow 答案(例如 this one )和 other 中所建议的那样资源。在自动布局存在之前,我已经在应用程序中成功地使用了它。方法如下:在 ScrollView 的内容 View 中,我覆盖了 setTransform(),并将传入的转换修改为仅在 x 方向缩放:

override var transform: CGAffineTransform {
get { return super.transform }
set {
var t = newValue
t.d = 1.0
super.transform = t
}
}

我还重置了 ScrollView 的内容偏移量,使其在缩放期间不会垂直滚动:

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

这在不使用自动布局时效果很好:

Zooming without autolayout

但是,当使用自动布局时,内容偏移量在缩放期间最终会出错。虽然内容 View 仅在水平方向上缩放,但它在垂直方向上移动:

Zooming with autolayout

我放了一个示例项目 on GitHub (用于制作此问题中的视频)。它包含两个 Storyboard,Main.storyboard 和 NoAutolayout.storyboard,除了 Main.storyboard 启用了自动布局而 NoAutolayout 没有启用之外,它们是相同的。通过更改主界面项目设置在它们之间切换,您可以看到两种情况下的行为。

我真的不想关闭自动布局,因为它以比手动布局所需的更好的方式解决了实现我的 UI 的许多问题。有没有办法在使用自动布局缩放期间保持垂直内容偏移正确(即零)?

编辑:我在示例项目中添加了第三个 Storyboard 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
}
}
}

要计算变换,我们需要知道 View 的未缩放高度。在这里,我只是在 layoutSubviews() 期间获取帧大小并假设它包含未缩放的高度。可能有一些边缘情况是不正确的;在 View 更新周期中计算高度可能是一个更好的地方,但这是基本思想。

关于ios - 使用自动布局时如何使 UIScrollView 仅在一个方向上缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35234475/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com