44

I found a lot solutions here but not for Swift, and I know you can do this with a UIImageView, but in my case i need an programmatically set alpha transparent background image for an UIButton. Best would be an UIImage extension!

let img = UIImage(named: "imageWithoutAlpha")
var imgInsets = UIEdgeInsetsMake(0, 24, 0, 24)
image = image!.resizableImageWithCapInsets(imgInsets)

let myButton = UIButton(frame: CGRect(x: 50, y: 50, width: img!.size.width, height: img!.size.height))
myButton.setBackgroundImage(img, forState: UIControlState.Normal)
myButton.contentEdgeInsets = UIEdgeInsetsMake(0, 20, 0, 20)
myButton.setTitle("Startbutton", forState: UIControlState.Normal)
myButton.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal)
myButton.sizeToFit()
view.addSubview(myButton)

Current result:

current

Desired result:

desired

Peter Kreinz
  • 7,979
  • 1
  • 64
  • 49

4 Answers4

96

Luckily I was able to help myself and would like to share with you my solution:

Swift 3

// UIImage+Alpha.swift

extension UIImage {  

    func alpha(_ value:CGFloat) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        draw(at: CGPoint.zero, blendMode: .normal, alpha: value)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage!   
    }
}

The above new Swift extension I added to my project and then I changed the UIButton example as follows, to have an alpha transparent background image with a transparency of 50%.

let img = UIImage(named: "imageWithoutAlpha")!.alpha(0.5)
let myButton = UIButton()

myButton.setBackgroundImage(img, for: .normal)
Peter Kreinz
  • 7,979
  • 1
  • 64
  • 49
  • 12
    In swift 2 I had to replace kCGBlendModeMultiply with CGBlendMode.Multiply, see http://stackoverflow.com/questions/31309521/error-use-of-unresolved-identifier-kcgblendmodemultiply – ChucK Oct 09 '15 at 20:12
  • can you post an swift 3 version? – Patonz Sep 29 '16 at 12:50
  • 1
    swift 3 version added! – Peter Kreinz Sep 30 '16 at 22:37
  • 1
    This seems to ignore color. I have an image with colors in it and when I apply this method, the resulting image is gray (but it does have the appropriate alpha). – Ethan G Nov 06 '17 at 15:59
  • In reading some of https://developer.apple.com/library/content/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_paths/dq_paths.html#//apple_ref/doc/uid/TP30001066-CH211-TPXREF101 it seems like .normal should work fine. Anyone else experiencing this "gray-scale" effect? – Ethan G Nov 06 '17 at 16:26
35

The easiest way is to put your UIImage inside a UIImageView and set the alpha there.

let image = UIImage(named: "imageWithoutAlpha")
let imageView = UIImageView(image: image)
imageView.alpha = 0.5

myButton.setBackgroundImage(image, forState: UIControlState.Normal)
Mo Abdul-Hameed
  • 6,030
  • 2
  • 23
  • 36
leonardo
  • 1,686
  • 15
  • 15
15

Swift 5, iOS 10+

If your app doesn't support operating systems prior to iOS 10 then you can take advantage of the more robust UIGraphicsImageRenderer UIKit drawing API.

extension UIImage {
    func withAlpha(_ a: CGFloat) -> UIImage {
        return UIGraphicsImageRenderer(size: size, format: imageRendererFormat).image { (_) in
            draw(in: CGRect(origin: .zero, size: size), blendMode: .normal, alpha: a)
        }
    }
}

Usage

let img = UIImage(named: "someImage")?.withAlpha(0.5)
trndjc
  • 11,654
  • 3
  • 38
  • 51
9

I was able to set the alpha using the following code:

self.imageView.image = UIImageView(image: "image.png")
imageView.alpha = 0.5
Bigfoot11
  • 911
  • 2
  • 11
  • 25