UIView的。如何仅将缩放约束到一个维度
-
07-07-2019 - |
题
我有一个包含UIView实例的UIScrollview实例。 UIView只是UIImageView实例的水平数组的容器。 - UIScrollView和UIScrollViewDelegate提供了缩放功能。我想限制缩放仅沿水平轴发生,根本没有垂直的褶皱。我该怎么做?
有没有办法,例如,子类UIView并覆盖适当的方法来防止垂直缩放?我喜欢这种方法,但我不知道要覆盖哪种方法以及覆盖方法应该实际做什么。
干杯, 道格
解决方案
与我在此答案,您可以创建一个UIView子类并覆盖-setTransform:accessor方法来调整UIScrollView将尝试应用于您的UIView的转换。将此UIView设置为托管您的内容子视图,并使其成为UIScrollView的子视图。
在重写的-setTransform:中,您需要接受UIScrollView要应用的变换并进行调整,以便缩放仅在一个方向上生效。来自关于如何构造CGAffineTransform矩阵的文档,我相信以下实现应该将缩放限制在水平方向:
- (void)setTransform:(CGAffineTransform)newValue;
{
CGAffineTransform constrainedTransform = CGAffineTransformIdentity;
constrainedTransform.a = newValue.a;
[super setTransform:constrainedTransform];
}
其他提示
使用OS 3.0,您可以告诉缩放在滚动视图中缩放到矩形。我的逻辑中有这个检测水龙头。
CGRect zoomRect = [self zoomRectForScale:newScale withCenter:CGPointMake(tapPoint.x, tapPoint.y) inScrollView:scrollView];
[scrollView zoomToRect:zoomRect animated:YES];
对于另一部分,您必须按新帧与原始帧的比例拉伸图像视图,并将其居中于同一中心点。你可以在动画中设置与缩放动画相同的时间,使其看起来正确,但我认为这是唯一的方法。
在 scrollViewDidZoom:中,根据 zoomScale 调整内容视图的变量,将 zoomScale 重置为1.0,然后执行 setNeedsDisplay 在内容视图上。在内容视图的 drawRect:中处理实际缩放(无论您想要的方向)。
丑陋的细节:
-
在缩放过程中,UIScollView会更改 contentOffset 和 contentScale ,因此请将这些先前值保存在 scrollViewWillBeginZooming:中在 scrollViewDidZoom:中,您可以根据缩放自行计算新的 contentOffset 。
-
由于更改 zoomScale 会立即触发另一个 scrollViewDidZoom:,您必须在重置 zoomScale 。在 scrollViewDidZoom:的开头测试BOOL,如果为true则返回。
-
您可能需要在缩放过程中禁止 scrollViewDidScroll:(测试BOOL;将其设置为 scrollViewWillBeginZooming:并在中清除它scrollViewDidEndZooming:)因此在缩放过程中会使用您自己的contentOffsets。
醇>