如何自定義View

5iOS第五天—自定義View以及KVC&KVO

xib的基本使用

xib的基本使用.png
  • 什么是xib?

    • xib就是縮小版的storyboard。
  • Xib和storyboard對比

    • 共同點:

      • 都用來描述軟件界面
      • 都用Interface Builder工具來編輯
      • 本質都是轉換成代碼去創建控件
    • 不同點

      • Xib是輕量級的,用來描述局部的UI界面
      • Storyboard是重量級的,用來描述整個軟件的多個界面,并且能展示多個界面之間的跳轉關系
  • Xib的加載

    • 方法1

    NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"xib文件名" owner:nil options:nil]
    ```

    • 方法2

    UINib *nib = [UINib nibWithNibName:@"xib文件名" bundle:nil];
    NSArray *views = [nib instantiateWithOwner:nil options:nil];
    ```

  • 使用xib自定義view的步驟

    • 新建自定義控件類
    • 新建xib文件(文件名建議和view的類名一致)

這時就可以在xib空文件中畫自己想要的控件
- 修改xib中view的類名
- 封裝xib的加載過程
- 增加模型屬性,在模型屬性set方法中設置數據到子控件上

  • 使用xib的注意點
    • 一個控件有2種創建方式

      • 通過代碼創建

        • 初始化時一定會調用initWithFrame:方法
      • 通過xib\storyboard創建

        • 初始化時不會調用initWithFrame:方法,只會調用initWithCoder:方法
        • 初始化完畢后會調用awakeFromNib方法
    • 有時候希望在控件初始化時做一些初始化操作,比如添加子控件、設置基本屬性,這時需要根據控件的創建方式,來選擇在initWithFrame:、initWithCoder:、awakeFromNib的哪個方法中操作

簡單的漸變動畫代碼實現

  • 一般為了避免控件位置尺寸變化的太突然以及添加一些特殊效果,我們要給變化過程加以控制,使其平緩過渡,一般只有frame和alpha這兩個屬性可以進行漸變動畫。

    • 方式1: 首尾式

    [UIView beginAnimations:nil context:nil];

    //執行動畫
    CGRect tempFrame = self.redView.frame;
    tempFrame.origin.y += 50;
    self.redView.frame = tempFrame;

    [UIView commitAnimations];
    ```

    • 方式2: 回調式

    [UIView animateWithDuration:0.5 animations:^{
    //執行動畫
    CGRect tempFrame = self.redView.frame;
    tempFrame.origin.y += 50;
    self.redView.frame = tempFrame;
    }];
    //動畫完成之后還有操作
    [UIView animateWithDuration:0.5 animations:^{
    //執行動畫
    CGRect tempFrame = self.redView.frame;
    tempFrame.origin.y += 50;
    self.redView.frame = tempFrame;
    } completion:^(BOOL finished) {
    self.redView.backgroundColor = [UIColor blueColor];
    }];
    ```

  • 漸變動畫的幾種常用形式

    • UIViewAnimationOptionCurveEaseInOut 開始和結束比較慢,中間比較快
    • UIViewAnimationOptionCurveEaseIn 開場比較慢,后面比較快
    • UIViewAnimationOptionCurveEaseOut 開場正常,結尾比較慢
    • UIViewAnimationOptionCurveLinear 線性----> 勻速

UIButton補充——內邊距調整

  • 可在屬性欄里調整
內邊距.png
  • 可通過代碼調整
    //調整整體內容
    self.button.contentEdgeInsets = UIEdgeInsetsMake(10, 5, 0, 0);
    //調整Button內部圖片的
    self.button.imageEdgeInsets = UIEdgeInsetsMake(5, 16, 0, 0);
    //調整button標題的
    self.button.titleEdgeInsets = UIEdgeInsetsMake(10, 5, 0, 0);
    

圖片拉伸問題的解決方法

  • 當小圖片被拉伸到很大尺寸的時候,這時候像素會變的很低,圖片變得模糊,實際上往往會遇到圖片適配不上imageView范圍,因此會自動填充放大,導致圖片邊角變模糊問題。為了解決這個問題,我們讓圖片在拉伸的時候,設置中心附近1X1像素的區域隨著拉伸而拉伸,其他區域不被拉伸,這樣就保證了邊緣的清晰度,圖片看起來更美觀。那么中心附近的1X1的區域是怎么計算出來的呢?我們規定一張圖片(上半部分)和(下半部分-1)不被拉伸,規定(左半部分)和(右半部分-1)不被拉伸,那么就有1X1區域沒有被包含在內,因此這個區域會被拉伸

  • 代碼實現

    // 方式1:
    UIImage *image = [UIImage imageNamed:@"chat_send_nor"];
    // 作用: 根據傳入需要保護的區域返回一張受保護的圖片
    UIEdgeInsets edgeInsets = UIEdgeInsetsMake(image.size.height * 0.5, image.size.width * 0.5, image.size.height * 0.5 -1, image.size.width * 0.5 -1);
    /*
     UIImageResizingModeTile,  以平鋪的方式進行拉伸
     UIImageResizingModeStretch, 直接拉伸平鋪
     */
    UIImage *protectImage = [image resizableImageWithCapInsets:edgeInsets resizingMode:UIImageResizingModeTile];
    self.imageView.image = protectImage;
    
    //方式二
    UIImage *image = [UIImage imageNamed:@"chat_send_nor"];
    // rightCapWidth = width - leftCapWidth - 1
    // bottomCapWidth = height - topCapWidth - 1
    UIImage *protectImage = [image stretchableImageWithLeftCapWidth:image.size.width * 0.5 topCapHeight:image.size.height *0.5];
    self.imageView.image = protectImage;
    
    • 方式三:給UIImage類添加分類,引用上兩種代碼實現
    • 方式四:直接在AppIcon選中圖片在屬性欄中的slicing(切片)屬性進行調整
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容