Tôi muốn lập trình tạo ra một UIImage được lấp đầy bởi một màu đơn sắc. Bất cứ ai cũng có một ý tưởng về cách làm điều này trong Swift?
Tôi muốn lập trình tạo ra một UIImage được lấp đầy bởi một màu đơn sắc. Bất cứ ai cũng có một ý tưởng về cách làm điều này trong Swift?
Câu trả lời:
Một giải pháp hay khác, tương thích Swift 2.2 , là tạo một hàm tạo khác trong UIImage, theo cách này:
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)
}
}
Theo cách này, bạn có thể tạo hình ảnh màu tùy chỉnh theo cách này:
let redImage = UIImage(color: .redColor())
Hoặc, tùy ý, tạo hình ảnh với kích thước tùy chỉnh:
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
? Tại sao cần phải làm điều này? self.init(cgImage: cgImage)
UIImage
trong một hàm tạo, nhưng UIImage.init(cgImage: )
thay vào đó bạn có thể xâu chuỗi qua hàm tạo.
self.init(cgImage: cgImage, scale: image!.scale, orientation: image!.imageOrientation)
Đây là một lựa chọn khác. Tôi tin rằng bạn muốn một đối tượng UIImage chính xác.
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
}
Dán mã này vào mã Swift của bạn và gọi nó
Swift 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)
, đây có vẻ là một phương pháp chính xác : CGRectMake(0, 0, size.width, size.height)
.
let
thay vì var
cho các biến không thay đổi; ở đây có vẻ như không nên rect
và cũng không image
nên sử dụng var
khai báo.
Phiên bản Swift 4:
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))
}
}
}
Sử dụng:
let image0 = UIColor.orange.image(CGSize(width: 128, height: 128))
let image1 = UIColor.yellow.image()
Một cách tiếp cận sạch hơn sẽ là gói gọn logic bên trong một UIImage
phần mở rộng:
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
}
}
Bây giờ người tiêu dùng có thể gọi, UIImage.imageWithColor(UIColor.blackColor())
để tạo một hình ảnh với nền đen.
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
imageView.backgroundColor = UIColor.redColor()
}
}
Phương pháp tương tự nếu bạn muốn tự vẽ hình ảnh so với kết nối thông qua IBOutlet.
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)
}
}
Phương pháp thứ ba mượn từ anthonyliao. Một chút phức tạp hơn:
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
, chứ không phải đặt UIImageView
.
getImageWithColor(color: UIColor, size: CGSize) -> UIImage
này là đủ như câu trả lời, vì tôi nghĩ không phải ai cũng sẽ sử dụng phương pháp này cùng với UIImageView
Một điều chỉnh nhỏ cho câu trả lời tuyệt vời của @ neoneye, cho phép mã cuộc gọi không cần tạo CGSize và thay đổi tên để không va chạm với nhiều người khác:
Swift 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))
}
}
}
Bạn có thể sử dụng API UIGraphicsImageRenderer iOS 10 mới .
Đây là một phần mở rộng trên UIColor trong Swift 3.1
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))
})
}}
Một cách hay là có một tài sản được tính toán như thế này:
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!
}
}
Sử dụng:
let redImage = UIColor.red.imageRepresentation
Phiên bản Swift 3 của @anthonyliao Câu trả lời được chấp nhận:
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
}
Rect với các góc tròn
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
không có-initWithSize:andColor:
phương thức, nhưngNSImage
trên OS X. Bạn có đang sử dụng thư viện hoặc danh mục tùy chỉnh cho việc này không?