美文网首页
iOS开发之坐标系转换

iOS开发之坐标系转换

作者: tangbin583085 | 来源:发表于2017-08-11 20:06 被阅读0次

    最近开发遇到了一些UI需要作坐标系的转换,如图

    需要在原来添加标签按钮添加一个引导功能,添加标签按钮要与引导的添加标签按钮百分百分吻合重叠

    F93D4093747E29B1BE8117E71A4240C6.jpg C1C48F336FE7234F99308AC75C8F36C3.png

    当时有点懵,因为这里叠了很多层界面,需要一层一层地转换坐标系,当时想到办法就是一层一层地转换参考坐标系,然后得出确切的Frame,计算起来非常繁琐(特别是UI叠了很多层之后)
    后来无意间发现了苹果提供的一个函数,而且这个函数就在UIView.h里面!

    - (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view;
    - (CGRect)convertRect:(CGRect)rect fromView:(nullable UIView *)view;
    

    这2个函数的效果功能是一致的,只是参数调换位置而已。
    看我关键源代码就清楚,字面也很好理解

    CGRect rect = [self.view convertRect:addVerticalBtn.frame fromView:addVerticalBtn.superview];
    // 或者
    CGRect rect = [addVerticalBtn.superview convertRect:addVerticalBtn.frame toView:self.view];
    

    说得简单点这2个函数的功能:把addVerticalBtn的frame参考坐标系转换为self.view的参考坐标系
    不学不知道,原来这个函数功能真的挺强大的,后来我在项目的很多地方均使用到了,而且非常方便高效!

    再举一个具体的例子:

    827C47D3E87961CB8FF53D28C8DF2C20.png

    要计算点击输入框后,tablew需要上移的偏移量,这个输入框的superView不再是table了(而是cell的contentView),如果自己手动计算的话,需要计算每个一个cell的高度从而得知table的整个高度再求出输入框的frame在table的确切位置。
    但是利用上面的函数就能轻而易举的达到偏移量计算结果!

    // 注册监听键盘通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
    
    // 自动偏移table
    - (void)keyBoardWillChangeFrame:(NSNotification *)notification{
        
        // 键盘最终的frame
        CGRect keyboardF = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
        
        if (keyboardF.origin.y == self.view.height) return;
        // 动画时间
    //    CGFloat duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
        
        CGRect rect = [self.textView.superview convertRect:self.textView.frame toView:self.tableView];
    //    CGPoint offset = self.tableView.contentOffset;
        CGPoint point = CGPointMake(0, rect.origin.y - (self.tableView.height - keyboardF.size.height - self.textView.superview.height));
        [self.tableView setContentOffset:point animated:YES];
    }
    

    同理,以下2个函数应该也是一样的功能(实际项目中我还没什么用到,估计将来一定会用到),只是矩形变成了点

    - (CGPoint)convertPoint:(CGPoint)point toView:(nullable UIView *)view;
    - (CGPoint)convertPoint:(CGPoint)point fromView:(nullable UIView *)view;
    

    相关文章

      网友评论

          本文标题:iOS开发之坐标系转换

          本文链接:https://www.haomeiwen.com/subject/cqmrrxtx.html