2011-11-10 41 views
2

我有一组瓷砖作为具有可编程背景色的UIViews,并且每个 可以是不同的颜色。我想添加纹理,像一个侧光斜面,每个。这可以通过覆盖视图或其他方法来完成吗?可可触摸 - 添加纹理覆盖视图

我正在寻找不需要每个案例的自定义图像文件的建议。

回答

2

这可能会帮助某人,虽然这是从SO上的其他主题拼凑在一起。 要创建具有用于正常和视网膜显示任意颜色的斜切平铺图像,我提出在Photoshop斜切图像和饱和度设置为零,使得灰度图像称为tileBevel.png

tileBevel.png

我还创建一个用于视网膜显示器([email protected]

下面是代码:

+ (UIImage*) createTileWithColor:(UIColor*)tileColor { 

    int pixelsHigh = 44; 
    int pixelsWide = 46; 
    UIImage *bottomImage; 

    if([UIScreen respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2.0) { 
     pixelsHigh *= 2; 
     pixelsWide *= 2; 
     bottomImage = [UIImage imageNamed:@"[email protected]"];   
    } 
    else { 
     bottomImage = [UIImage imageNamed:@"tileBevel.png"]; 
    } 

    CGImageRef theCGImage = NULL; 
    CGContextRef tileBitmapContext = NULL; 

    CGRect rectangle = CGRectMake(0,0,pixelsWide,pixelsHigh); 

    UIGraphicsBeginImageContext(rectangle.size); 

    [bottomImage drawInRect:rectangle]; 

    tileBitmapContext = UIGraphicsGetCurrentContext(); 

    CGContextSetBlendMode(tileBitmapContext, kCGBlendModeOverlay); 

    CGContextSetFillColorWithColor(tileBitmapContext, tileColor.CGColor);   
    CGContextFillRect(tileBitmapContext, rectangle); 

    theCGImage=CGBitmapContextCreateImage(tileBitmapContext); 

    UIGraphicsEndImageContext(); 

    return [UIImage imageWithCGImage:theCGImage]; 

} 

此检查是否使用了视网膜显示,调整要绘制的矩形的大小,选取合适的灰度基础图像,将混合模式设置为覆盖,然后在底部图像顶部绘制矩形。所有这些都在由BeginImageContext和EndImageContext调用括起来的图形上下文中完成。这些设置UIImage drawRect:方法所需的当前上下文。核心图形函数需要上下文作为参数,通过调用来获取当前上下文。

而结果是这样的:

enter image description here

1

如果你想保留源图像的alpha通道,只是填充矩形前添加此吉姆代码:

// Apply mask 
CGContextTranslateCTM(tileBitmapContext, 0, rectangle.size.height); 
CGContextScaleCTM(tileBitmapContext, 1.0f, -1.0f); 

CGContextClipToMask(tileBitmapContext, rectangle, bottomImage.CGImage); 
0

Swift 3解决方案,基本上基于吉姆的答案和Scriptease的补充,以及一些细微的变化:

class func image(bottomImage: UIImage, topImage: UIImage, tileColor: UIColor) -> UIImage? { 
    let pixelsHigh: CGFloat = bottomImage.size.height 
    let pixelsWide: CGFloat = bottomImage.size.width 

    let rectangle = CGRect.init(x: 0, y: 0, width: pixelsWide, height: pixelsHigh) 
    UIGraphicsBeginImageContext(rectangle.size); 

    bottomImage.draw(in: rectangle) 

    if let tileBitmapContext = UIGraphicsGetCurrentContext() { 
     tileBitmapContext.setBlendMode(.overlay) 
     tileBitmapContext.setFillColor(tileColor.cgColor) 
     tileBitmapContext.scaleBy(x: 1.0, y: -1.0) 
     tileBitmapContext.clip(to: rectangle, mask: bottomImage.cgImage!) 
     tileBitmapContext.fill(rectangle) 
     let theCGImage = tileBitmapContext.makeImage() 
     UIGraphicsEndImageContext(); 

     if let theImage = theCGImage { 
      return UIImage.init(cgImage: theImage) 
     } 
    } 

    return nil 
}