如何在 iOS 上仅水平拉伸时垂直平铺 UIImage?
Posted
技术标签:
【中文标题】如何在 iOS 上仅水平拉伸时垂直平铺 UIImage?【英文标题】:How to tile a UIImage vertically while only streching horizontally on iOS? 【发布时间】:2013-03-22 21:23:48 【问题描述】:我有一个可以在水平方向拉伸的图像,但需要垂直平铺(一个在另一个之上)以填充我的视图。我怎么能这样做?
我知道使用-(UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets
方法可以调整图像的大小。所以这对水平方向很有效,但该方法不能用于垂直方向,它确实需要平铺,而不是在垂直方向拉伸才能工作。
现在我的想法是运行一个循环来创建一个带有水平拉伸图像的 UIImageView,然后简单地调整 frame.origin.y 属性,然后将它添加为每个循环的子视图,直到我离开超过视图的高度。然而,这似乎是一种过于复杂的方法,并且在需要调整视图大小时(例如在 iPad 旋转上)确实不实用
在 ios 6.x 上是否有更简单、更有效的方法?
【问题讨论】:
【参考方案1】:我用它在 UIImageView 中水平平铺图像:
UIImage *image = [UIImage imageNamed:@"my_image"];
UIImage *tiledImage = [image resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeTile];
UIImageView *imageView = [[UIImageView alloc] initWithImage:tiledImage];
这假设您将 UIImageView 的框架设置为比您的图像资源更大的尺寸。如果高度高于您的图像,它也会垂直平铺。
【讨论】:
【参考方案2】:您是否考虑过使用UIColor 的方法colorWithPatternImage:
来创建重复图案并只传递具有正确水平宽度的图像?
代码示例:
// On your desired View Controller
- (void)viewDidLoad
[super viewDidLoad];
UIImage *patternImage = [UIImage imageNamed:@"repeating_pattern"];
self.view.backgroundColor = [UIColor colorWithPatternImage:patternImage];
// ... do your other stuff here...
【讨论】:
是的,我有,这种方法的问题是我需要一个我支持的每个视图宽度的图像。所以在这种情况下,iPhone 是 320px,然后是 iPad 的水平和垂直宽度。三个可能听起来不多,但我希望我的代码能够适应任何情况。基本上我想在未来证明它。 这里有一个权衡。像这样设置 backgroundColor 会导致a leak in your application。我还不确定有更好的选择,所以这只是为了让你知道。【参考方案3】:UIImage *image = [UIImage imageNamed:@"test.png"];
UIImage *resizableImage = [image resizableImageWithCapInsets:UIEdgeInsetsMake(0, image.size.width / 2, 0, image.size.width / 2)];
【讨论】:
不解决,因为它在中间拉伸,而不是垂直重复【参考方案4】:所以我想出了一个解决方案。我认为这有点笨拙,但它确实有效。
基本上,我所做的是创建我的可拉伸图像,并指定了左右大写字母。然后我用它初始化一个 UIImageView 。然后我将图像视图的框架调整到所需的宽度。这将适当地调整其中包含的图像的大小。
最后我使用了一段我发现的代码,它通过垂直平铺现在包含在图像视图中的调整后的图像来创建一个新图像。请注意,我如何使用 UIImageView 视图的 image 属性而不是访问原始 UIImage。
最后一件事就是将新的 UIImage 设置为视图的图案背景色
代码如下:
// create a strechable image
UIImage *image = [[UIImage imageNamed:@"progressBackgroundTop@2x.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 60, 0, 60)];
// create the image view that will contain it
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
CGRect frame = imageView.frame;
frame.size.width = self.view.bounds.size.width;
imageView.frame = frame;
// create the tiled image
CGSize imageViewSize = imageView.bounds.size;
UIGraphicsBeginImageContext(imageViewSize);
CGContextRef imageContext = UIGraphicsGetCurrentContext();
CGContextDrawTiledImage(imageContext, (CGRect) CGPointZero, imageViewSize , imageView.image.CGImage);
UIImage *finishedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.view.backgroundColor = [UIColor colorWithPatternImage:finishedImage];
【讨论】:
我很确定imageView.image.CGImage
应该与image.CGImage
相同;魔法发生在别处。
@gossainapps 查看我的答案。 =)以上是关于如何在 iOS 上仅水平拉伸时垂直平铺 UIImage?的主要内容,如果未能解决你的问题,请参考以下文章