UIScrollView在初始缩放后滚动太远

5
我的UIScrollView中包含了大量的内容,并使用“setZoomScale:animated”进行缩放,以适应scrollview框架。视图看起来已经正确缩小,并且在scrollview中正确定位。然而,用户可以滚动到内容区域之外(scrollview背景颜色显示)。似乎他可以滚动到原始内容大小(好像内容没有缩小)。
奇怪的是,用户第一次手动缩放后,一切都正常工作,scrollview再次受限于内容大小。
我在网上搜索过,并查阅了Apple文档和示例,但找不到任何人有同样的问题。苹果的示例似乎展示了与我的情况相同的内容。
我的内容是从UIView派生的自定义视图,其CALayer被CATiledLayer替换(如苹果的示例所示)。我自己通过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...

希望有什么明显的东西我没有注意到...


有人解决了这个问题吗?我也遇到了同样的问题,只不过是相反的情况。我的ScrollView太小了,无法显示其中的图像(我无法向下滚动到图像底部)。但是,缩放一次后一切都正常了。 - Maverick1st
1
我最终在下一个runloop上设置了zoomScale(而不是直接从loadView),这样做起作用了:“[self performSelector:@selector(initialZoom)withObject:nil afterDelay:0];”。但是我也重写了很多其他东西,所以我不确定那是否是唯一需要的。 - fishinear
我最终也有了同样的想法,而且它完美地运行了。在viewDidAppear中设置zoomscale的一个额外好处是,用户可以看到动画缩放,从而知道他正在查看的图像是可缩放的 :) - Maverick1st
顺便说一下,您介意把这个作为答案写下来并标记为正确答案吗?这样其他用户可以在第一时间看到问题已经得到解答了。 - Maverick1st
@Maverick1st 完成了。你是直接在 viewDidAppear 中设置了 zoomscale,还是通过 performSelector 进行的?那么我也可以将其添加到答案中。 - fishinear
我直接在 viewDidAppear 中设置它 - Maverick1st
2个回答

3
我最终在下一个 runloop 上设置了 zoomScale(而不是直接从 loadView 设置),这样做起来就行了:
- (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中设置zoomscale,而不是LoadView。这种方法的额外优点是它显示了一个缩放动画,向用户表明视图从一个缩放状态开始。
- (void) viewDidAppear {
    double zoomScale = 0.5; // hardcoded for testing
    UIScrollView *scrollView = (UIScrollView *) self.view;
    [scrollView setZoomScale:zoomScale animated:YES];
}

1

我对此很新,但你可以尝试剪切子视图。我使用界面构建器创建了一个滚动视图,在属性检查器中有一个名为“剪切子视图”的复选框,所以我认为你应该像那样进行编程。希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接