我有一个平铺的全屏背景图像,即它必须在水平和垂直方向上再现几次才能制作一个大图像。就像在丑陋的主页上的浏览器一样;)
UIImageView是我的朋友吗?
答案 0 :(得分:103)
如果我正确理解您的问题,您可以colorWithPatternImage:
使用UIColor
,然后在UIView
上设置背景颜色。
如果您必须使用UIImageView
,则可以执行相同操作,但无论您在图像视图中放置的图像是否会在平铺图像前绘制。
答案 1 :(得分:30)
要使alpha与模式图像一起使用,请确保您具有以下设置:
view.backgroundColor = [UIColor colorWithPatternImage:aImage];
view.layer.opaque = NO;
答案 2 :(得分:16)
多年来我一直使用Bill Dudney的方法,但iOS 6有更好的解决方案。而且......今天我找到了一种方法,可以在旧版本的iOS上使用它。
的UIImage + Tileable.h
#import <UIKit/UIKit.h>
@interface UIImage (Tileable)
-(UIImage*) imageResizingModeTile;
@end
的UIImage + Tileable.m
#import "UIImage+Tileable.h"
@implementation UIImage (Tileable)
-(UIImage*) imageResizingModeTile
{
float iOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if( iOSVersion >= 6.0f )
{
return [self resizableImageWithCapInsets:UIEdgeInsetsZero resizingMode:UIImageResizingModeTile];
}
else
{
return [self resizableImageWithCapInsets:UIEdgeInsetsZero];
}
}
@end
答案 3 :(得分:4)
由于我非常喜欢Interface Builder,因此我创建了这个UIImageView
子类来应用平铺背景:
@interface PETiledImageView : UIImageView
@end
@implementation PETiledImageView
- (void)awakeFromNib
{
[super awakeFromNib];
UIImage * imageToTile = self.image;
self.image = nil;
UIColor * tiledColor = [UIColor colorWithPatternImage:imageToTile];
self.backgroundColor = tiledColor;
}
@end
我尝试覆盖setImage:
但似乎IB在解码Nib文件时没有调用它。
答案 4 :(得分:2)
在WWDC 2018 video session 219 - Image and Graphics Best Practices中,Apple工程师明确建议不要将图案颜色用于平铺背景:
我建议不要在UIView上使用具有背景颜色属性的图案化颜色。而是创建一个UIImageView。将图像分配到该图像视图。并使用UIImageView上的函数适当地设置您的切片参数。
因此,创建平铺背景的最佳和最简单方法是:
imageView.image = image.resizableImage(withCapInsets: .zero, resizingMode: .tile)
或更简单的是,如果您使用资产目录,请选择图案图像资产,然后在“属性”检查器中启用切片(水平/垂直或两者),将插图设置为零,将宽度设置为/高度到图片的尺寸:
然后只需将此图像分配到您的图像视图(Interface Builder也可以),只是不要忘记将UIImageView的contentMode
设置为.scaleToFill
。
答案 5 :(得分:0)
丹尼尔T解决方案的Swift版本。您仍需要在IB中设置keyPath值。当然,您可以更小心地展开Optional UIImage。
extension UIView {
var colorPattern:String {
get {
return "" // Not useful here.
}
set {
self.backgroundColor = UIColor(patternImage: UIImage(named:newValue)!)
}
}
}