最近在弄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);
},
缩放的时候,系统会自动调整contentView的contentOffset位置,让它居中。所以我们只要跟随contentView变化,把我们缩放的view动态设置到contentView的中间就可以了。
4、当view的竖向即将大于scollView的高度后,有可能会有一个向上跳动的动作,有可能是iphoneX才有的吧,暂时未知原因。(影响不大)
5、contentView(不知道这样叫对不对),反正只是用它来控制滑动。默认的位置x=0,y=0。它的缩放,只会按比例往下跟往右延伸
网友评论