3.2 錨點

2018-02-24 14:50 更新

錨點

????之前提到過,視圖的center屬性和圖層的position屬性都指定了anchorPoint相對于父圖層的位置。圖層的anchorPoint通過position來控制它的frame的位置,你可以認為anchorPoint是用來移動圖層的把柄

????默認來說,anchorPoint位于圖層的中點,所以圖層的將會以這個點為中心放置。anchorPoint屬性并沒有被UIView接口暴露出來,這也是視圖的position屬性被叫做“center”的原因。但是圖層的anchorPoint可以被移動,比如你可以把它置于圖層frame的左上角,于是圖層的內(nèi)容將會向右下角的position方向移動(圖3.3),而不是居中了。

圖3.4 組成鐘面和鐘表的四張圖片

????鬧鐘的組件通過IB來排列(圖3.5),這些圖片視圖嵌套在一個容器視圖之內(nèi),并且自動調(diào)整和自動布局都被禁用了。這是因為自動調(diào)整會影響到視圖的frame,而根據(jù)圖3.2的演示,當視圖旋轉(zhuǎn)的時候,frame是會發(fā)生改變的,這將會導致一些布局上的失靈。

????我們用NSTimer來更新鬧鐘,使用視圖的transform屬性來旋轉(zhuǎn)鐘表(如果你對這個屬性不太熟悉,不要著急,我們將會在第5章“變換”當中詳細說明),具體代碼見清單3.1

圖3.6 鐘面,和不對齊的鐘指針

????你也許會認為可以在Interface Builder當中調(diào)整指針圖片的位置來解決,但其實并不能達到目的,因為如果不放在鐘面中間的話,同樣不能正確的旋轉(zhuǎn)。

????也許在圖片末尾添加一個透明空間也是個解決方案,但這樣會讓圖片變大,也會消耗更多的內(nèi)存,這樣并不優(yōu)雅。

????更好的方案是使用anchorPoint屬性,我們來在-viewDidLoad方法中添加幾行代碼來給每個鐘指針的anchorPoint做一些平移(清單3.2),圖3.7顯示了正確的結(jié)果。

清單3.2

- (void)viewDidLoad 
{
    [super viewDidLoad];
    // adjust anchor points

    self.secondHand.layer.anchorPoint = CGPointMake(0.5f, 0.9f); 
    self.minuteHand.layer.anchorPoint = CGPointMake(0.5f, 0.9f); 
    self.hourHand.layer.anchorPoint = CGPointMake(0.5f, 0.9f);

    // start timer
}

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號