프로그래밍 방식으로 단색으로 채워진 UIImage를 만들고 싶습니다. 누구나 Swift 에서이 작업을 수행하는 방법에 대한 아이디어가 있습니까?
프로그래밍 방식으로 단색으로 채워진 UIImage를 만들고 싶습니다. 누구나 Swift 에서이 작업을 수행하는 방법에 대한 아이디어가 있습니까?
답변:
Swift 2.2 와 호환되는 또 다른 멋진 솔루션 은 다음과 같이 UIImage에서 다른 생성자를 만드는 것입니다.
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)
}
}
이런 식으로 다음과 같은 방법으로 사용자 지정 컬러 이미지를 만들 수 있습니다.
let redImage = UIImage(color: .redColor())
또는 선택적으로 사용자 정의 크기로 이미지를 작성하십시오.
let redImage200x200 = UIImage(color: .redColor(), size: CGSize(width: 200, height: 200))
스위프트 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
없습니까? 왜 이렇게해야합니까? self.init(cgImage: cgImage)
UIImage
된 생성자로 "대체" 할 수는 없지만 UIImage.init(cgImage: )
대신 생성자를 통해 연결할 수 있습니다 .
self.init(cgImage: cgImage, scale: image!.scale, orientation: image!.imageOrientation)
다른 옵션이 있습니다. 나는 당신이 정확한 UIImage 객체를 원한다고 생각합니다.
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
}
이것을 스위프트 코드에 붙이고 호출하십시오.
스위프트 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)
합니다. 올바른 방법 인 것 같습니다 CGRectMake(0, 0, size.width, size.height)
.
let
대신에 사용 var
하십시오. 여기 선언을 사용 rect
하거나 image
사용 하지 않아야하는 것처럼 보입니다 var
.
스위프트 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))
}
}
}
용법:
let image0 = UIColor.orange.image(CGSize(width: 128, height: 128))
let image1 = UIColor.yellow.image()
보다 확실한 접근 방식은 UIImage
확장 내에 논리를 캡슐화하는 것입니다 .
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
}
}
이제 소비자는 UIImage.imageWithColor(UIColor.blackColor())
검은 배경의 이미지를 만들기 위해 전화를 걸 수 있습니다 .
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
imageView.backgroundColor = UIColor.redColor()
}
}
이미지를 직접 그리거나 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)
}
}
anthonyliao에서 빌리는 세 번째 방법. 좀 더 복잡합니다.
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
,를 설정하지 않고을 만드는 방법이 있다는 것은 가치가 없습니다 UIImageView
.
getImageWithColor(color: UIColor, size: CGSize) -> UIImage
모든 사람이 UIImageView와 함께 이것을 사용하지는 않을 것이라고 생각하기 때문에이 방법 으로 충분합니다.
@neoneye의 훌륭한 답변을 약간 수정하여 호출 코드가 CGSize를 만들 필요가 없으며 이름이 다른 많은 사람들과 충돌하지 않도록 변경되었습니다.
스위프트 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))
}
}
}
새로운 iOS 10 UIGraphicsImageRenderer API를 사용할 수 있습니다 .
다음은 Swift 3.1의 UIColor에 대한 확장입니다.
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))
})
}}
좋은 방법은 다음과 같이 계산 된 속성을 갖는 것입니다.
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!
}
}
용법:
let redImage = UIColor.red.imageRepresentation
@anthonyliao의 스위프트 3 버전 허용되는 답변 :
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
}
모서리가 둥근 사각형
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
이없는-initWithSize:andColor:
방법을하지만,NSImage
이에 대한 사용자 지정 라이브러리 또는 범주를 사용하고 OS X에서합니까?