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