2

我希望能够在 UIScrollView 上捏缩放,以便子视图仅在 x 轴上展开/收缩。

我创建了一个 UIScrollView,并使用 addSubview 添加 UIViews。每个 UIView 中都有一个 UILabel 。我应该在数组中保留这些 UIViews 吗?

当我缩放时,我不希望文本大小受到影响,只是每个框的宽度。我想我也需要最小和最大缩放级别。

Apple 的garageband 应用程序中使用了类似的东西。知道怎么做吗?

1.
-------------------------
|                       |
|  ------   -------  -- |
|  |  1 |   |  2  |  | 3|   < 10 UIView subclass boxes on a UIScollView,
|  |    |   |     |  |  |     with a UILabel in each UIView
|  ------   -------  -- |
|                       |
-------------------------

2.
-------------------------
|                       |
|  ----------   --------|  
|  | 1 more |   | 2     |    < During zoom-in pinch, boxes are stretched
|  |        |   |       |      in x-axis only. Label remains same font size
|  ----------   --------|      and left aligned, showing more text
|                       |
-------------------------
4

2 回答 2

4

(连续第二次,我用一个比原来的前提简单得多的答案来回答我自己的 Q。我想在提问之前我应该​​总是从另一个角度看..)

对于我想要缩放的 UIView(仅限 x 轴),我将视图子类化并添加此方法:

- (void)setTransform:(CGAffineTransform)newValue;
{
    newValue.d = 1.0;
    [super setTransform:newValue];
}

当然,我遇到了添加到此 UIView 的 UILabel 的问题。标签被拉伸。所以答案是干脆不添加到UIView中,而是直接添加到滚动视图中。然后,如果您有几个浮点数作为属性,代表标签的原始 x 原点和宽度,您可以在滚动视图缩放时使用滚动视图的比例计算这些:

-(void)scrollViewDidZoom:(UIScrollView *)scrollView
{
    float scale = self.scrollView.zoomScale;
    self.label.frame = CGRectMake(self.originalXorigin*scale, self.label.frame.origin.y, self.originalWidth*scale, self.label.frame.size.height);
}
于 2012-06-17T03:26:12.950 回答
1

我应该在数组中保留这些 UIViews 吗?

这绝对是个人喜好或设计约束决定。如果您必须在循环中更新这些视图,或者提供某种简单的访问来修改它们的内容,那么是的,它们应该存储在某种介质中(是数组还是字典,由您决定)。

我想我也需要最小和最大缩放级别。

那么你运气不好,有一个普通的 old UIPinchGestureRecognizer。但老实说,在条件检查中对您的视图进行编码并不难?

Apple 的garageband 应用程序中使用了类似的东西。知道怎么做吗?

当然,制作一个UIPinchGestureRecognizer对象并使用scale属性来确定一个 x 因子,然后将其CGAffineTransform()用于UIView.

于 2012-06-14T18:39:38.260 回答