【问题标题】:Gray scaling the entire view灰度缩放整个视图
【发布时间】:2016-03-31 07:14:15
【问题描述】:

我正在开发一个基于 swift 的应用程序,它会显示一些事件。每个事件都有时间限制,之后事件就会过期。

我想在事件到期后将事件屏幕设为灰度,为此我尝试过如下操作:

  1. 蒙版视图

            if let maskImage = UIImage(named: "MaskImage"){
            myView.maskView = UIImageView(image: maskImage)
        }
    

上述解决方案对我不起作用,因为我的活动屏幕也包含彩色图像

  1. 递归获取所有subviews 并尝试设置他们的backgroundColor 但没有成功

  2. 更改所有subViewsalpha 值,显示更多褪色的白色

查询:我的活动画面有很多彩色图片和一些彩色标签,我怎样才能让这些都变成灰度?

任何帮助将不胜感激。

【问题讨论】:

  • 我不确定,但是当您在窗口的顶层创建一个视图时,会发生什么情况,灰色颜色,alpha 为 0.8?那么 View 下的所有 UI-Elements 都应该是灰度的。
  • 执行此操作后,控制器对象会不再交互吗?即使在这种情况下,也可以通过某种方式看到图像的颜色,但如果用户可以与灰色视图进行交互,我会尝试一下。
  • 否,UI 交互已停用
  • 这样就没用了,他们有什么办法可以在灰度视图之上重绘所有视图吗?
  • 并非如此。我想最简单的方法是更改​​任何子视图的所有颜色,将不透明度设置为 0.8,并在所有子视图的第一级设置灰色背景视图。

标签: ios swift


【解决方案1】:

经过一些研究,我在整个视图上实现了灰度效果,如下所示:

/**
     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的一部分。上面的代码是在 Swift 3.0 中使用 xcode 8.1 编写的

如果对答案中的任何内容感到担忧或困惑,请随时发表评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    相关资源
    最近更新 更多