0000_0000_0000_0011 frame and bounce

0000 0000 0000 0011

寫於2015.04.05 19:23

1.frame bounce

這兩天被UIScroll View 搞的暈頭轉向,主要還是幾個問題沒有完全搞懂,總在以爲搞定它們時候,又被一個demo否定。目前可能對frame 和 bounce還算理解吧。因此特地寫下來記錄下。

首先它們的存儲都是(x,y,width,height),要分爲兩個部分看(x,y)和(width,height)。前者是origin,後者是size,分別表示點和尺寸。

1-1.frame

frame,從層級關係上來說就是,視圖View在父視圖SuperView上的位置。

決定子視圖(subView)在父視圖(superView)上的位置有兩個條件,分別是origin(一個點)size(視圖的尺寸)。我這麼想,面前有一塊畫布,畫個矩形,總得有個起筆的地方,那是origin;畫多少大,即寬多少,高多少,就絕對了最後在畫圖中怎麼呈現那個矩形。

3-1

灰色視圖的bounce(0,0,400,600)注意不是frame,後面會談到爲什麼是bounce 而且點取(0,0)和取別的點有啥不同

現在我要在灰色視圖上繪製我的綠色View,前面說過,我要定一個起始點和尺寸。這裏點爲(100,60),大小是100 * 100,有了點(point)還不行,在灰色視圖中我得有個參考座標系,否則我怎麼知道哪個點是(100,60)。這時候bounce中的(0,0)起了關鍵性作用,它表示視圖最左上角代表(0,0)(已在圖中標出這裏很重要,我說的是灰色View的左上角那個點表示(0,0))。橫向向右是x軸正方向,縱向向下是y軸正方向。

如此我就知道點(100,60)在哪個位置,定下點後畫多少大多少高就是一個簡單的問題。

寫到這,基本和用百度 谷歌搜到的東西差不多。

假如我修改綠色視圖的frame(200,200,50,50),由於改變了點(point)的位置,那麼相應起筆的位置也不同了,綠色視圖最後向右下角移動。

到目前爲止,這些都是初學者都知道的。講完frame 講下bounce。

1-2.bounce

還是接着上面圖片來講,爲什麼我要強調灰色視圖剛纔的bounce中的orgin(0,0)。因爲在scrollView中這個bounce會改變(當然這裏我還不想涉及太多)。

要知道平常我們在使用視圖的時候會順手打印下bounce,一般origin都是(0,0),

你有想過這個點代表什麼?改變它的值會怎麼樣?

現在給出另外一幅圖:

3-2

畫得粗糙了,以後以後自己回過頭還能看懂orz。首先 白色視圖(view1)是父視圖,然後灰色視圖(view2)add到上面,最後綠色視圖(view3)add到灰色視圖上。至於藍色框框,請暫時忽略。
主要還是灰色視圖,首先灰色視圖在白色視圖位置是定的,然後修改灰色視圖的bounce中的origin,正如圖中所看到的,設爲(10,20)。

正如你看到的,bounce的origin 就是視圖左上角的點的座標,換個通俗暴力的說話,我指定左上角那個點就是(10,20),也許下一刻我就指定它爲(100,200)了,誰知道呢?


回到剛纔話題,既然現在左上角那個點是(10,20)了,那麼原來的原點座標(0,0)在哪裏?這就是我爲什麼要用藍框標出來了,正如你所看到的圖上的(0,0)。不過我們在屏幕中看到的仍然是灰色那塊區域!

問題這會影響什麼?

我在學習過程中看其他朋友的博客,基本可以概括爲兩句話:有一個視圖ViewA,它的frame就是viewA在父視圖的位置;它的bounce決定了在ViewA中的子視圖佈局位置。

而我目前理解是,在灰色視圖中要繪製我的綠色視圖,必然是要設置綠色視圖的frame的起點(也就是綠色視圖左上角箭頭標註出的位置)。假如說現在我設置爲(200,200),那麼這個點是相對於原點(0,0)來說的,正如藍色框框所標出的原點。 當然你也可以說根據左上角那個點(10,20),我也能知道(200,200)點在哪裏。這也是ok的。


關鍵你要理解我們修改了灰色視圖的bounce中的origin,就是在指定灰色視圖左上角那個點表示多少!

2.當決定了子視圖在父視圖的位置,改變父視圖的bounce

3-3

還是接着上圖,不過這裏可能需要我一點想象力。首先灰色視圖bounce(0,0,320,568),在上面添加一個綠色子視圖frame=(200,50,50,50)

現在重新設置bounce爲(40,40,320,568)。正如上文所提到的灰色視圖左上角那個座標點爲(40,40)。那麼原點(0,0)應該在我們看不到的左上角 對吧(想象下)?那麼綠色視圖的(200,50)位置也要跟着改變,應該向左上角移動。

如果還不清楚,那麼這麼幹:
首先灰色視圖左上角點從(0,0)改爲(40,40),你知道(200,50)這個點在灰色視圖中的位置嗎?

不知道?那麼這麼幹

既然灰色視圖左上角點座標是(40,40),那麼原點(0,0)在哪裏?當你標註出原點之後,在標出(200,50)這個點。你會發現它的位置較原來向左上角移動了!

接下來還得整contentInset 和 contentOffset 。。。。。。

發佈了75 篇原創文章 · 獲贊 70 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章