自定義UIView

UIView相當(dāng)于一個<div>, 自定義UIView, 其實就是寫一個組件索抓,向里面添加一些子UIView, 并自動響應(yīng)事件抒和,刷新布局崇决。
自定義 UIVIew 其實就是把自己做為一個容器啦扬,進(jìn)行組合其它的標(biāo)簽形成的一個多元結(jié)構(gòu)
也不排除使用繪圖功能來創(chuàng)建自繪組件互例。

一吓妆、最重要的生命周期鉤子 layoutSubviews

layoutSubviews 的意義在于需要的時候重新調(diào)整子 uiview 的布局鹅心, 來響應(yīng)根 view 的大小變化储狭。
記得一定要調(diào)用父組件的 [super layoutSubviews], 因為可能父類不一定是 uiview這個空組件。
這個鉤子的意義在于更新子組件的大小與位置释移,與子組件的其它屬性關(guān)系不大叭披,除非強(qiáng)制要關(guān)聯(lián)一些與大小相關(guān)的響應(yīng),其實這個鉤子就是手動約束子元素的空間屬性玩讳。

那么什么時候會觸發(fā)這個鉤子呢?

  • 手動調(diào)用組件的 [self setNeedsLayout] 的時候趋观,強(qiáng)制重新調(diào)整內(nèi)容布局扛禽。
  • 添加子元素 addSubview 的時候,因為內(nèi)容變化了皱坛,系統(tǒng)認(rèn)為要自動觸發(fā)一次编曼。
  • 組件 frame 任何一個分量變化的時候,子元素必須響應(yīng)剩辟,所以也會調(diào)用一次掐场,但記住使用為 0x0的時候可能不會觸發(fā),系統(tǒng)認(rèn)為這個時候不可見贩猎,不用觸發(fā)熊户。約束會自動調(diào)整frame,所以也會進(jìn)入吭服。
  • 滾動UIScrollViwe 的時候嚷堡,因為可能有一些懸停效果 fixed, 所以也會進(jìn)入到這里面。
  • 旋轉(zhuǎn)屏幕可能會進(jìn)入艇棕,

二蝌戒、UILabel 的自適應(yīng)大小

在布局UILable 的時候,我們總得知道這個元素的大小沼琉。

要知道一個標(biāo)簽應(yīng)該的大小北苟,首先要置入一個虛擬容器中,這樣才有可能算出充滿容器時應(yīng)該的大小打瘪。

計算方法有兩類

1友鼻、 NSString 的方法。
  • sizeWithFont 這個方法已棄用在 iOS7的時候

  • 使用更強(qiáng)大的屬性文本大小計算
    這個貌似只能算單行的大小闺骚。

 CGSize size = [self.statusLabel.text sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:12.0f]}];
 CGSize statuseStrSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
  • 還有文本邊框矩形計算方法彩扔, 注意返回的是一個 CGRect
    還要注意屬性要和標(biāo)簽本身的屬性一樣僻爽,比如字體大小借杰,否則會算出來會有偏差
    算出來的是一個小數(shù),要用 ceil 方法向上取整进泼。
CGRect rect = [textToMeasure boundingRectWithSize:CGSizeMake(width, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:attributes
                                              context:nil];
2、 UILabel 的方法, 內(nèi)部應(yīng)該是使用上面的方法來實現(xiàn)的纤虽。
  • sizeThatFits, 這個方法應(yīng)該是邊框計算方法乳绕,內(nèi)部調(diào)用 boundingRectWithSize 實現(xiàn)
CGSize suggestedSize = [lb sizeThatFits:CGSizeMake(200, 30)];
  • [label sizeToFit], sizeToFit會自動調(diào)用sizeThatFits方法;
    它不返回值逼纸,直接把大小應(yīng)該到標(biāo)簽本身洋措。

二、UIImageView 的自適應(yīng)大小

一般指的是網(wǎng)絡(luò)圖片杰刽, 假如事先不知道圖片的大小(除非服務(wù)器返回圖片大小)菠发,無法去設(shè)置容器的大小王滤,只能在圖片加載回來后,再進(jìn)行調(diào)整滓鸠,調(diào)用 setNeedsLayout 進(jìn)行再次進(jìn)入 layoutSubviews 布局雁乡。

一般使用第三方組件比如 SDWebImage 來加載圖片,在回調(diào)中拿到大小再進(jìn)行設(shè)置糜俗。

三踱稍、組件結(jié)構(gòu)劃分

一個組件除了 layout 布局,還有種狀態(tài)悠抹、外觀修飾珠月,記得凡是修改了子組件的布局相關(guān)的屬性,都記得要手動去刷新重新計算布局楔敌。

四啤挎、使用圖形接口繪制容器本身

建議使用 CALayer 來實現(xiàn)自繪控件,而不要使用 drawRect卵凑,drawRect 會創(chuàng)建一個臨時圖像去存儲繪制內(nèi)容庆聘。

DrawRectDrawRect屬于CoreGraphic框架,占用CPU氛谜,消耗性能大, 引起內(nèi)存暴增掏觉。
CAShapeLayerCAShapeLayer屬于CoreAnimation框架,通過GPU來渲染圖形值漫,節(jié)省性能澳腹。動畫渲染直接提交給手機(jī)GPU,不消耗內(nèi)存杨何。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酱塔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子危虱,更是在濱河造成了極大的恐慌羊娃,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件埃跷,死亡現(xiàn)場離奇詭異蕊玷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)弥雹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門垃帅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剪勿,你說我怎么就攤上這事贸诚。” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵酱固,是天一觀的道長械念。 經(jīng)常有香客問我,道長运悲,這世上最難降的妖魔是什么龄减? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮扇苞,結(jié)果婚禮上欺殿,老公的妹妹穿的比我還像新娘。我一直安慰自己鳖敷,他們只是感情好脖苏,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著定踱,像睡著了一般棍潘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崖媚,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天亦歉,我揣著相機(jī)與錄音,去河邊找鬼畅哑。 笑死肴楷,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的荠呐。 我是一名探鬼主播赛蔫,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泥张!你這毒婦竟也來了呵恢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤媚创,失蹤者是張志新(化名)和其女友劉穎渗钉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钞钙,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鳄橘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了芒炼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘫怜。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖焕议,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤盅安,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布唤锉,位于F島的核電站,受9級特大地震影響别瞭,放射性物質(zhì)發(fā)生泄漏窿祥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一蝙寨、第九天 我趴在偏房一處隱蔽的房頂上張望晒衩。 院中可真熱鬧,春花似錦墙歪、人聲如沸听系。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽靠胜。三九已至,卻和暖如春毕源,著一層夾襖步出監(jiān)牢的瞬間浪漠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工霎褐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留址愿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓冻璃,卻偏偏與公主長得像响谓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俱饿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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