【问题标题】:UIScrollView -zoomToRect:animated: and CGPoint conversion between viewsUIScrollView -zoomToRect:animated: 与视图间的CGPoint转换
【发布时间】:2013-11-21 19:46:29
【问题描述】:

我有一个 UIScrollView A 和一个子视图 B,(它本身是 @987654322 的 contentView D 的子视图@ -- 所以 BNOT 滚动视图的 contentView A) 有一个子视图,我们称之为 C

+------------------------+
| A                      |
|                        |
|  +-------------------+ |
|  |D (=contentView)   | |
|  |  +-----------+    | |
|  |  | B         |    | |
|  |  |   +--+    |    | |
|  |  |   |C |    |    | |
|  |  |   +--+    |    | |
|  |  +-----------+    | |
|  +-------------------+ |
+------------------------+

我希望 scrollView 能够精确缩放,以便 C 填满我的 iPhone 屏幕,或者至少尽可能大地显示给我。 我无法理解缩放之前滚动视图的zoomScale 的方式(假设我在滚动视图已经放大并且缩放比例为 2.45 时进行放大)。 那么第一个问题是,zoomScale 会影响 UIScrollView 放大到的矩形吗?

我的第二个问题是关于 CGPoint 转换的。 iOS 有一些内置函数可以在视图之间转换 CGPoints/CGRects,但我根本无法从给定的引用中产生任何有成效的东西。

这是我打算做的:

1) 将C的原点转换为A的坐标系:

CGPoint originConvertedToAsCoordinateSystem = [self convertPoint:C.frame.origin toView:A];

2) 缩放到 C 给定原点的矩形:

//shortened for the purpose of readability
CGPoint p = originConvertedToAsCoordinateSystem;

CGRect zoomRect = CGRectMake(p.x,p.y,C.frame.size.width,C.frame.size.height);
[A zoomToRect:zoomRect animated:YES];

在我给定的示例中,我忽略了 A'szoomScale 的值,因为我真的不知道是乘还是除该值。

【问题讨论】:

  • 不确定我是否理解您的问题。请注意:要缩放的矩形必须在内容视图的坐标空间中(我假设它是子视图 B),因此您不需要转换 C.frame,只需按原样使用即可。
  • @yurish 我只想让滚动视图A 缩放到视图的原点C。我不能“只使用C 的框架”,因为它的框架位于B 的坐标系中。所以我必须将C 的原点转换为A 的坐标空间。
  • 抱歉,但是“缩放到原点”(这是点,而不是矩形)对我来说没有多大意义。你也读过 zoomToRect 方法的描述吗?它明确指出“矩形应位于 viewForZoomingInScrollView: 返回的视图的坐标空间中”。您的情况下的视图必须是 B,而不是您尝试做的滚动视图本身。无论如何,请参阅答案。
  • @yurish 哦,对不起,你是对的...但问题是,B 真的不是内容视图,而是内容视图的子视图...
  • @yurish 我的contentView(我在viewForZoomingInScrollView 中返回)是一个视图DB 是它的子视图。我更新了我的问题...

标签: ios iphone objective-c uiscrollview


【解决方案1】:

问题更新后更新:

如果您想以编程方式缩放和滚动滚动视图,以便子视图 C 填充整个滚动视图矩形(滚动视图边界),您需要在视图控制器中执行以下操作:

CGRect rectToZoom = [self.D convertRect:self.C.frame fromView:self.B];

[self.scrollView zoomToRect:rectToZoom animated:YES];

这是假设您返回视图 D 作为要缩放的视图:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return self.D;
}

滚动视图的maximumZoomScale、contentSize和contentInset属性必须足够大以允许滚动和缩放(检查:尝试手动执行您想要的操作,看看是否可行)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多