这里主要讨论设置AnchorPoint 改变时,会影响我们预期的布局问题;

一、初始代码布局

    //参照页面

    UIView *aView = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)];

    aView.backgroundColor = [UIColor redColor];

    [self.view addSubview:aView];

    

    UIView *bView = [[UIView alloc]initWithFrame:CGRectMake(150, 50, 100, 100)];

    bView.backgroundColor = [UIColor blueColor];

    [self.view addSubview:bView];

运行效果如下(默认anchorPoint(0.5,0.5))

其中 B 坐标信息 :  

 frame : (origin = (x = 150, y = 50), size = (width = 100, height = 100))

 center :(x = 200, y = 100)

 

二、更改B页面 anchorPoint为 (0,0.5)

    bView.layer.anchorPoint = CGPointMake(0.0, 0.5);

运行,结果如下:

B 坐标信息如下

frame   : (origin = (x = 200, y = 50), size = (width = 100, height = 100))

 center : (x = 200, y = 100)

和“一 ”中结果 相比发现,center不变, x坐标向右移动了50pt;

 

三、更改B页面 anchorPoint为 (0.0,0.0)

    bView.layer.anchorPoint = CGPointMake(0.0, 0.0);

运行,结果如下:

B 坐标信息如下

frame   : (origin = (x = 200, y = 100), size = (width = 100, height = 100))

 center : (x = 200, y = 100)

此时发现 origin 和center重叠了

 

四、结论

    我们设置anchorPoint 时已经改变了我们的布局,这不是我们所期望的;

     从二、三运行结果可以发现一下结论:

  • center坐标的值都未改变。
  • center 点即使我们的锚点
  • 我们改变锚点值时,页面会相对于原中心点进行相应改变

 

五、解决方案

     那么我们如何想要得到:只设定anchorPoint值,而不影响页面布局呢? 答案是,重新计算frame值;

    代码如下:

/**
 设置锚点,且不影响之前的预期布局

 @param anchorPoint 锚点值如:{1,0.5}
 @param view 要更改的view
 */
- (void)setViewAnchorPoint:(CGPoint)anchorPoint forView:(UIView*)view {
    CGPoint originAnchorPoint = view.layer.anchorPoint;
    CGPoint offetPoint = CGPointMake(anchorPoint.x - originAnchorPoint.x, anchorPoint.y - originAnchorPoint.y);
    CGFloat offetX =  (offetPoint.x)*view.frame.size.width;
    CGFloat offetY =  (offetPoint.y)*view.frame.size.height;
    view.layer.anchorPoint = anchorPoint;//设置这个值 说明已经改变了便宜量
    view.layer.position = CGPointMake(view.layer.position.x + offetX, view.layer.position.y + offetY);//将指定的偏宜量更改回来
}

那么我们设置需要更改的B页面如下调用即可:

    UIView *bView = [[UIView alloc]initWithFrame:CGRectMake(150, 50, 100, 100)];
    _bView = bView;
    bView.backgroundColor = [UIColor blueColor];
    [self setViewAnchorPoint:CGPointMake(1, 1) forView:bView];//只是测试多次连续设置结果
    [self setViewAnchorPoint:CGPointMake(0, 0.5) forView:bView];
    [self.view addSubview:bView];
    

完美结局