IOS ScrollView放大缩小点击位置并居中

项目中的一个优化案例,提升用户体验,对地铁线路图点击放大、缩小,并且点击位置居中;

正常ScrollView 我们点击某一点比如屏幕右侧,想要点的位置向左移动到中心位置,很简单只有算出该点位置距中心位置的距离:point.x - contentOffset.x -SCREEN_WIDTH*0.5,然后问设置contentOffset.x+相应的距离即可。上下也同理.

 但是这里要处理的双击 放大的同时,也要实现上面的效果。经过单步调试,查看

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 代理方法的log:

    NSLog(@"%f--%f -%f",scrollView.contentOffset.x,scrollView.contentOffset.y,scrollView.zoomScale);

发现移动移动图上的某一点到达屏幕的边界contentOffset.x变化与缩放倍数成正比!!!正比!!!

在根据简单版的居中原理的方法,应用到缩放后的ScrollView中,所有相关参数都*相应的缩放倍数!!正比关系记得。

下面是具体实现代码 :(PS 有更好更简单实现方法欢迎提供交流,本文描述有不当处欢迎指正谢谢!!)

- (void)showPointToCenterWithPoint:(CGPoint)pt withZoomScale:(CGFloat)zs{
    [UIView animateWithDuration:0.3 animations:^{

        __block CGPoint point = pt;
        _baseScrollView.zoomScale = zs;
        CGFloat offsetX = _baseScrollView.contentOffset.x*zs;
        CGFloat offsetY = _baseScrollView.contentOffset.y*zs;
        CGFloat contentW = _baseScrollView.contentSize.width;
        CGFloat contentH = _baseScrollView.contentSize.height;
        CGFloat x = 0;
        CGFloat y = 0;
        point = CGPointMake(point.x*zs, point.y*zs);
        //右侧
        if (offsetX + SCREEN_WIDTH < contentW && (point.x - offsetX) > SCREEN_WIDTH*0.5) {
            //居中所要移动的距离:(point.x - offsetX)-SCREEN_WIDTH*0.5) ;移动后 还没有超过边界即满足居中
            if ((offsetX +  (point.x - offsetX)-SCREEN_WIDTH*0.5) + SCREEN_WIDTH < contentW) {
                x = offsetX +  (point.x - offsetX)- SCREEN_WIDTH*0.5;
            }else{
                //不满足居中
                x = offsetX + (contentW - offsetX - SCREEN_WIDTH);
            }
        }else{
//左侧 满足居中
if (offsetX - (SCREEN_WIDTH*0.5 - (point.x - offsetX))>=0) { x = offsetX - (SCREEN_WIDTH*0.5 - (point.x - offsetX)); }else{ x = 0; } } //下侧 if (offsetY + SCREEN_HEIGHT < contentH && (point.y - offsetY) > SCREEN_HEIGHT*0.5) { if ((offsetY + (point.y - offsetY)-SCREEN_HEIGHT*0.5) + SCREEN_HEIGHT < contentH) { y = offsetY + (point.y - offsetY)- SCREEN_HEIGHT*0.5; }else{ y = offsetY + (contentH - offsetY - SCREEN_HEIGHT); } }else{ if (offsetY - (SCREEN_HEIGHT*0.5 - (point.y - offsetY)) >= 0) { y = offsetY - (SCREEN_HEIGHT*0.5 - (point.y - offsetY)); }else{ y = 0; } } [_baseScrollView setContentOffset:CGPointMake(x, y)animated:NO]; } completion:^(BOOL finished) { }]; }

 

转载于:https://www.cnblogs.com/zhujin/p/5629107.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值