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命令(6/9):watch命令
watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行.在Linux下,watch是周期性的执行下个 ...
- 外部类与main方法笔记
外部类 1. 外部public class只能有一个 2. 外部类只能有两种访问控制级别: public 和默认 3. 一个文件中,可以有多个public class,即外部类为public,还可以有 ...
- jz2440存储管理实验【学习笔记】
平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山一期视频学习笔记 简介:先来简单的说明一下这次的实验,看看下图,我们的程序通过烧录器下载到nandflash当中去,之后在启动的时 ...
- iOS 开发 申请定位
在iOS8以后,苹果已经强制开发者在请求定位服务时获得用户的授权,此外iOS状态栏中还有指示图标,提示用户当前应用是否正在使用定位服务.另外在iOS8以后,苹果进一步改善了定位服务,让开发者请求定位服 ...
- WIN10 安装Docker MySQL Ubuntu
1) 必须专业版, 要开启 Hyper-V 2)下载安装包: 链接:https://pan.baidu.com/s/1APqcq2glvwzsCHlwRnPXkA 密码:wpej 3)安装时不要勾 ...
- JavaEE初始化时静态代码块加载问题
1.使用java.exe命令运行某个类的时java.exe Person2.创建一个类的对象时Person p=new Person();3.访问类中的静态成员变量(赋值/获取值)System.out ...
- 安装pysqlite2
1. 从https://github.com/msabramo/pysqlite2 下载源码. 2.安装python-dev: sudo apt-get install python-dev 否则在 ...
- JNI简单步骤01
1.环境变量 1.1.相应的环境变量中,加入如下内容:(Windows) (1).ClASSPATH中输入 : ".;C:\Program Files\Java\jdk1.7.0_07\jr ...
- TUNING FOR ALL FLASH DEPLOYMENTS
Ceph Tuning and Best Practices for All Flash Intel® Xeon® ServersLast updated: January 2017 TABLE OF ...
- vue组件化开发-vuex状态管理库
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex 也集成到 Vue 的官方调试工具 ...