Programlı olarak düz renkle doldurulmuş bir UIImage oluşturmak istiyorum. Swift'te bunun nasıl yapılacağı hakkında bir fikri olan var mı?
Programlı olarak düz renkle doldurulmuş bir UIImage oluşturmak istiyorum. Swift'te bunun nasıl yapılacağı hakkında bir fikri olan var mı?
Yanıtlar:
Swift 2.2 uyumlu başka bir güzel çözüm, UIImage'da bu şekilde başka bir kurucu yaratmaktır:
public extension UIImage {
public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
let rect = CGRect(origin: .zero, size: size)
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
color.setFill()
UIRectFill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
guard let cgImage = image?.CGImage else { return nil }
self.init(CGImage: cgImage)
}
}
Bu şekilde özel renkli görüntüyü bu şekilde oluşturabilirsiniz:
let redImage = UIImage(color: .redColor())
Veya isteğe bağlı olarak, resmi özel boyutta oluşturun:
let redImage200x200 = UIImage(color: .redColor(), size: CGSize(width: 200, height: 200))
Swift 3.0
public extension UIImage {
public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
let rect = CGRect(origin: .zero, size: size)
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
color.setFill()
UIRectFill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
guard let cgImage = image?.cgImage else { return nil }
self.init(cgImage: cgImage)
}
}
UIGraphicsBeginImageContextWithOptions(rect.size, true, 1.0)
ref: developer.apple.com/library/ios/documentation/UIKit/Reference/…
image
? Bunu neden yapmanız gerekiyor? self.init(cgImage: cgImage)
UIImage
bir yapıcıda yeni oluşturulan ile kendini "değiştiremezsiniz" , ancak UIImage.init(cgImage: )
bunun yerine kurucu aracılığıyla zincirleme yapabilirsiniz .
self.init(cgImage: cgImage, scale: image!.scale, orientation: image!.imageOrientation)
İşte başka bir seçenek. Tam bir UIImage nesnesi istediğine inanıyorum.
func getImageWithColor(color: UIColor, size: CGSize) -> UIImage {
let rect = CGRectMake(0, 0, size.width, size.height)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
color.setFill()
UIRectFill(rect)
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
Bunu Swift kodunuza yapıştırın ve arayın
Hızlı 3.1:
func getImageWithColor(color: UIColor, size: CGSize) -> UIImage {
let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
color.setFill()
UIRectFill(rect)
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return image
}
UIRectMake(0, 0, size.width, size.height)
, bu doğru biri olarak görünüyor: CGRectMake(0, 0, size.width, size.height)
.
let
yerine kullanmaya çalışın var
; Burada ne gibi görünüyor rect
ne de image
kullanıyor olmalıdır var
beyanı.
Swift 4 sürümü:
extension UIColor {
func image(_ size: CGSize = CGSize(width: 1, height: 1)) -> UIImage {
return UIGraphicsImageRenderer(size: size).image { rendererContext in
self.setFill()
rendererContext.fill(CGRect(origin: .zero, size: size))
}
}
}
Kullanımı:
let image0 = UIColor.orange.image(CGSize(width: 128, height: 128))
let image1 = UIColor.yellow.image()
Daha temiz bir yaklaşım, mantığı bir UIImage
uzantı içinde kapsüllemek olacaktır :
import UIKit
extension UIImage {
class func imageWithColor(color: UIColor) -> UIImage {
let rect: CGRect = CGRectMake(0, 0, 1, 1)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, 1), false, 0)
color.setFill()
UIRectFill(rect)
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Artık tüketici, UIImage.imageWithColor(UIColor.blackColor())
siyah arka plana sahip bir görüntü oluşturmak için arayabilir .
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
imageView.backgroundColor = UIColor.redColor()
}
}
IBOutlet üzerinden bir görüntüyü bağlamak yerine görüntüyü kendiniz çizmek istiyorsanız benzer yöntem.
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var frame = CGRectMake(100,100,100,100)
var imageView2 = UIImageView(frame: frame)
imageView2.backgroundColor = UIColor.redColor()
self.view.addSubview(imageView2)
}
}
Üçüncü yöntem anthonyliao borçlanma. Biraz daha karmaşık:
class ViewController: UIViewController {
func getImageWithColor(color: UIColor, size: CGSize) -> UIImage {
UIGraphicsBeginImageContextWithOptions(size, false, 0)
color.setFill()
UIRectFill(CGRectMake(0, 0, 100, 100))
var image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
override func viewDidLoad() {
super.viewDidLoad()
var imageView = UIImageView(frame: CGRectMake(100,100,100,100))
let screenImage = getImageWithColor(UIColor.redColor(), size: CGSize(width: 100, height: 100))
imageView.image = screenImage
self.view.addSubview(imageView)
}
}
UIImage
ayarlamak için değil, a oluşturma yöntemine sahip oldukları hiçbir şeye değmez UIImageView
.
getImageWithColor(color: UIColor, size: CGSize) -> UIImage
Herkesin bir UIImageView ile birlikte kullanamayacağını düşündüğüm için yöntem cevap olarak yeterli
@ Neoneye'in mükemmel cevabına küçük bir değişiklik yaparak, çağrı kodunun CGSize'yi oluşturmak zorunda kalmasına izin vermedi ve çok sayıda başkalarıyla çarpışmamak için adı değiştirdi:
Hızlı 4
extension UIColor {
func imageWithColor(width: Int, height: Int) -> UIImage {
let size = CGSize(width: width, height: height)
return UIGraphicsImageRenderer(size: size).image { rendererContext in
self.setFill()
rendererContext.fill(CGRect(origin: .zero, size: size))
}
}
}
Yeni iOS 10 UIGraphicsImageRenderer API'sını kullanabilirsiniz.
İşte Swift 3.1 UIColor bir uzantısı
extension UIColor {
func getImage(size: CGSize) -> UIImage {
let renderer = UIGraphicsImageRenderer(size: size)
return renderer.image(actions: { rendererContext in
self.setFill()
rendererContext.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height))
})
}}
Bunun gibi bir hesaplanmış özelliğe sahip olmanın iyi bir yolu:
extension UIColor {
var imageRepresentation : UIImage {
let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)
UIGraphicsBeginImageContext(rect.size)
let context = UIGraphicsGetCurrentContext()
context?.setFillColor(self.cgColor)
context?.fill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}
}
Kullanımı:
let redImage = UIColor.red.imageRepresentation
@Anthonyliao Swift 3 sürümü Kabul edilen cevap:
class func getImageWithColor(color: UIColor, size: CGSize) -> UIImage
{
let rect = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: size.width, height: size.height))
UIGraphicsBeginImageContextWithOptions(size, false, 0)
color.setFill()
UIRectFill(rect)
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return image
}
Köşeleri yuvarlatılmış doğrultu
extension UIImage {
convenience init?(color: UIColor) {
let rect = CGRect(x: 0, y: 0, width: 10, height: 2)
UIGraphicsBeginImageContextWithOptions(CGSize(width: 10, height: 2), false, 0)
let bezierPath = UIBezierPath(roundedRect: rect, cornerRadius: 8)
color.setFill()
bezierPath.fill()
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
guard let cgImage = image.cgImage else {
return nil
}
self.init(cgImage: cgImage)
}
}
UIImage
bir-initWithSize:andColor:
yöntemi yok, ancakNSImage
OS X'te var. Bunun için özel bir kitaplık veya kategori mi kullanıyorsunuz?