免费开源的iOS开发学习平台

UIView详解:11-控件改变坐标系(convertRect:)

由于UI控件的Frame属性都是依据该控件的父控件原点作为坐标系原点(0,0)的,所以,当父控件不是控制器view时,无法根据UI控件的frame来获取其相对于控制器view的位置。在实际开发中,为了获取某个子控件相对于屏幕顶部/底部/左边/右边的实际距离,必须要去改变子控件的坐标系。

一、示例

如下图所示,橙色view是蓝色view的子控件,蓝色view是绿色view的子控件。由于橙色view的frame是参考蓝色view的,因此,如果需要获取橙色view相对于绿色view的位置,就必须进行坐标系的转换。

二、实现方法

  • UIView类中提供了如下四个方法,可以改变坐标系
- (CGPoint)convertPoint:(CGPoint)point toView:(nullable UIView *)view;
- (CGPoint)convertPoint:(CGPoint)point fromView:(nullable UIView *)view;
- (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view;
- (CGRect)convertRect:(CGRect)rect fromView:(nullable UIView *)view;
  • 为了实现示例中的要求,可以通过如下方式获取橙色view(orangeView)相对于绿色view(self.view)的距离
CGRect newFrame = [self.blueView convertRect:self.orangeView.frame toView:self.view];
NSLog(@"newFrame:x:%f, y:%f",newFrame.origin.x,newFrame.origin.y);

示例代码

https://github.com/99ios/7.2.11