【发布时间】:2013-05-03 14:52:26
【问题描述】:
我有一个 UIScrollView。在这个我有一个 UIView 有一个负原点的框架 - 我需要限制滚动视图,这样你就不能滚动整个视图..
我已经在这个滚动视图中实现了缩放。
缩放时,滚动视图将根据比例调整可缩放视图的大小。但它不会调整原点。
所以如果我有一个框架为 {0, -500}, {1000, 1000} 的视图
我缩小到 0.5 的比例,这将给我一个 {0, -500}, {500, 500}
的新框架显然这不好,整个视图被缩小到滚动视图之外。我希望框架为 {0, -250}, {500, 500}
我可以通过正确调整原点在 scrollViewDidZoom 方法中修复一些问题。这确实有效,但缩放不平滑。在此处更改原点会导致它跳转。
我在 UIView 的文档中注意到它说(关于 frame 属性):
警告:如果变换属性不是恒等变换,则 此属性的值未定义,因此应忽略。
不太清楚为什么会这样。
我处理这个问题的方法有误吗?修复它的最佳方法是什么?
谢谢
以下是我正在使用的测试应用的一些源代码:
在 ViewController..
- (void)viewDidLoad
{
[super viewDidLoad];
self.bigView = [[BigView alloc] initWithFrame: CGRectMake(0, -400, 1000, 1000)];
[self.bigScroll addSubview: bigView];
self.bigScroll.delegate = self;
self.bigScroll.minimumZoomScale = 0.2;
self.bigScroll.maximumZoomScale = 5;
self.bigScroll.contentSize = bigView.bounds.size;
}
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return bigView;
}
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
// bigView.frame = CGRectMake(0, -400 * scrollView.zoomScale,
// bigView.frame.size.width, bigView.frame.size.height);
bigView.center = CGPointMake(500 * scrollView.zoomScale, 100 * scrollView.zoomScale);
}
然后在视图中...
- (void)drawRect:(CGRect)rect
{
// Drawing code
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(ctx, [UIColor whiteColor].CGColor);
CGContextSetStrokeColorWithColor(ctx, [UIColor whiteColor].CGColor);
CGContextFillRect(ctx, CGRectMake(100, 500, 10, 10));
for (int i = 0; i < 1000; i += 100) {
CGContextStrokeRect(ctx, CGRectMake(0, i, 1000, 3));
}
}
请注意,这里的跳跃性在较大的缩放比例下更加明显。在我的真实应用程序中,有更多的绘图和处理在跳转,在任何时候都更加明显。
【问题讨论】:
-
关于变换和框架,文档太模糊了。 Frame 本质上是从边界、中心和应用变换(以及便利设置器)派生的。
frame.size将通过转换矩阵应用的水平和垂直缩放比例缩放bounds.size(因此对于大小为 150x100 的视图,矩阵来自CGAffineTransformMakeScale(3.0, 5.0),frame.size将是 450x500)。对于旋转视图,frame.size将是可以容纳旋转(和缩放)边界的最小直立矩形的大小,以便视图边界的角接触框架的边。 -
你是在模拟器还是在设备上测试?
-
我已经成功复制了您的生涩缩放。我最初的建议并没有解决这个问题。我没有看到它,因为它与偏移的大小有关,我正在测试一个较小的 100 点偏移,它是平滑的。我已经使用
CAShapeLayer制定了一个新的解决方案。请参阅我的更新答案。 -
感谢您的慷慨 - 这就是让我们解谜者继续前进的原因;-j
标签: ios objective-c uiscrollview