这里主要讨论设置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(, , , )];
_bView = bView;
bView.backgroundColor = [UIColor blueColor];
[self setViewAnchorPoint:CGPointMake(, ) forView:bView];//只是测试多次连续设置结果
[self setViewAnchorPoint:CGPointMake(, 0.5
) forView:bView];
[self.view addSubview:bView];

完美结局

iOS AnchorPoint 引起的坐标问题的更多相关文章

  1. iOS开发基础-九宫格坐标(6)

    继续对iOS开发基础-九宫格坐标(5)中的代码进行优化. 优化思路:把字典转模型部分的数据处理操作也拿到模型类中去实现,即将 ViewController 类实现中 apps 方法搬到 WJQAppI ...

  2. iOS开发基础-九宫格坐标(5)

    继续在iOS开发基础-九宫格坐标(4)的基础上进行优化. 一.改进思路 1)iOS开发基础-九宫格坐标(4)中 viewDidLoad 方法中的第21.22行对控件属性的设置能否拿到视图类 WJQAp ...

  3. iOS开发基础-九宫格坐标(4)

    对iOS开发基础-九宫格坐标(3)的代码进行进一步优化. 新建一个 UIView 的子类,并命名为 WJQAppView ,将 appxib.xib 中的 UIView 对象与新建的视图类进行关联. ...

  4. iOS开发基础-九宫格坐标(3)之Xib

    延续iOS开发基础-九宫格坐标(2)的内容,对其进行部分修改. 本部分采用 Xib 文件来创建用于显示图片的 UIView 对象. 一.简单介绍  Xib 和 storyboard 的比较: 1) X ...

  5. 在IOS中根据圆心坐标、半径和角度计算圆弧上的点坐标

    /** 日期:2015-10-15 版本: 1.0.0 -------------------------------------------------------------- 功能说明 ---- ...

  6. ios 解决有关火星坐标的问题

    CLLocationManager 定位获取CLLocation 是地球坐标,而MKMapView 获取的是天朝火星坐标,这就导致了使用定位的时候,显示用户的蓝点和当前定位信息偏差(因为蓝点是调用了M ...

  7. iOS开发基础-九宫格坐标(2)之模型

    在iOS开发基础-九宫格(1)中,属性变量 apps 是从plist文件中加载数据的,在 viewDidLoad 方法中的第20行.26行中,直接通过字典的键名来获取相应的信息,使得 ViewCont ...

  8. iOS开发基础-九宫格坐标(1)

    一.功能分析 1)以九宫格展示图片信息,每一个 UIView 包含一个 UIImageView .一个 UILabel 和一个 UIButton . 2)加载App数据,根据数据长度创建对应的格子数: ...

  9. iOS下控件坐标的转换方法

    转换方法如下: - (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view - (CGPoint)convertPoint:(CGPo ...

随机推荐

  1. Linux内核参数之rp_filter

    一.rp_filter参数介绍 rp_filter参数用于控制系统是否开启对数据包源地址的校验. 首先看一下Linux内核文档documentation/networking/ip-sysctl.tx ...

  2. 2018-2019-2 20165114《网络对抗技术》Exp5 MSF基础应用

    Exp5 MSF基础应用 目录 一.实验目标 二.基础问题回答 三.实验过程记录 3.1主动攻击实践 ms08_067+generic/shell reverse_tcp ms17_010_etern ...

  3. nginx 第一天

    来公司第一天先装了一下nginx 第一步:  先装brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/ ...

  4. Spring中Bean管理的常用注解

    在Spring中,主要用于管理bean的注解分为四大类:1.用于创建对象.2.用于给对象的属性注入值.3.用于改变作用的范围.4.用于定义生命周期.这几个在开发中经常接触到,也可以说每天都会遇见.其中 ...

  5. The revocation function was unable to check revocation for the certificate

    https://stackoverflow.com/questions/45556189/git-the-revocation-function-was-unable-to-check-revocat ...

  6. bootstrap重置校验方法

    $(function (){ $("select").change(function(){ $('#DepartForm').bootstrapValidator('resetFo ...

  7. DIKW:数据、信息、知识、智慧的金字塔层次体系

    http://www.ciotimes.com/ProCase/85417.html 前言 知识对于个人.组织的重要性已经不言而喻.可以说,管理与应用知识的能力已经成为企业的核心竞争力. 知识如此重要 ...

  8. 落地案例|日本雅虎如何在 OpenStack 上大规模构建和运行 Kubernetes

    今天的帖子是由日本雅虎的基础设施工程团队撰写,内容是他们如何在 Kubernetes 上运行 OpenStack.这篇帖子是由日本雅虎的工程博客编译而来. 简介: 这篇帖子大致描述了日本雅虎在 Goo ...

  9. javascript简单介绍总结(一)

    DOM (Document Object Model)(文档对象模型)是用于访问 HTML 元素的正式 W3C 标准.在 HTML 中,JavaScript 语句向浏览器发出的命令.语句是用分号分隔: ...

  10. Hadoop2.9下运行JAR包时System.out.println的输出日志

    根据博文——Hadoop日志存放路径详解中所述,Container日志包含ApplicationMaster日志和普通Task日志(关于其他类型的日志的详细说明请参考该博文,本文不再赘述) 所以可知, ...