如何用IOS中的横向图像填充背景?

时间:2013-04-15 13:08:47

标签: ios objective-c cocoa-touch orientation uiimagepickercontroller

我正在做的是使用从UIImagePickerController返回的图像在视图的背景中创建填充。在纵向模式下图像填充正常;但是,在横向模式下作为背景填充时,图像会重复,但我不知道为什么会出现这种情况。这是我用来调整图像大小的私有方法。

+ (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];
}

3 个答案:

答案 0 :(得分: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 :(得分:1)

由于图片正在填充背景视图,因此

UIViewContentModeScaleAspectFill可能比UIViewContentModeScaleAspectFit更合适。 AspectFit将保持图像的纵横比,并使整个图像适合空间,这可能使视图的某些部分透明。 AspectFill也保持纵横比,但会填充整个视图并剪切图像中与视图边界不匹配的任何部分。

答案 2 :(得分:1)

通过组合一些AVFoundation和UIKit API,我已经能够将“方面适合”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结合使用以缩放图像。使用图像的.size和目标UIView的边界提供AVMakeRect ...()。
  4. 将调整后的图像应用于所需的图像上下文。
  5. 使用colorWithPatternImage将现已调整大小的图像应用于目标UIView的.backgroundColor。
  6. 我可以使用此代码替换横向和纵向宽高比的图像,而不会出现对齐或裁剪问题。

相关问题