做ios開發(fā)時,有很多東西都用不慣卷仑,比如沒有單獨設置view的位置和大小的方法峻村,而要把位置和大小一起初始化,感覺有點麻煩锡凝。
在cocos2d里就非常方便粘昨,因為cocos2d的錨點可以很方便地設置子視圖的位置,而ios里沒有錨點這個概念。
所以把cocos2d的錨點移植到了ios里张肾,并做了一些修改芭析,使其成為了有著ios特色的錨點。
1.簡單介紹
CALayer有2個非常重要的屬性:position和anchorPoint
@property CGPoint position;
用來設置CALayer在父層中的位置
以父層的左上角為原點(0, 0)
@property CGPoint anchorPoint;
稱為“定位點”吞瞪、“錨點”
決定著CALayer身上的哪個點會在position屬性所指的位置
以自己的左上角為原點(0, 0)
它的x馁启、y取值范圍都是0~1,默認值為(0.5, 0.5)
2.圖示 anchorPoint
它的取值為0~1.png
紅色圖層的anchorPoint為(0芍秆,0).png
紅色圖層的anchorPoint為(0.5惯疙,0.5).png
紅色圖層的anchorPoint為(1,1).png
position和anchorPoint
添加一個紅色圖層到綠色圖層上浪听,紅色圖層顯示到什么位置螟碎,由position屬性決定;假設紅色圖層的position是(100,100),到底把紅色圖層的哪個點移動到(100迹栓,100)的坐標位置掉分,錨點。
紅色圖層的錨點是(0克伊,0).png
紅色圖層的錨點是(0.5酥郭,0.5).png
紅色圖層的錨點是(1,1).png
紅色圖層的錨點是(0.5愿吹,0).png
3.代碼示例
- (void)test3
{
UIView *aView = [[UIView alloc]initWithFrame:CGRectMake(100, 200, 150, 100)];
/** 默認錨點就是CGPointMake(0.5, 0.5)*/
//? ? aView.layer.anchorPoint = CGPointMake(0.5, 0.5)
aView.backgroundColor = [UIColor cyanColor];
[self.view addSubview:aView];
UIView *bView = [[UIView alloc]initWithFrame:CGRectMake(100, 200, 150, 100)];
bView.layer.anchorPoint = CGPointMake(0, 0);
bView.backgroundColor = [UIColor redColor];
[self.view addSubview:bView];
UIView *cView = [[UIView alloc]initWithFrame:CGRectMake(100, 200, 150, 100)];
cView.layer.anchorPoint = CGPointMake(1, 1);
cView.backgroundColor = [UIColor greenColor];
[self.view addSubview:cView];
}
顯示效果.png
4.例子說明
比如要創(chuàng)建以下兩個視圖不从,藍色視圖左上角在坐標(5,4)處,而橙色視圖右邊和藍色視圖對齊犁跪,有一半的高度處于藍色視圖外面椿息。
例子.png
按照ios標準的創(chuàng)建視圖的寫法可以這樣寫代碼:
UIView * blueView = [[ UIView alloc ] initWithFrame : CGRectMake ( 5 , 4 , W , H )];
blueView . backgroundColor = [ UIColor blueColor ];
[ self . view addSubview : blueView ];
UIView * orangeView = [[ UIView alloc ] initWithFrame : CGRectMake ( W - w , H - h / 2 , w , h )];
orangeView . backgroundColor = [ UIColor orangeColor ];
[ blueView addSubview : orangeView ];
可以看到創(chuàng)建視圖時就要計算視圖左上角的坐標,非常麻煩坷衍。而使用了錨點的代碼可以這樣寫:
UIView * blueView = [[ UIView alloc ] initWithSize : CGSizeMake ( W , H )];
[ blueView setPosition : CGPointMake ( 5 , 4 ) atAnchorPoint : CGPointMake ( 0 , 0 )];
blueView . backgroundColor = [ UIColor blueColor ];
[ self . view addSubview : blueView ];
UIView * orangeView = [[ UIView alloc ] initWithSize : CGSizeMake ( w , h )];
[ orangeView setPosition : CGPointMake ( W , H ) atAnchorPoint : CGPointMake ( 1 , 0.5 )];
orangeView . backgroundColor = [ UIColor orangeColor ];
[ blueView addSubview : orangeView ];
可見寝优,使用錨點省去了苦逼的計算過程。當然了枫耳,錨點也是針對子視圖去設計的乏矾,錨點掌握好了,我們就不用再去計算x,y坐標了迁杨。
就拿上面這個例子分析一下吧:
把俯視圖藍色view的左邊點(W钻心,H)作為自身的錨點(1,0.5)【注意:錨點是在自身上找铅协,這個點一一映射的有一個父view的坐標捷沸,可以通過這兩個值來計算子視圖的view.frame.origin】.
好好理解上句話,錨點的坐標范圍如下:
錨點的坐標范圍.png
下面看一下代碼中把父視圖的點作為自身錨點的方法狐史。
- (void)setPosition:(CGPoint)point atAnchorPoint:(CGPoint)anchorPoint
{
CGFloat x = point.x - anchorPoint.x * self.width;
CGFloat y = point.y - anchorPoint.y * self.height;
[self setOrigin:CGPointMake(x, y)];
}
通過category為UIView添加設置錨點的方法痒给,所有view的子類就可以使用該方法坯钦。
下載UIView+Frame文件,添加到工程里即可侈玄,這個類里面自定義了一些獲取和設置view的大小和位置的方法。
隨手點個喜歡吧~
關注我
QQ--iOS 交流群:107548668
作者:小兵快跑
鏈接:http://www.reibang.com/p/94ba4de209ed
來源:簡書
著作權(quán)歸作者所有吟温。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)序仙,非商業(yè)轉(zhuǎn)載請注明出處。