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。

我可以使用横向和纵向宽高比替换图像,无需使用此代码进行对齐或裁剪问题。