ios中圖片拉伸的幾種方式

1. UIImageView總體拉伸git

UIImageView-contentModegithub

typedef NS_ENUM(NSInteger, UIViewContentMode) {
    UIViewContentModeScaleToFill,         // 默認 拉伸(會變形)
    UIViewContentModeScaleAspectFit,      // 等比例拉伸
    UIViewContentModeScaleAspectFill,     // 等比例填充
    UIViewContentModeRedraw,              // redraw on bounds change (這個不清楚) 
    UIViewContentModeCenter,              // 下面的就是不拉伸按位置顯示了
    UIViewContentModeTop,
    UIViewContentModeBottom,
    UIViewContentModeLeft,
    UIViewContentModeRight,
    UIViewContentModeTopLeft,
    UIViewContentModeTopRight,
    UIViewContentModeBottomLeft,
    UIViewContentModeBottomRight,
};

demo:https://github.com/vitoziv/VICMAImageView app

2. UIImage局部拉伸spa

// 按4邊間距顯示不拉伸的區域
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets NS_AVAILABLE_IOS(5_0); 
// 按2點拉伸
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode;
// 拉伸模式
typedef NS_ENUM(NSInteger, UIImageResizingMode) {
    UIImageResizingModeTile,//進行區域複製模式拉伸
    UIImageResizingModeStretch,//進行漸變複製模式拉伸
};

3.UIImage修改大小code

//內縮放,一條變等於最長邊,另一條小於等於最長邊
- (UIImage *)scaleToSize:(CGSize)newSize {
    CGFloat width = self.size.width;
    CGFloat height= self.size.height;
    CGFloat newSizeWidth = newSize.width;
    CGFloat newSizeHeight= newSize.height;
    if (width <= newSizeWidth &&
        height <= newSizeHeight) {
        return self;
    }
    
    if (width == 0 || height == 0 || newSizeHeight == 0 || newSizeWidth == 0) {
        return nil;
    }
    CGSize size;
    if (width / height > newSizeWidth / newSizeHeight) {
        size = CGSizeMake(newSizeWidth, newSizeWidth * height / width);
    } else {
        size = CGSizeMake(newSizeHeight * width / height, newSizeHeight);
    }
    return [self drawImageWithSize:size];
}
- (UIImage *)drawImageWithSize: (CGSize)size {
    CGSize drawSize = CGSizeMake(floor(size.width), floor(size.height));
    UIGraphicsBeginImageContext(drawSize);
    
    [self drawInRect:CGRectMake(0, 0, drawSize.width, drawSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

4.images.xcassetsorm

多虧了Xcode中Asset Catalog的slice和dice,咱們不須要代碼也能拉伸圖片。首先在Xcode中選中圖片,而後點擊右下角的Show Slicing:圖片

你如今應該能看到slicing 面板和一個按鈕"Start Slicing"。ci

在你點擊按鈕以後,會顯示下面的三個選項:get

左邊的按鈕用於horizontal edge insets,右邊的按鈕用於vertical edge insets,中間的則是兩個都有。在咱們的例子中要保留圓角,因此咱們按中間的按鈕,告訴系統咱們想要按鈕的中間在水平和垂直方向拉伸。在按下按鈕以後,就能看到一些能夠拖動的細條,這能夠設置從哪裏開始拉伸圖片。it


系統會保留深紫色的區域,淺紫色的區域會被拉伸。

更厲害的是,Xcode自動找到了圓角,因此咱們不須要設置從哪裏開始拉伸圖片。最後別忘了在Attribtues pane中設置圖片是可拉伸的。

若是我是你的話,我就會嘗試並習慣這個功能。有了這個無價之寶,你就不用再在resizableImageWithCapInsets方法中填寫那些神奇的數字了,也能幫助你分離view邏輯和app邏輯。

相關文章
相關標籤/搜索