2015-08-06 1 views
2

Я хотел бы, чтобы цвет белый значок на другой цвет в время выполнения, я пытался использовать следующий метод, взятый из здесь:Как окрасить белое изображение в быстрый цвет?

Masking an image in Swift using CALayer and UIImage

, но без успеха:

func maskImageView() { 
    var maskImageSize = CGSizeMake(self.downloadImageView.frame.width, self.downloadImageView.frame.height) 
    UIGraphicsBeginImageContextWithOptions(maskImageSize, false, 0.0) 

    var color = UIColor(white: 1.0, alpha: 1.0) 
    color.setFill() 

    var rect = CGRectMake(0, 0, self.downloadImageView.frame.width, self.downloadImageView.frame.height) 
    UIRectFill(rect) 

    color = BrandColors.BRAND_FIRST_COLOR 
    color.setFill() 

    rect = CGRectMake((self.downloadImageView.frame.width/2)-100, (self.downloadImageView.frame.height/2)-100, 200, 200) 
    UIRectFill(rect) 

    var maskImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    var maskLayer = CALayer() 
    maskLayer.frame = CGRectMake(0, 0, self.downloadImageView.bounds.width, self.downloadImageView.bounds.height) 
    maskLayer.contents = maskImage.CGImage 
    maskLayer.contentsRect = CGRectMake(0, 0, self.downloadImageView.bounds.width, self.downloadImageView.bounds.height) 
    self.downloadImageView.layer.mask = maskLayer; 
} 

I может действительно выяснить, как работает эта маска. Может кто-нибудь сказать мне, что я делаю неправильно?

Заранее спасибо.

+0

ли ваше изображение прозрачные детали в нем? –

+0

@ DánielNagy да. –

+0

Я думал то же самое, что и вы нашли :) –

ответ

8

я был в состоянии решить эту задачу с помощью следующего метода:

func maskDownloadImageView() { 
    downloadImageView.image = downloadImageView.image?.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate) 
    downloadImageView.tintColor = BrandColors.BRAND_FIRST_COLOR 
} 

Там нет необходимости в использовании маскирования.

+1

Спасибо за это! Не знаю, что это существовало до сих пор. Сохранял меня много времени в Photoshop и пространстве в моем приложении. – aasatt

0

Попробуйте это.

func fillImage(image : UIImage! ,withColor color : UIColor!) -> UIImage! 
{ 
    // Create the proper sized rect 
    let imageRect = CGRectMake(0, 0, image.size.width, image.size.height) 

    // Create a new bitmap context 
    let colorSpace:CGColorSpace = CGColorSpaceCreateDeviceRGB() 
    let bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue) 
    let context = CGBitmapContextCreate(nil, Int(imageRect.size.width), Int(imageRect.size.height), 8, 0, colorSpace, bitmapInfo) 

    // Use the passed in image as a clipping mask 
    CGContextClipToMask(context, imageRect, image.CGImage) 
    // Set the fill color 
    CGContextSetFillColorWithColor(context, color.CGColor) 
    // Fill with color 
    CGContextFillRect(context, imageRect) 

    // Generate a new image 
    let newCGImage = CGBitmapContextCreateImage(context) 
    let newImage = UIImage(CGImage: newCGImage) 


    return newImage; 
} 
0

Чтобы скрыть прозрачное изображение, попробуйте следующее:

func maskImageWithColor(color : UIColor!) -> UIImage { 
    UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale) 
    if let context: CGContextRef = UIGraphicsGetCurrentContext() { 
     CGContextTranslateCTM(context, 0, self.size.height) 
     CGContextScaleCTM(context, 1.0, -1.0) 

     CGContextSetBlendMode(context, .Normal) 
     let rect: CGRect = CGRectMake(0, 0, self.size.width, self.size.height) 

     // To use gradient, add CGColor to Array 

     let colors: [CGColor] = [color.CGColor] 
     let colorsPointer = UnsafeMutablePointer<UnsafePointer<Void>>(colors) 
     if let colorsCFArray = CFArrayCreate(nil, colorsPointer, colors.count, nil) { 
      if let space: CGColorSpaceRef = CGColorSpaceCreateDeviceRGB() { 
       if let gradient: CGGradientRef = CGGradientCreateWithColors(space, colorsCFArray, nil) { 
        // Apply gradient 
        CGContextClipToMask(context, rect, self.CGImage) 
        CGContextDrawLinearGradient(context, gradient, CGPointMake(0,0), CGPointMake(0, self.size.height), .DrawsBeforeStartLocation) 
        let coloredImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
        UIGraphicsEndImageContext() 

        return coloredImage; 
       } 
      } 
     } 
    } 
    return self 
} 

Вы можете использовать градиент просто добавляя больше CGColor в массиве

Смежные вопросы