最近开发遇到了一些UI需要作坐标系的转换,如图
需要在原来添加标签按钮添加一个引导功能,添加标签按钮要与引导的添加标签按钮百分百分吻合重叠
当时有点懵,因为这里叠了很多层界面,需要一层一层地转换坐标系,当时想到办法就是一层一层地转换参考坐标系,然后得出确切的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的参考坐标系
不学不知道,原来这个函数功能真的挺强大的,后来我在项目的很多地方均使用到了,而且非常方便高效!
再举一个具体的例子:
要计算点击输入框后,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;