UIImageのbackgroundColorを変更したくない、
ではなく、画像全体の色を変更します。
ポップオーバーからビューに移動できる標準フォームがあるからです。
私のアプリでは、画像を1つの大きな画像、つまりテーブルに変更できます。
さらに、色を白茶色などに変更したいです。
しかし、問題は:backgroundColorしか変更できないことです。
UIImageの色を変更する方法はありますか?
前もって感謝します
UIImage *image = [UIImage imageNamed:@"triangle.png"];
CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClipToMask(context, rect, image.CGImage);
CGContextSetFillColorWithColor(context, [[UIColor redColor] CGColor]);
CGContextFillRect(context, rect);
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImage *flippedImage = [UIImage imageWithCGImage:img.CGImage
scale:1.0 orientation: UIImageOrientationDownMirrored];
yourUIImageView.image = flippedImage;
受け入れられた答えは正しいですが、UIImageView
にはもっと多くの簡単な方法があります:
Obj-C:
UIImage *image = [UIImage imageNamed:@"foo.png"];
theImageView.image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[theImageView setTintColor:[UIColor redColor]];
Swift 2:
let theImageView = UIImageView(image: UIImage(named:"foo")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate))
theImageView.tintColor = UIColor.redColor()
スウィフト3:
let theImageView = UIImageView(image: UIImage(named:"foo")!.withRenderingMode(.alwaysTemplate))
theImageView.tintColor = UIColor.red
Swift 3.2および4
extension UIImageView{
func changePngColorTo(color: UIColor){
guard let image = self.image else {return}
self.image = image.withRenderingMode(.alwaysTemplate)
self.tintColor = color
}
}
つかいます :
self.yourImageView.changePngColorTo(color: .red)
ソース: https://stackoverflow.com/a/40177870/4488252
extension UIImage {
convenience init?(imageName: String) {
self.init(named: imageName)
accessibilityIdentifier = imageName
}
// https://stackoverflow.com/a/40177870/4488252
func imageWithColor (newColor: UIColor?) -> UIImage? {
if let newColor = newColor {
UIGraphicsBeginImageContextWithOptions(size, false, scale)
let context = UIGraphicsGetCurrentContext()!
context.translateBy(x: 0, y: size.height)
context.scaleBy(x: 1.0, y: -1.0)
context.setBlendMode(.normal)
let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
context.clip(to: rect, mask: cgImage!)
newColor.setFill()
context.fill(rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
newImage.accessibilityIdentifier = accessibilityIdentifier
return newImage
}
if let accessibilityIdentifier = accessibilityIdentifier {
return UIImage(imageName: accessibilityIdentifier)
}
return self
}
}
使用法
let imageView = UIImageView(frame: CGRect(x: 40, y: 250, width: 40, height: 40))
view.addSubview(imageView)
// Set color
imageView.image = UIImage(imageName: "Apple")?.imageWithColor(newColor: UIColor.blue)
// Reset color
//imageView.image = imageView.image?.imageWithColor(newColor: nil)
extension UIImageView {
var imageColor: UIColor? {
set (newValue) {
guard let image = image else { return }
if newValue != nil {
self.image = image.withRenderingMode(.alwaysTemplate)
tintColor = newValue
} else {
self.image = image.withRenderingMode(.alwaysOriginal)
tintColor = UIColor.clear
}
}
get { return tintColor }
}
}
使用法
let imageView = UIImageView(frame: CGRect(x: 40, y: 250, width: 40, height: 40))
view.addSubview(imageView)
imageView.image = UIImage(imageName: "Apple")
// Set color
imageView.imageColor = UIColor.green
// Reset color
//imageView.imageColor = nil
上に配置したすべてのコードをここに貼り付けることを忘れないでください
import UIKit
class ImageView: UIImageView {
enum ImageColorTransformType {
case none, imageExtension, imageViewExtension
}
var imageColorTransformType = ImageColorTransformType.none
}
class ViewController: UIViewController {
weak var colorSwitchButton: UIBarButtonItem?
private var imageViews = [ImageView]()
private var appleImage: UIImage { return UIImage(imageName: "Apple")! }
private var redAppleImage: UIImage { return UIImage(imageName: "red_Apple")! }
override func viewDidLoad() {
super.viewDidLoad()
createNewImageView(x: 40, y:100, image:appleImage, imageColorTransformType: .none)
createNewImageView(x: 100, y:100, image:appleImage, imageColorTransformType: .imageExtension)
createNewImageView(x: 160, y:100, image:appleImage, imageColorTransformType: .imageViewExtension)
createNewImageView(x: 40, y:160, image:redAppleImage, imageColorTransformType: .none)
createNewImageView(x: 100, y:160, image:redAppleImage, imageColorTransformType: .imageExtension)
createNewImageView(x: 160, y:160, image:redAppleImage, imageColorTransformType: .imageViewExtension)
let buttonItem = UIBarButtonItem(title: "switch", style: .plain, target: self,
action: #selector(colorSwitchButtonTouchedUpInside(_:)))
navigationItem.rightBarButtonItem = buttonItem
colorSwitchButton = buttonItem
useOriginalColors = false
}
private func createNewImageView(x:CGFloat, y: CGFloat, image: UIImage, imageColorTransformType: ImageView.ImageColorTransformType) {
let imageView = ImageView(frame: CGRect(x: x, y: y, width: 40, height: 40))
imageView.image = image
imageView.imageColorTransformType = imageColorTransformType
imageViews.append(imageView)
view.addSubview(imageView)
}
private var _useOriginalColors = false
private var useOriginalColors: Bool {
set(value) {
_useOriginalColors = value
if (value) {
navigationItem.title = "Original colors"
for imageView in imageViews {
switch imageView.imageColorTransformType {
case .imageExtension: imageView.image = imageView.image?.imageWithColor(newColor: nil)
case .imageViewExtension: imageView.imageColor = nil
case .none: break
}
}
} else {
navigationItem.title = "Template colors"
for imageView in imageViews {
switch imageView.imageColorTransformType {
case .imageExtension: imageView.image = imageView.image?.imageWithColor(newColor: UIColor.blue)
case .imageViewExtension: imageView.imageColor = UIColor.green
case .none: break
}
}
}
}
get { return _useOriginalColors }
}
@objc func colorSwitchButtonTouchedUpInside(_ sender: Any) { useOriginalColors = !useOriginalColors }
}
次のコードを使用してSwiftでこれを行うこともできます。
// language: Swift
let tintedImage = UIImageView(image: UIImage(named:"whatever")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate))
tintedImage.tintColor = UIColor.redColor()
Swift 3 + Interface Builder(ストーリーボード)
インターフェイスビルダーでUIImageViewを追加した場合:
myIcon.image = myIcon.image!.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
myIcon.tintColor = UIColor.red // your color
myIcon
はストーリーボードのアウトレットです。例:@IBOutlet weak var myIcon: UIImageView!