iOS --使用優(yōu)雅的錨點

做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)載請注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鲁豪,一起剝皮案震驚了整個濱河市潘悼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌爬橡,老刑警劉巖治唤,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異糙申,居然都是意外死亡宾添,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門柜裸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缕陕,“玉大人,你說我怎么就攤上這事疙挺】敢兀” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵铐然,是天一觀的道長蔬崩。 經(jīng)常有香客問我,道長搀暑,這世上最難降的妖魔是什么沥阳? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮险掀,結(jié)果婚禮上沪袭,老公的妹妹穿的比我還像新娘。我一直安慰自己樟氢,他們只是感情好冈绊,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著埠啃,像睡著了一般死宣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碴开,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天毅该,我揣著相機與錄音博秫,去河邊找鬼。 笑死眶掌,一個胖子當著我的面吹牛挡育,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播朴爬,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼即寒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了召噩?” 一聲冷哼從身側(cè)響起母赵,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎具滴,沒想到半個月后凹嘲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡构韵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年周蹭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疲恢。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡谷醉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冈闭,到底是詐尸還是另有隱情俱尼,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布萎攒,位于F島的核電站遇八,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏耍休。R本人自食惡果不足惜刃永,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羊精。 院中可真熱鬧斯够,春花似錦、人聲如沸喧锦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽燃少。三九已至束亏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阵具,已是汗流浹背碍遍。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工定铜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怕敬。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓揣炕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親东跪。 傳聞我的和親對象是個殘疾皇子祝沸,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容