我有一个包含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:中处理实际缩放(无论您想要的方向)。

丑陋的细节:

  1. 在缩放过程中,UIScollView会更改 contentOffset contentScale ,因此请将这些先前值保存在 scrollViewWillBeginZooming:中在 scrollViewDidZoom:中,您可以根据缩放自行计算新的 contentOffset

  2. 由于更改 zoomScale 会立即触发另一个 scrollViewDidZoom:,您必须在重置 zoomScale 。在 scrollViewDidZoom:的开头测试BOOL,如果为true则返回。

  3. 您可能需要在缩放过程中禁止 scrollViewDidScroll:(测试BOOL;将其设置为 scrollViewWillBeginZooming:并在中清除它scrollViewDidEndZooming:)因此在缩放过程中会使用您自己的contentOffsets。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top