我正在做的是使用从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];
}
答案 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];
这是一些简单而重要的步骤:
我可以使用此代码替换横向和纵向宽高比的图像,而不会出现对齐或裁剪问题。