我正在开发一个基于swift的应用程序,它显示了一些事件。每个事件都有时间限制,事件到期后。
我希望在事件到期后使事件屏幕变为灰度,我尝试过这样的事情:
蒙版视图
if let maskImage = UIImage(named: "MaskImage"){
myView.maskView = UIImageView(image: maskImage)
}
上面的解决方案不起作用,因为我的事件屏幕也包含彩色图像
以递归方式提取所有subviews
并尝试设置backgroundColor
但未使用
更改显示褪色白色的所有alpha
的{{1}}值
查询:我的活动屏幕上有许多彩色图片和一些彩色标签,如何以灰度制作所有这些?
任何帮助都将不胜感激。
答案 0 :(得分:0)
经过一些研究后,我在整个视图中实现了灰度缩放效果:
/**
To convert an image to grayscale
- parameter image: The UIImage to be converted
- returns: The UIImage after conversion
*/
static func convertToGrayScale(_ image: UIImage?) -> UIImage? {
if image == nil {
return nil
}
let imageRect:CGRect = CGRect(x: 0, y: 0, width: image!.size.width, height: image!.size.height)
let colorSpace = CGColorSpaceCreateDeviceGray()
let width = image!.size.width
let height = image!.size.height
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.none.rawValue)
let context = CGContext(data: nil, width: Int(width), height: Int(height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)
context?.draw(image!.cgImage!, in: imageRect)
let imageRef = context?.makeImage()
let newImage = UIImage(cgImage: imageRef!)
return newImage
}
上述方法适用于所呈现视图中的所有彩色图像,同样可用于myView.maskView = UIImageView(image: maskImage)
。
这将灰度显示整个视图,而灰度缩放时只使用我使用的标签和文本:
// Convert to grayscale
func convertToGrayScaleColor() -> UIColor? {
if self == UIColor.clear {
return UIColor.clear
}
var fRed : CGFloat = 0
var fGreen : CGFloat = 0
var fBlue : CGFloat = 0
var fAlpha: CGFloat = 0
if self.getRed(&fRed, green: &fGreen, blue: &fBlue, alpha: &fAlpha) {
if fRed == 0 && fGreen == 0 && fBlue == 0{
return UIColor.gray
}else{
let grayScaleColor = (fRed + fGreen + fBlue)/3
return UIColor(red: grayScaleColor, green: grayScaleColor, blue: grayScaleColor, alpha: fAlpha)
}
} else {
print("Could not extract RGBA components, so rolling back to default UIColor.grayColor()")
return UIColor.gray
}
}
上述方法是extension UIColor
部分。上面的代码是使用xcode 8.1
如果对答案中的任何事情感到担忧或混淆,请随时发表评论。