【问题标题】:Tiled Background Image: Can I do that easily with UIImageView?平铺背景图像:我可以使用 UIImageView 轻松做到这一点吗?
【发布时间】:2009-07-14 13:01:59
【问题描述】:

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

UIImageView 是我的朋友吗?

【问题讨论】:

    标签: iphone uiimageview


    【解决方案1】:

    如果我正确理解您的问题,您可以在UIColor 上使用colorWithPatternImage:,然后在UIView 上设置背景颜色。

    如果您必须使用UIImageView,您也可以这样做,但是您在图像视图中放置的任何图像都将绘制在平铺图像的前面。

    【讨论】:

    • 谢谢!那么我想做的是:我有一个带有图案的图像文件,可以垂直和水平重复。我想在我的屏幕上重复这个图像模式。也许它可以节省一些内存。
    • 如果您使用概述的 UIColor 方法,您的屏幕将充满图案图像。有更复杂的方法,但根据您的描述,这应该可行。
    • 您好,这可行,但图像的 Alpha 不起作用。 :( 任何解决方案
    • [[UIColor colorWithPatternImage:...] colorWithAlphaComponent:...]
    • 我们可以通过xib而不是通过编码来设置colorWithPatternImage吗?
    【解决方案2】:

    要让 alpha 与图案图像一起使用,请确保您具有以下设置:

    view.backgroundColor = [UIColor colorWithPatternImage:aImage];
    view.layer.opaque = NO;
    

    【讨论】:

    • 这个sn-p的最后两行一样的东西。
    • view.layer.opaque = NO; 占上风
    【解决方案3】:

    多年来我一直使用 Bill Dudney 的方法,但 iOS 6 有一个更好的解决方案。而且...今天我找到了一种方法,也可以在旧版本的 iOS 上进行这项工作。

    1. 创建新类“UIImage+Tileable”(复制/粘贴下面的源代码)
    2. 在任何你想要一个带有可平铺图像的 UIImageView 的类中导入它。它是一个类别,因此它使用标准 Apple 调用将所有 UIImage 都“升级”为可平铺的图像
    3. 如果您想要图像的“平铺”版本,请调用:“image = [image imageResizingModeTile]”

    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
    

    【讨论】:

    • 不错的解决方案,有什么想法可以将它用于 iOS 4 吗?
    • 我认为这适用于 iOS 4+,抱歉。它绝对适用于 5+。用 5 进行测试并确保它不是其他问题(我第一次这样做时遇到了一些细微的错误)。如果它适用于 5 但不适用于 4,则您必须编写自己的平铺代码(这需要大约 15 分钟的时间来编写和调试:制作一个自定义 UIView 来绘制 UIImageViews 的网格……甚至更好,制作一个自定义CALayer 实现 drawInContext 调用并多次 splats 原始 CGImage)
    • 好吧,它在 [UIColor colorWithPatternImage:...]。
    【解决方案4】:

    WWDC 2018 video session 219 - Image and Graphics Best Practices 中,Apple 工程师明确建议不要将图案颜色用于平铺背景:

    我建议不要在 UIView 上使用带有背景颜色属性的图案颜色。相反,创建一个 UIImageView。将您的图像分配给该图像视图。并使用 UIImageView 上的功能来适当地设置您的平铺参数。

    因此,创建平铺背景的最佳和最简单的方法如下:

    imageView.image = image.resizableImage(withCapInsets: .zero, resizingMode: .tile)
    

    或者更简单,如果您使用资产目录 – 选择您的图案图像资产,然后在属性检查器中启用 切片(水平/垂直或两者),将插图设置为零,并将宽度/height 到图片的尺寸:

    然后只需将此图像分配给您的图像视图(Interface Builder 也可以),只是不要忘记将 UIImageView 的 contentMode 设置为 .scaleToFill

    【讨论】:

    • 当我使用顶部插入为 0 的垂直切片时,这个对我不起作用。Xcode 11.3.1 (11C505)。我为此提交了一份错误报告。
    • 嗯,奇怪,它在 IB 中正确显示,但在设备上显示默认 scaleToFill :/
    • 更新:这是因为设备和模拟器显然会缓存启动屏幕/图像(即使在重新安装后)。它可以在另一台设备上运行。
    【解决方案5】:

    我使用@Rivera 解决方案的变体:

    将以下内容放入 UIView 扩展中:

    - (void)setColorPattern:(NSString *)imageName
    {
        [self setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:imageName]]];
    }
    

    然后可以在storyboard/xib文件中设置背景图案:

    【讨论】:

    • 这是一个很好的解决方案,但请注意它不适用于启动屏幕 xib 文件。 “错误:启动屏幕可能不使用用户定义的运行时属性。”。
    【解决方案6】:

    因为我真的很喜欢 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 文件时没有调用它。

    【讨论】:

      【解决方案7】:

      Daniel T 解决方案的 Swift 版本。您仍然需要在 IB 中设置 keyPath 值。当然,您可以更加小心地打开 Optional UIImage。

      extension UIView {
          var colorPattern:String {
              get {
                  return ""  // Not useful here.
              }
              set {
                  self.backgroundColor = UIColor(patternImage: UIImage(named:newValue)!)
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-11
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多