这里主要讨论设置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. DATEDIFF() 返回2个日期之间的间隔

    SELECT DATEDIFF(day,'2008-12-29','2008-12-30') AS DiffDate 解释: 第一个参数 day 表示 返回2个日期间隔的 个间隔类型 是 日期:结果 ...

  2. 汇编指令与Intrinsics指令的对应关系汇总

    汇编指令与Intrinsics指令的对应关系汇总 参考网址:https://software.intel.com/sites/landingpage/IntrinsicsGuide/ 1.赋值指令:m ...

  3. 编译lineageos

    lineageos 2 -- 编译rom包 fu*k小米,手机老是1年左右出现充不进去电.前段时间我的红米note4x突然充不进去电了,只好新买了个手机(买手机先看lineageos支持列表 ^_^) ...

  4. ls存在的文件,不能操作

    bash-4.2# pwd/oracle/product/10.2.0/db_1/network/adminbash-4.2# lssqlnet.ora                 libnrad ...

  5. apache kafka配置中request.required.acks含义

    Kafka producer的ack有3中机制,初始化producer时的producerconfig可以通过配置request.required.acks不同的值来实现. 0:这意味着生产者prod ...

  6. Linux Wget 命令

    Linux wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到本地服务器.如果我们使用虚拟主机,处理这样的 ...

  7. oracle 子查询详解 in和exists的区别

    sql允许多层嵌套,子查询是嵌套在其他查询中的查询.我们可以把子查询当做一张表来看到,即外层语句可以把内嵌的查询结果当做一张表使用. 子查询查询结果有三种情况 不返回查询记录.若子查询不返回记录则主查 ...

  8. 绘制三角形(sass)

    绘制三角形 /// draw triangle/// @param {type} $type [''] - triangleUp triangleDown triangleLeft triangleR ...

  9. CSS设置小技巧

    水平居中 对于元素的水平居中,有三种情况: 行内元素(文字.图片等):text-align: center; 定宽块状元素(有设置宽度的block元素):margin: 0 auto; 不定宽块状元素 ...

  10. 找出此产品描述中包含N个关键字的长度最短的子串

    阿里巴巴笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号:再给定N个英文关键词,请说明思路并变成实现方法. String extractSummary(Stri ...