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 ...
随机推荐
- linux mkisofs(genisoimage)命令用法
功能说明:建立ISO 9660映像文件. 常用命令:genisoimage -o imagename.iso file 语 法:mkisofs [-adDfhJlLNrRTvz][-print-siz ...
- What is CRC and how does it works?
What is CRC and how does it works? CRC errors refer to Layer 1 or 2 issues. Two things you should ch ...
- Netty-SocketIO的Web推送实战应用
netty-socketio是一个开源的Socket.io服务器端的一个java的实现, 它基于Netty框架.可应用于服务端主动推送消息到客户端等场景,比如说股票价格变化.k线图的走势,和webso ...
- MyCat配置和使用
1.什么是MyCat2.MyCat应用场景3.使用MyCat路由实现读写分离4.SpringBoot动态数据源切换原理5..SpringBoot项目实现读写分离 使用MyCat实现读写分离 什么是My ...
- 介绍几个C#正则表达式工具
这里将为大家推荐介绍几个C#正则表达式工具,这些小工具能帮助大家在.NET开发过程中起到事半功倍的效果,希望大家喜欢. 推荐三个C#正则表达式工具,理由如下 第一个C#正则表达式工具,REGEX 这个 ...
- Linux 查看进程基本命令
https://www.cnblogs.com/zwgblog/p/5971455.html https://www.cnblogs.com/lcword/p/6046261.html https:/ ...
- docker之DockerSwarm的了解
这次一起了解下docker Swarm,什么是dockerSwarm. 什么是docker Swarm 产品背景 使用docker的流程,ssh到一台服务器,运行docker命令来运行本机的docke ...
- hackerrankWeek of Code 31
hackerrankWeek of Code 31 A.Beautiful Word B.Accurate Sorting C.Zero-One Game D.Spanning Tree Fracti ...
- uva 11825 巧妙地子集枚举方法
https://vjudge.net/problem/UVA-11825 题目大意,有n台服务器,有n种服务,每台服务器都运行着所有的服务,一台服务器可以被攻击一次其中的一种服务,当你选择攻击某台服务 ...
- iOS自动化探索(六)自动化测试框架pytest - fixtures
Fixture介绍 fixture是pytest特有的功能,它用pytest.fixture标识,定义在函数前面.在编写测试函数的时候,可以将此函数名称做为传入参数,pytest将会以依赖注入方式,将 ...