设备上的UIVibrancyEffect昏暗,模拟器上则是鲜艳的。

7

我在我的iPhone 6上遇到了弱化效果渲染不佳的问题。

这是它的外观: simulator vs. device

我已经检查了UIAccessibilityIsReduceTransparencyEnabled()的值,它在设备和模拟器上都返回false。

背景图像、效果和我添加其他元素的容器视图的代码如下:

import Foundation
import UIKit
import PureLayout

class BackgroundImageView : UIView {
    let bgImage = UIImageView(forAutoLayout: ())
    var blurView:UIVisualEffectView!
    var vibrancyView:UIVisualEffectView!

    var containerView: UIView? = nil {
        willSet(container) {
            vibrancyView.contentView.addSubview(container!)
        }
    }

    init(imageName: String) {
        super.init()

        let screenSize: CGRect = UIScreen.mainScreen().bounds

        bgImage.image = UIImage(named: imageName)
        // Scale relative to the size of the iPhone 6 Plus: http://martinnormark.com/smooth-transition-from-launch-image-to-view-controller-in-ios/
        bgImage.transform = CGAffineTransformMakeScale(screenSize.width / 414, screenSize.height / 736)

        self.addSubview(bgImage)

        let blurEffect = UIBlurEffect(style: .Dark)
        self.blurView = UIVisualEffectView(effect: blurEffect)
        self.blurView.setTranslatesAutoresizingMaskIntoConstraints(false)

        self.addSubview(blurView)

        let vibrancyEffect = UIVibrancyEffect(forBlurEffect: blurEffect)
        vibrancyView = UIVisualEffectView(effect: vibrancyEffect)
        vibrancyView.setTranslatesAutoresizingMaskIntoConstraints(false)

        blurView.contentView.addSubview(vibrancyView)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func updateConstraints() {
        super.updateConstraints()

        bgImage.autoCenterInSuperview()
        containerView?.autoPinEdgesToSuperviewEdgesWithInsets(UIEdgeInsetsZero)
        blurView.autoPinEdgesToSuperviewEdgesWithInsets(UIEdgeInsetsZero)
        vibrancyView.autoPinEdgesToSuperviewEdgesWithInsets(UIEdgeInsetsZero)
    }
}
3个回答

3
也许您的iPhone 6或iPhone 6 Plus启用了UIAccessibilityDarkerSystemColorsEnabled(),因此显示效果比较暗。若要禁用它,请进入“设置” -> “通用” -> “辅助功能” -> “提高对比度” -> “加深颜色”,关闭即可。 编辑 如文档UIVibrancyEffect所述:
振动效果是与颜色相关的。您添加到contentView中的任何子视图都必须实现tintColorDidChange方法并相应地更新自己。渲染模式为UIImageRenderingModeAlwaysTemplate的UIImageView对象以及UILabel对象将自动更新。
我们应该使用渲染模式为UIImageRenderingModeAlwaysTemplate的图像,使UIImageView对象自动更新。应用这种方法可以使上的UIVibrancyEffect更加生动。

不,那也不是这样的。 - MartinHN
当然:https://www.dropbox.com/sh/52u7vajsrgp6qf3/AAAJP6uepRF9DUV3lyJxuZLaa?dl=0只是为了明确。我保持问题开放,以便有人在剩下的三天内获得赏金。我已解决了这个问题,所以除非你正在寻找赏金,否则不要过度努力。 - MartinHN
1
具有UIImageRenderingModeAlwaysTemplate渲染模式的UIImageView对象以及UILabel对象将会自动更新。所以是否可能我们应该使用带有UIImageRenderingModeAlwaysTemplate模式的图像呢?无论如何,设置为此后,它们看起来更加相似了。 - gabbler
1
没错。文档中的那一段是一块金子。使用那个描述更新你的答案,我会授予你正确的答案和赏金! - MartinHN
1
是的,文档非常重要,答案可以在那里找到。感谢您将赏金授予社区成员,即使您已经知道答案。 - gabbler
显示剩余2条评论

0

我不确定,但是在下面的代码行中,我使用了var而不是let,并且它对我起作用了。

var vibrancyEffect = UIVibrancyEffect(forBlurEffect: blurEffect)

也许这会对你有所帮助。

我之前是这样使用的。

var vibrancyEffect = UIVibrancyEffect(forBlurEffect: blurEffect)
var vibrancyEffectView = UIVisualEffectView(effect: vibrancyEffect)
vibrancyEffectView.frame = view.bounds

1
使用 let 只会将其标记为常量。使用 var 不会改变渲染。我已经发现了导致问题的原因,但会保留赏金直到它过期,以便任何人都可以获得正确答案。 - MartinHN

0

使用通用的RGB,而不是sRGB或设备RGB。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接