1

我正在做的是用從UIImagePickerController返回的圖像在視圖的背景中創建填充。圖像在肖像模式下可以很好地填充;然而,當以橫向模式填充背景時,圖像會重複,但我不知道爲什麼會出現這種情況。這是我用來調整圖像大小的私人方法。如何在IOS中使用橫向圖像填充背景?

+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize landscape:(BOOL)landscape { 
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0); 
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 

當調用此方法時,newsize參數等於視圖邊界大小(self.view.bounds.size)。在視圖轉換爲橫向後訪問大小,但圖像不正確。

這是從UIImagePickerController獲取圖像後調用的代碼。

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    if (image.size.width > image.size.height) { 
     self.view.transform = CGAffineTransformRotate(self.view.transform, M_PI_2); 
     self.composition.landscapemode = YES; 
    } else { 
     self.composition.landscapemode = NO; 
    } 
    self.composition.image = [NewCompositionViewController imageWithImage:image scaledToSize:self.view.bounds.size landscape:self.composition.landscapemode]; 
    self.view.backgroundColor = [UIColor colorWithPatternImage:self.composition.image]; 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

回答

2

[UIColor colorWithPatternImage:]是爲平鋪圖像,所以它的行爲,因爲它應該。

我會建議創建與屏幕大小的框架一個UIImageView,圖像設置它,將它添加爲子視圖:

UIImageView *backgroundImage = [[UIImageView alloc] initWithFrame:self.view.frame]; 
[backgroundImage setImage:self.composition.image]; 

// choose best mode that works for you 
[backgroundImage setContentMode:UIViewContentModeScaleAspectFill]; 

[self.view insertSubview:backgroundImage atIndex:0]; 
//OR 
[self.view addSubview:backgroundImage]; 
[self.view sendSubviewToBack:backgroundImage]; 

一旦它的加入,可以用自動尺寸口罩,使旋轉它和實驗確保它適用於所有方向。確切的方法取決於您是否使用自動佈局。

1

UIViewContentModeScaleAspectFill在此可能比UIViewContentModeScaleAspectFit更合適,因爲圖像正在填充背景視圖。 AspectFit將保持圖像的寬高比並使整個圖像適合空間,這可能會使視圖的某些部分透明。 AspectFill也保持寬高比,但會填充整個視圖並剪切圖像中與視圖邊界不匹配的任何部分。

1

我已經能夠通過結合一些AVFoundation和UIKit API來將「aspect fit」UIImage應用於UIView背景。這裏有一個例子:

UIImage *image = [UIImage imageWithContentsOfFile:self.desiredBackgroundImageFilePathString]; 

UIGraphicsBeginImageContext(self.drawingImage.frame.size); 
[image drawInRect:AVMakeRectWithAspectRatioInsideRect(image.size, self.drawingImage.bounds)]; 
image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

self.drawingImage.backgroundColor = [UIColor colorWithPatternImage:image]; 

這流經幾個簡單的,但重要的步驟:

  1. 生成一個文件(或其他)一個UIImage。
  2. 使用UIGraphicsBeginImageContext()定義圖像的背景(所需的背景UIView)。
  3. 將drawInRect與AVMakeRectWithAspectRatioInsideRect結合使用來縮放圖像。提供AVMakeRect ...()與圖像的.size和目標UIView的邊界。
  4. 將調整大小的圖像應用到所需的圖像上下文。
  5. 使用colorWithPatternImage將現在調整大小的圖像應用於目標UIView的.backgroundColor。

我可以使用橫向和縱向寬高比替換圖像,無需使用此代碼進行對齊或裁剪問題。