iOS AnchorPoint 引起的坐标问题
这里主要讨论设置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 引起的坐标问题的更多相关文章
- iOS开发基础-九宫格坐标(6)
继续对iOS开发基础-九宫格坐标(5)中的代码进行优化. 优化思路:把字典转模型部分的数据处理操作也拿到模型类中去实现,即将 ViewController 类实现中 apps 方法搬到 WJQAppI ...
- iOS开发基础-九宫格坐标(5)
继续在iOS开发基础-九宫格坐标(4)的基础上进行优化. 一.改进思路 1)iOS开发基础-九宫格坐标(4)中 viewDidLoad 方法中的第21.22行对控件属性的设置能否拿到视图类 WJQAp ...
- iOS开发基础-九宫格坐标(4)
对iOS开发基础-九宫格坐标(3)的代码进行进一步优化. 新建一个 UIView 的子类,并命名为 WJQAppView ,将 appxib.xib 中的 UIView 对象与新建的视图类进行关联. ...
- iOS开发基础-九宫格坐标(3)之Xib
延续iOS开发基础-九宫格坐标(2)的内容,对其进行部分修改. 本部分采用 Xib 文件来创建用于显示图片的 UIView 对象. 一.简单介绍 Xib 和 storyboard 的比较: 1) X ...
- 在IOS中根据圆心坐标、半径和角度计算圆弧上的点坐标
/** 日期:2015-10-15 版本: 1.0.0 -------------------------------------------------------------- 功能说明 ---- ...
- ios 解决有关火星坐标的问题
CLLocationManager 定位获取CLLocation 是地球坐标,而MKMapView 获取的是天朝火星坐标,这就导致了使用定位的时候,显示用户的蓝点和当前定位信息偏差(因为蓝点是调用了M ...
- iOS开发基础-九宫格坐标(2)之模型
在iOS开发基础-九宫格(1)中,属性变量 apps 是从plist文件中加载数据的,在 viewDidLoad 方法中的第20行.26行中,直接通过字典的键名来获取相应的信息,使得 ViewCont ...
- iOS开发基础-九宫格坐标(1)
一.功能分析 1)以九宫格展示图片信息,每一个 UIView 包含一个 UIImageView .一个 UILabel 和一个 UIButton . 2)加载App数据,根据数据长度创建对应的格子数: ...
- iOS下控件坐标的转换方法
转换方法如下: - (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view - (CGPoint)convertPoint:(CGPo ...
随机推荐
- DATEDIFF() 返回2个日期之间的间隔
SELECT DATEDIFF(day,'2008-12-29','2008-12-30') AS DiffDate 解释: 第一个参数 day 表示 返回2个日期间隔的 个间隔类型 是 日期:结果 ...
- 汇编指令与Intrinsics指令的对应关系汇总
汇编指令与Intrinsics指令的对应关系汇总 参考网址:https://software.intel.com/sites/landingpage/IntrinsicsGuide/ 1.赋值指令:m ...
- 编译lineageos
lineageos 2 -- 编译rom包 fu*k小米,手机老是1年左右出现充不进去电.前段时间我的红米note4x突然充不进去电了,只好新买了个手机(买手机先看lineageos支持列表 ^_^) ...
- ls存在的文件,不能操作
bash-4.2# pwd/oracle/product/10.2.0/db_1/network/adminbash-4.2# lssqlnet.ora libnrad ...
- apache kafka配置中request.required.acks含义
Kafka producer的ack有3中机制,初始化producer时的producerconfig可以通过配置request.required.acks不同的值来实现. 0:这意味着生产者prod ...
- Linux Wget 命令
Linux wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到本地服务器.如果我们使用虚拟主机,处理这样的 ...
- oracle 子查询详解 in和exists的区别
sql允许多层嵌套,子查询是嵌套在其他查询中的查询.我们可以把子查询当做一张表来看到,即外层语句可以把内嵌的查询结果当做一张表使用. 子查询查询结果有三种情况 不返回查询记录.若子查询不返回记录则主查 ...
- 绘制三角形(sass)
绘制三角形 /// draw triangle/// @param {type} $type [''] - triangleUp triangleDown triangleLeft triangleR ...
- CSS设置小技巧
水平居中 对于元素的水平居中,有三种情况: 行内元素(文字.图片等):text-align: center; 定宽块状元素(有设置宽度的block元素):margin: 0 auto; 不定宽块状元素 ...
- 找出此产品描述中包含N个关键字的长度最短的子串
阿里巴巴笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号:再给定N个英文关键词,请说明思路并变成实现方法. String extractSummary(Stri ...