ScrollView关于contentSize在缩放功能的问题

最近在弄ScrollView的缩放功能,发现了一些问题,做了一些测试,总结一些吧。

    _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
    _scrollView.maximumZoomScale=5;
    _scrollView.minimumZoomScale=1;
    _scrollView.delegate=self;
    _scrollView.bounces = NO;
    _scrollView.bouncesZoom = NO;

//缩放对应的view
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
    //设置这个后,初始化的时候,contentSise会跟imgView.frame.size大小一样,缩放时候,imgView.bound的大小不会改变,只会改变frame
    return _imgView;
}

结论如下:

1、开始创建ScrollView的时候,contentSize为0,第一次操作缩放是,contentSize会配置它的初始大小等于imgView.frame.size
2、当使用_scrollView的缩放功能的时候,其实缩放的是contentSize,然后对应同时改变mgView.frame.size,记住imgView.bound的大小不会改变,只会改变frame
3、contentView会根据当前缩放的view,改变它对应的contentOffset,来适应view。这点不好理解。view是添加在scollView上的,而不是contentView。举个例子吧,我想view一直在中间缩放:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
    
    CGFloat xcenter = scrollView.width/2 , ycenter = scrollView.height/2;
    self.imgView.center = CGPointMake(xcenter, ycenter);
}

这样确实是居中了,但会有个问题:放大超出边界后,往右和往下拖动都无效,图片感觉被截了。
原因是,contentOffset的x,y都是0,那么前面的操作肯定滑动不了。因为view本身就居中于scrollView,缩放后,位置一直是这个,还在手指合理范围,所以content不会调整。
正确做法是:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
    
    CGFloat xcenter = scrollView.width/2 , ycenter = scrollView.height/2;
    xcenter = scrollView.contentSize.width > scrollView.frame.size.width ? scrollView.contentSize.width/2 : xcenter;
    ycenter = scrollView.contentSize.height > scrollView.frame.size.height ? scrollView.contentSize.height/2 : ycenter;
    self.imgView.center = CGPointMake(xcenter, ycenter);
},
这样,感觉是把view靠右边设置了,缩放会一直往右边移动。但运动是相对的,为了使view在缩放手指的范围内,显得不突兀,那么也可以通过调整content的位置,让它往左移动。
4、当view的竖向即将大于scollView的高度后,有可能会有一个向上跳动的动作,有可能是iphoneX才有的吧,暂时未知原因。
5、contentView(不知道这样叫对不对),反正只是用它来控制滑动。默认的位置x=0,y=0。它的缩放,只会按比例往下跟往右延伸

转载于:https://www.jianshu.com/p/c50aca9036ad

猜你喜欢

转载自blog.csdn.net/weixin_34198797/article/details/91084942