iOS開發經驗(12)-顯示模式

目錄

  1. contentMode-顯示模式
  2. 背景圖片的拉伸
  3. textAligment-顯示模式
  4. lineBreakMode-顯示模式
  5. contentHorizontalAlignment\contentVerticalAlignment-顯示模式
1.contentMode : 內容模式(控制內容的對齊方式), 一般對UIImageView很有用
typedef NS_ENUM(NSInteger, UIViewContentMode) {
//圖片拉伸填充至整個UIImageView(圖片可能會變形),這也是默認的屬性,如果什么都不設置就是它在起作用
    UIViewContentModeScaleToFill,
//圖片拉伸至完全顯示在UIImageView里面為止(圖片不會變形)
    UIViewContentModeScaleAspectFit,
//圖片拉伸至圖片的的寬度或者高度等于UIImageView的寬度或者高度為止.看圖片的寬高哪一邊最接近UIImageView的寬高,一個屬性相等后另一個就停止拉伸.
    UIViewContentModeScaleAspectFill,
//調用setNeedsDisplay 方法時,就會重新渲染圖片

//下面的屬性都是不會拉伸圖片的
這樣設置圖片不會拉伸或者壓縮,就是按照imageView的frame和圖片的大小來居中顯示的
這里有兩種情況:
圖片比view的區域更大。這個時候會截取圖片的中間部位顯示在frame區域里面。
圖片比view的區域更小。這個時候圖片會完整的顯示在frame的中間位置。
    UIViewContentModeRedraw,
//中間模式
    UIViewContentModeCenter, 
//頂部
    UIViewContentModeTop,
//底部
    UIViewContentModeBottom,
//左邊
    UIViewContentModeLeft,
//右邊
    UIViewContentModeRight,
//左上
    UIViewContentModeTopLeft,
//右上
    UIViewContentModeTopRight,
//左下
    UIViewContentModeBottomLeft,
//右下
    UIViewContentModeBottomRight,
};

總結所有顯示模式的特點:

  1. 不帶Scale的是較為簡單一些,按照這些顯示模式來顯示,圖片會按照原大小來顯示,不會被拉伸也不會被壓縮,常用的是UIViewContentModeCenter

  2. 下面著重介紹帶有Scale字眼的模式(圖片會被拉伸或者壓縮)
    帶有Scale的三個模式中:
    有一個是不帶有Aspect字眼的UIViewContentModeScaleToFill
    它在拉伸的時候不會按照比例(圖片會變形)
    然后非常單純的把整個ImageView填滿:

  3. 另外兩個帶有Aspect字眼
    他們被拉伸的時候圖片的比例不會改變(圖片不變形)
    UIViewContentModeScaleAspectFit,圖片會完全顯示,圖片等比例縮小至寬等于ImageView的寬或者高等于ImageView的高為止。

  4. UIViewContentModeScaleAspectFill
    圖片也會完全顯示(超出控件部分也會顯示)
    圖片等比例拉伸至寬等于ImageView的寬
    或者高等于imageview的高為止

由此可以得出枚舉最前面三個屬性是會拉伸(縮放)圖片的,其余的屬性是不會拉伸圖片.同時可以總結出兩點:
1.凡是帶有scale單詞的屬性,圖片都會被拉伸;
2.凡是帶有Ascept單詞屬性,圖片會保持原來的寬高比,即圖片不會變形.
最后如果想讓圖片占滿整個父容器,并且不變形,可以采用一種折中的方式:

self.leftImageView.contentMode =UIViewContentModeScaleAspectFill;
//超出容器范圍的切除掉
self.leftImageView.clipsToBounds = YES; 
2. 背景圖片的拉伸

這里給介紹2種拉伸圖片的方法:

方法一:
resizableImageWithCapInsets: resizingMode:
UIImage實例調用的方法,返回拉伸后的image。
capInsets參數表示圖片上下左右分別要保護的寬度或者高度(保持不變的邊距),沒被保護的地方會進行拉伸。
resizingMode表示拉伸的部位是以何種方式顯示,有平鋪和拉伸兩種選擇,分別為UIImageResizingModeTileUIImageResizingModeStretch,其中UIImageResizingModeTile表示平鋪,而UIImageResizingModeStretch表示拉伸。
結合圖片來說,它是一個上(top)、左(left)、下(bottom)、右(right)的逆時針結構,即頂部保護圖片高度的一半,左邊保護圖片寬度的一半,下面保護圖片高度的一半再減去1個像素,右邊保護圖片寬度的一半再減去一個像素:

UIEdgeInsets insets =UIEdgeInsetsMake(imageHeight * 0.5, imageWidth * 0.5, imageHeight * 0.5 -1, imageWidth * 0.5 - 1);
//指定為拉伸模式,伸縮后重新賦值
UIImage * image = [image1 resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch];

方法二:
stretchableImageWithLeftCapWidth: topCapHeight:
也是UIImage實例調用的方法,返回拉伸后的image。
兩個參數分別表示要左邊和上邊被保護起來(不會變形)的寬度和高度。
使用這個方法只會拉伸一個像素點,設置左邊和上邊的包括寬高后,右邊和下邊的保護寬高分別是:

right = width - left - 1,
bottom = height - top - 1,

所以其實拉伸的只有中間一個像素點。

UIImage *bumble = [UIImage imageNamed:@"SenderImageNodeMask"];
imageview.image = [bumble stretchableImageWithLeftCapWidth:floorf(bumble.size.width/2) topCapHeight:floorf(bumble.size.height/2+10)];

區別:
方法一拉伸的是一塊區域,其中有個被保護的不被拉伸的區域;方法二拉伸的是一個像素點,其余區域不被拉伸。

3. textAligment:文字顯示模式

擁有textAligment屬性的控件(能夠顯示文字的一般都有):
UITextField,UILabel,UITextView

NSTextAlignmentLeft      = 0,    // 左對齊
NSTextAlignmentCenter    = 1, // 居中對齊
NSTextAlignmentRight    = 2,   // 右對齊
NSTextAlignmentJustified = 3, // 充滿view來顯示
4. lineBreakMode
label.lineBreakMode = NSLineBreakByCharWrapping; 
//以字符為顯示單位顯示,后面部分省略不顯示。
label.lineBreakMode = NSLineBreakByClipping; 
//剪切與文本寬度相同的內容長度,后半部分被刪除。
label.lineBreakMode = NSLineBreakByTruncatingHead; 
//前面部分文字以……方式省略,顯示尾部文字內容。
label.lineBreakMode = NSLineBreakByTruncatingMiddle; 
//中間的內容以……方式省略,顯示頭尾的文字內容。
label.lineBreakMode = NSLineBreakByTruncatingTail;
 //結尾部分的內容以……方式省略,顯示頭的文字內容。
label.lineBreakMode = NSLineBreakByWordWrapping; 
//以單詞為顯示單位顯示,后面部分省略不顯示。
5. contentHorizontalAlignment\contentVerticalAlignment

contentHorizontalAlignmentcontentVerticalAlignment:內容的水平垂直顯示模式。
擁有contentHorizontalAlignment、contentVerticalAlignment屬性的控件(繼承自UIControl的控件或者UIControl本身):

UIControl
UIButton
UITextField

使用較為常見的就是Button的內容顯示模式,Button里面有ImageViewLabel兩個子控件需要顯示。
我們可以分別設置常用的ImageViewcontentMode(下面介紹這個屬性):
LabeltextAligment但是要將他們作為一個整體來控制,就需要Button的屬性contentHorizontalAlignment、contentVerticalAlignment

typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) {
//垂直方向
UIControlContentVerticalAlignmentCenter = 0, 
UIControlContentVerticalAlignmentTop = 1, 
UIControlContentVerticalAlignmentBottom = 2, 
UIControlContentVerticalAlignmentFill = 3,
};
typedef NS_ENUM(NSInteger, UIControlContentHorizontalAlignment) {
//水平方向 
UIControlContentHorizontalAlignmentCenter = 0, 
UIControlContentHorizontalAlignmentLeft = 1, 
UIControlContentHorizontalAlignmentRight = 2, 
UIControlContentHorizontalAlignmentFill = 3,
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,251評論 4 61
  • 初學者經常糾結于各種控件的各種顯示模式,居中還是居上靠左還是靠右? 在此徹底總結一下: textAligment:...
    王技術閱讀 7,108評論 4 10
  • 項目中常常會遇到字數統計計算問題,多行文本限制最大長度問題。最常見的計算方法是:中文字符算兩個字,英文字符算一個字...
    _二向箔_閱讀 1,884評論 0 2
  • 無意中打開歌單,發現自己的曲庫真是皺巴的可憐。僅有的十幾首歌艱難的支撐著門面,可能你會說我無病呻吟,也可能會說我文...
    吳世升飛閱讀 20,704評論 47 120
  • 掙扎了幾分鐘,本打算不寫了,但想想自己當初立下的承諾,每天千字,差點到第七天因為房子的事情搞得愁腸滿腹,但也還是要...
    Ivy0927閱讀 283評論 0 0