【问题标题】:UIView. How do I constrain scaling to one dimension only界面视图。如何将缩放限制为仅一维
【发布时间】:2010-11-28 05:31:55
【问题描述】:

我有一个包含 UIView 实例的 UIScrollview 实例。 UIView 只是 UIImageView 实例水平数组的容器。 - 缩放由 UIScrollView 和 UIScrollViewDelegate 提供。我想将缩放限制为仅沿水平轴发生,而根本没有垂直缩放。我该怎么做?

有没有办法,例如,继承 UIView 并覆盖适当的方法来防止垂直缩放?我喜欢这种方法,但我不清楚要重写哪个方法以及该重写的方法实际上应该做什么。

干杯, 道格

【问题讨论】:

  • 所以你想水平拉伸图像?如果你不放大垂直轴,那么图像会变得倾斜

标签: iphone uiview uiscrollview


【解决方案1】:

使用 OS 3.0,您可以告诉缩放缩放到滚动视图中的矩形。我的逻辑中有这个检测水龙头。

CGRect zoomRect = [self zoomRectForScale:newScale withCenter:CGPointMake(tapPoint.x, tapPoint.y) inScrollView:scrollView];
[scrollView zoomToRect:zoomRect animated:YES];

对于另一部分,您必须按照新框架与原始框架的比例来拉伸图像视图,并将其居中于同一中心点。您可以在与缩放动画时间相同的动画中执行此操作,以使其看起来正确,但我认为这是唯一的方法。

【讨论】:

  • 感谢您的惠顾。因此,我确定我了解此方法的用法,如果我使用 scrollview.bounds 作为矩形,我会假设将滚动视图的尺寸固定到滚动视图的尺寸,对吗?干杯,道格
  • coneybeare,实际上,从您的代码 sn-p 的外观来看,您似乎正在处理所有缩放,因为您自己调用 zoomToRect:animated,而不是简单地覆盖它。我宁愿让 UIScrollView 处理所有这些并插入我的约束。您是否会要求我实现自己的平移/缩放功能。您能否提供更多启示。干杯,道格
【解决方案2】:

与我在this answer 中描述的类似,您可以创建一个 UIView 子类并覆盖 -setTransform: 访问器方法来调整 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];
}

【讨论】:

  • 这限制了 Y 轴,但 UIScrollView 的行为 - 在捏合期间 - 就好像两者都被转换了一样。也就是说,内容偏移量和内容大小会增加,以便在两个轴上进行缩放。对我可能遗漏的东西有什么想法吗?
【解决方案3】:

scrollViewDidZoom: 中,根据 zoomScale 调整内容视图的变量,将 zoomScale 重置为 1.0,然后执行 setNeedsDisplay 关于内容视图。在内容视图的 drawRect: 中处理实际缩放(在任何方向上)。

丑陋的细节:

  1. 在缩放过程中,UIScollView 会更改 contentOffsetcontentScale,因此请将之前的值保存在 scrollViewWillBeginZooming: 中并在 scrollViewDidZoom: 中,这样您就可以根据缩放自己计算一个新的 contentOffset

  2. 由于更改 zoomScale 会立即触发另一个 scrollViewDidZoom:,因此您必须在重置 zoomScale 之前(并在之后清除)设置一个 BOOL >。在 scrollViewDidZoom: 开头测试 BOOL,如果为真则返回。

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

【讨论】:

    猜你喜欢
    • 2017-02-27
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    相关资源
    最近更新 更多