初始缩放后,UIScrollView滚动太远

时间:2011-09-05 10:47:55

标签: iphone ios uiscrollview scroll zoom

我的UIScrollView填充了大量内容,然后使用“setZoomScale:animated”进行缩放,使其适合滚动视图框架。视图显示正确缩小,并正确定位在滚动视图中。但是,用户可以在内容之外滚动(滚动视图背景颜色显示)。看起来他可以滚动到原始内容大小(就好像内容没有缩小)。 奇怪的是,在用户第一次手动缩放后,一切正常,滚动视图再次被限制为内容大小。

我搜索了网页,浏览了Apple文档和示例,但找不到任何人遇到同样的问题。 Apple的例子似乎和我一样。

我的内容是一个自定义视图,源自UIView,其CALayer被CATiledLayer取代(如Apple示例中所示)。我在drawLayer中做的绘图:inContext:。

以下是MyScrollViewController的代码片段:

- (void)loadView {
    CGRect frame = [UIScreen mainScreen].applicationFrame;
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame];
    scrollView.maximumZoomScale=1.0;
    scrollView.delegate = self;

    ... setup theContentView ...

    scrollView.contentSize = theContentView.bounds.size;
    scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20);
    [scrollView addSubview:theContentView];
    self.view = scrollView;

    double zoomScale = 0.5; // hardcoded for testing
    [scrollView setZoomScale:zoomScale animated:NO];
NSLog(@"zoomscale=%g contentview=%@ contentsize=%@", zoomScale, NSStringFromCGSize(theContentView.bounds.size), NSStringFromCGSize(scrollView.contentSize));

    [scrollView release];
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return theContentView;
}

NSLog语句显示正确设置的contentSize和zoomscale ......

希望有一些明显的东西让我失踪......

2 个答案:

答案 0 :(得分:3)

我最终在下一个runloop(而不是直接来自loadView)上设置了zoomScale,这有效:

- (void) loadView {
    CGRect frame = [UIScreen mainScreen].applicationFrame;
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame];
    scrollView.maximumZoomScale=1.0;
    scrollView.delegate = self;

    ... setup theContentView ...

    scrollView.contentSize = theContentView.bounds.size;
    scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20);
    [scrollView addSubview:theContentView];
    self.view = scrollView;

    // set the zoom level on the next runloop invocation
    [self performSelector:@selector(initialZoom) withObject:nil afterDelay:0];

    [scrollView release];
}

- (void) initialZoom {
    double zoomScale = 0.5; // hardcoded for testing
    UIScrollView *scrollView = (UIScrollView *) self.view;
    [scrollView setZoomScale:zoomScale animated:NO];
}

Maverick1st建议的另一种可能性是从viewDidAppear而不是LoadView设置缩放比例。该方法的另一个优点是它显示了缩放动画,向用户指示视图以缩放状态开始。

- (void) viewDidAppear {
    double zoomScale = 0.5; // hardcoded for testing
    UIScrollView *scrollView = (UIScrollView *) self.view;
    [scrollView setZoomScale:zoomScale animated:YES];
}

答案 1 :(得分:1)

我是新手,但您可以尝试剪切子视图。我创建了一个带有界面构建器的滚动视图,在属性检查器中有一个复选框剪辑子视图,所以我认为你应该这样做,只能以编程方式。希望有所帮助。