平铺背景图片:我可以使用UIImageView轻松完成吗?

时间:2009-07-14 13:02:00

标签: iphone uiimageview

我有一个平铺的全屏背景图像,即它必须在水平和垂直方向上再现几次才能制作一个大图像。就像在丑陋的主页上的浏览器一样;)

UIImageView是我的朋友吗?

6 个答案:

答案 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上使用它。

  1. 创建新类“UIImage + Tileable”(下面的复制/粘贴源)
  2. 在任何需要带有tileable图像的UIImageView的类中导入它。这是一个类别,因此它使用标准Apple调用将所有UIImage“升级”为可格式化的
  3. 如果您想要图片的“平铺”版本,请致电:“image = [image imageResizingModeTile]”
  4. 的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)!)
        }
    }
}