目錄
- contentMode-顯示模式
- 背景圖片的拉伸
- textAligment-顯示模式
- lineBreakMode-顯示模式
- 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,
};
總結所有顯示模式的特點:
不帶
Scale
的是較為簡單一些,按照這些顯示模式來顯示,圖片會按照原大小來顯示,不會被拉伸也不會被壓縮,常用的是UIViewContentModeCenter
;下面著重介紹帶有
Scale
字眼的模式(圖片會被拉伸或者壓縮)
帶有Scale的三個模式中:
有一個是不帶有Aspect
字眼的UIViewContentModeScaleToFill
它在拉伸的時候不會按照比例(圖片會變形)
然后非常單純的把整個ImageView
填滿:另外兩個帶有
Aspect
字眼
他們被拉伸的時候圖片的比例不會改變(圖片不變形)
UIViewContentModeScaleAspectFit
,圖片會完全顯示,圖片等比例縮小至寬等于ImageView
的寬或者高等于ImageView
的高為止。UIViewContentModeScaleAspectFill
圖片也會完全顯示(超出控件部分也會顯示)
圖片等比例拉伸至寬等于ImageView
的寬
或者高等于imageview
的高為止
由此可以得出枚舉最前面三個屬性是會拉伸(縮放)圖片的,其余的屬性是不會拉伸圖片.同時可以總結出兩點:
1.凡是帶有scale
單詞的屬性,圖片都會被拉伸;
2.凡是帶有Ascept
單詞屬性,圖片會保持原來的寬高比,即圖片不會變形.
最后如果想讓圖片占滿整個父容器,并且不變形,可以采用一種折中
的方式:
self.leftImageView.contentMode =UIViewContentModeScaleAspectFill;
//超出容器范圍的切除掉
self.leftImageView.clipsToBounds = YES;
2. 背景圖片的拉伸
這里給介紹2種拉伸圖片的方法:
方法一:
resizableImageWithCapInsets: resizingMode:
是UIImage
實例調用的方法,返回拉伸后的image
。
capInsets
參數表示圖片上下左右分別要保護的寬度或者高度(保持不變的邊距),沒被保護的地方會進行拉伸。
resizingMode
表示拉伸的部位是以何種方式顯示,有平鋪和拉伸兩種選擇,分別為UIImageResizingModeTile
和 UIImageResizingModeStretch
,其中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
contentHorizontalAlignment
、contentVerticalAlignment
:內容的水平垂直顯示模式。
擁有contentHorizontalAlignment
、contentVerticalAlignment
屬性的控件(繼承自UIControl
的控件或者UIControl
本身):
UIControl
UIButton
UITextField
使用較為常見的就是Button
的內容顯示模式,Button
里面有ImageView
和Label
兩個子控件需要顯示。
我們可以分別設置常用的ImageView
的contentMode
(下面介紹這個屬性):
Label
的textAligment
但是要將他們作為一個整體來控制,就需要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,
};