ios - 如何快速改变颜色的一小部分?

标签 ios swift uiview camera qr-code

我正在扫描二维码。我使用 UIView 将屏幕的背景颜色更改为半透明颜色。但是,我想把扫描二维码的地方的背景色做成透明的。我该怎么办?

class QRcodeScannerViewController : UIViewController, AVCaptureMetadataOutputObjectsDelegate {

    @IBOutlet weak var qrcodeView: UIView!
    @IBOutlet weak var header: UINavigationBar!
    @IBOutlet weak var flash: UIButton!
    @IBOutlet weak var qrcodeScanArea: UIImageView!
                   var previewLayer: AVCaptureVideoPreviewLayer!

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.black
        self.qrcodeView.backgroundColor = UIColor.black.withAlphaComponent(0.5)
        view.layer.insertSublayer(previewLayer, at: 0)
        view.bringSubviewToFront(flash)
        view.bringSubviewToFront(header)
        header.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
        header.isTranslucent = true
        header.backgroundColor = UIColor.clear
        header.shadowImage = UIImage()

当前我的二维码扫描 View

qr

这是我想要的 View :

enter image description here

我不知道我反转的是哪一部分,但只有我想要的颜色是黑色,其余的是透明的。

        view.addSubview(qrcodeView)
        let shape = CGRect(x: 0, y: 0, width: 200, height: 200)
        let maskLayer = CAShapeLayer()
        maskLayer.path = UIBezierPath(roundedRect: shape, cornerRadius: 0).cgPath
        maskLayer.backgroundColor = UIColor.clear.cgColor
        maskLayer.fillRule = CAShapeLayerFillRule.evenOdd
        qrcodeView.layer.mask = maskLayer

enter image description here

我引用下面的答案制作并应用了类(class)。但这对我不起作用。

let focusview = FocusView.init(frame: qrcodeView.frame)
focusview.areaBackground = UIColor.black
view.addSubview(focusview)

enter image description here

最佳答案

我做过类似的事情......实际上是前段时间做的几乎一样的事情。

我已经把我用的代码挖出来放在这里供大家引用

fileprivate let focusSize: CGSize = CGSize(width: 218, height: 150)
fileprivate let focusCornerRadius: CGFloat = 10.0

class FocusView: UIView {

    var areaBackground: UIColor? {
        set {
            maskedFocusView.backgroundColor = newValue
        }

        get {
            return maskedFocusView.backgroundColor
        }
    }

    fileprivate let maskedFocusView: MaskedFocusView = {
        return MaskedFocusView()
    }()

    let focusView: UIView = {
        let view = UIView()
        view.layer.borderColor = UIColor.white.cgColor
        view.layer.borderWidth = 2
        view.layer.cornerRadius = focusCornerRadius
//      view.layer.shadowColor = UIColor.white.cgColor
//      view.layer.shadowRadius = 5.0
//      view.layer.shadowOpacity = 0.9
//      view.layer.shadowOffset = CGSize.zero
        view.layer.masksToBounds = true
        return view
    }()

    override func awakeFromNib() {
        super.awakeFromNib()
        commonInit()
    }

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

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

    func commonInit() {
        backgroundColor = UIColor.darkGray.withAlphaComponent(0.5)

        translatesAutoresizingMaskIntoConstraints = false

        addSubview(maskedFocusView)
        addSubview(focusView)
        setupFocusViewConstraints()
        setupMaskedFocusViewConstraints()
    }

    func setupFocusViewConstraints() {
        NSLayoutConstraint.activate(
            focusView.centerXAnchor.constraint(equalTo: centerXAnchor),
            focusView.centerYAnchor.constraint(equalTo: centerYAnchor)
        )

        let regularFocusViewConstraints = [
            focusView.widthAnchor.constraint(equalToConstant: focusSize.width),
            focusView.heightAnchor.constraint(equalToConstant: focusSize.height)
        ]

        NSLayoutConstraint.activate(regularFocusViewConstraints)
    }

    func setupMaskedFocusViewConstraints() {
        NSLayoutConstraint.activate(
            maskedFocusView.centerXAnchor.constraint(equalTo: centerXAnchor),
            maskedFocusView.centerYAnchor.constraint(equalTo: centerYAnchor),
            maskedFocusView.topAnchor.constraint(equalTo: topAnchor),
            maskedFocusView.bottomAnchor.constraint(equalTo: bottomAnchor),
            maskedFocusView.leadingAnchor.constraint(equalTo: leadingAnchor),
            maskedFocusView.trailingAnchor.constraint(equalTo: trailingAnchor)
        )
    }

}

// MARK: - Masked focus view

fileprivate class MaskedFocusView: UIView {

    let maskLayer: CAShapeLayer = CAShapeLayer()

    override func awakeFromNib() {
        super.awakeFromNib()
        commonInit()
    }

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

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

    func commonInit() {
        backgroundColor = UIColor.darkGray.withAlphaComponent(0.5)

        maskLayer.backgroundColor = UIColor.clear.cgColor

        layer.mask = maskLayer

        translatesAutoresizingMaskIntoConstraints = false
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        let width = bounds.width
        let height = bounds.height

        let x = (width - focusSize.width) / 2
        let y = (height - focusSize.height) / 2

        let focusRect = CGRect(x: x, y: y, width: focusSize.width, height: focusSize.height)
        let fullRect = CGRect(origin: bounds.origin, size: bounds.size)

        let path = CGMutablePath()
        path.addPath(UIBezierPath(rect: fullRect).cgPath)
        path.addPath(UIBezierPath(roundedRect: focusRect, cornerRadius: focusCornerRadius).reversing().cgPath)

        maskLayer.path = path
        maskLayer.fillRule = .evenOdd
    }

}

// MARK: - Layout constraints extension

extension NSLayoutConstraint {
  /// A helper function to activate layout constraints.
  static func activate(_ constraints: NSLayoutConstraint? ...) {
    for case let constraint in constraints {
      guard let constraint = constraint else {
        continue
      }

      (constraint.firstItem as? UIView)?.translatesAutoresizingMaskIntoConstraints = false
      constraint.isActive = true
    }
  }
}

extension Array where Element: NSLayoutConstraint {
  func activate() {
    forEach {
      if !$0.isActive {
        $0.isActive = true
      }
    }
  }

  func deactivate() {
    forEach {
      if $0.isActive {
        $0.isActive = false
      }
    }
  }
}

关于ios - 如何快速改变颜色的一小部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58815049/

相关文章:

ios - 如何在ios、swift中更新子 Controller 中的数据

ios - 为什么我的#selector 不工作?

ios - 在 Swift Xcode 中以编程方式下拉列表菜单

iphone - UIView 应该如何获取对其子级的引用?

c# - 如何将 MonoGame.Framework 添加到 Xamarin 中的 Farseer Physics for MonoGame 项目?

ios - 如何在 uitableviewcell 中设置 uicollectionview 的高度?

ios - 对核心数据 UITableview 进行排序

swift - 为什么 type(of : object) == ClassName. self 会返回错误的结果?

iphone - 如何在 iOS 中显示/隐藏带动画的 UIView?

objective-c - 向圆形 View 添加阴影