На основании ответа @yycking я написал подходящее расширение Swift 3/4:
//
// UIImage+imageFromSystemBarButton.swift
//
import UIKit
extension UIImage{
class func imageFromSystemBarButton(_ systemItem: UIBarButtonSystemItem, renderingMode:UIImageRenderingMode = .automatic)-> UIImage {
let tempItem = UIBarButtonItem(barButtonSystemItem: systemItem, target: nil, action: nil)
// add to toolbar and render it
let bar = UIToolbar()
bar.setItems([tempItem], animated: false)
bar.snapshotView(afterScreenUpdates: true)
// got image from real uibutton
let itemView = tempItem.value(forKey: "view") as! UIView
for view in itemView.subviews {
if view is UIButton {
let button = view as! UIButton
let image = button.imageView!.image!
image.withRenderingMode(renderingMode)
return image
}
}
return UIImage()
}
}
Пример с кнопкой действия (по умолчанию):
let actionImage = UIImage.imageFromSystemBarButton(.action)
let myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
myButton.setImage(actionImage, for: .normal)
view.addSubview(myButton)
Если вы хотите, чтобы ваше изображение всегда обрабатывалось как шаблон независимо от контекста, установите renderMode в .alwaysTemplate
let actionImage = UIImage.imageFromSystemBarButton(.action, renderingMode: .alwaysTemplate)