简体   繁体   English

Swift-添加UIView后无法单击按钮

[英]Swift - Button not clickable after UIView is added

So, I have a class that creates Confetti subclass of UIView , which is run when a high score is reached. 因此,我有一个创建UIView Confetti子类的类,该类在达到高分时运行。 But, when the confetti is run, my buttons becomes unclickable, which makes its problematic. 但是,当运行五彩纸屑时,我的按钮变得不可点击,这使其成为问题。 When the confetti is not run, my button is clickable and there is no error. 当五彩纸屑未运行时,我的按钮是可单击的,并且没有错误。 Please help me, I been trying to fix this for hours. 请帮助我,我已经尝试修复了几个小时。

Here is my code where Confetti is run: 这是运行五彩纸屑的代码:

override func viewDidLoad() {
    super.viewDidLoad()
    if UserDefaults.standard.integer(forKey: "Score") > UserDefaults.standard.integer(forKey: "Highscore") {
confettiView.startConfetti()
        delay(3, completion: {
            confettiView.stopConfetti()
        })
}

Here is my code where the Confetti is created: 这是创建五彩纸屑的代码:

import UIKit
import QuartzCore

public class SAConfettiView: UIView {

    public enum ConfettiType {
        case Confetti
        case Triangle
        case Star
        case Diamond
        case Image(UIImage)
    }

    var emitter: CAEmitterLayer!
    public var colors: [UIColor]!
    public var intensity: Float!
    public var type: ConfettiType!
    private var active :Bool!

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

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

    func setup() {
        colors = [UIColor(red:0.95, green:0.40, blue:0.27, alpha:1.0),
        UIColor(red:1.00, green:0.78, blue:0.36, alpha:1.0),
        UIColor(red:0.48, green:0.78, blue:0.64, alpha:1.0),
        UIColor(red:0.30, green:0.76, blue:0.85, alpha:1.0),
        UIColor(red:0.58, green:0.39, blue:0.55, alpha:1.0)]
        intensity = 0.5
        type = .Confetti
        active = false
    }

    public func startConfetti() {
        emitter = CAEmitterLayer()
        emitter.emitterPosition = CGPoint(x: frame.size.width / 2.0, y: 0)
        emitter.emitterShape = kCAEmitterLayerLine
        emitter.emitterSize = CGSize(width: frame.size.width, height: 1)

        var cells = [CAEmitterCell]()
        for color in colors {
            cells.append(confettiWithColor(color: color))
        }

        emitter.emitterCells = cells
        layer.addSublayer(emitter)
        active = true
    }

    public func stopConfetti() {
        emitter?.birthRate = 0
        active = false
    }

    func imageForType(type: ConfettiType) -> UIImage? {

        var fileName: String!

        switch type {
            case .Confetti:
            fileName = "confetti"
            case .Triangle:
            fileName = "triangle"
            case .Star:
            fileName = "star"
            case .Diamond:
            fileName = "diamond"
            case let .Image(customImage):
            return customImage
        }
       /*
        let path = Bundle(for: SAConfettiView.self).path(forResource: "SAConfettiView", ofType: "bundle")
        let bundle = Bundle(path: path!)
        let imagePath = bundle?.path(forResource: fileName, ofType: "png")
        let url = NSURL(fileURLWithPath: imagePath!)
        let data = NSData(contentsOf: url as URL)
        if let data = data {
            return UIImage(data: data as Data)!
        }
        return nil */
        return UIImage(named: fileName)
    }

    func confettiWithColor(color: UIColor) -> CAEmitterCell {
        let confetti = CAEmitterCell()
        confetti.birthRate = 6.0 * intensity
        confetti.lifetime = 14.0 * intensity
        confetti.lifetimeRange = 0
        confetti.color = color.cgColor
        confetti.velocity = CGFloat(350.0 * intensity)
        confetti.velocityRange = CGFloat(80.0 * intensity)
        confetti.emissionLongitude = CGFloat(M_PI)
        confetti.emissionRange = CGFloat(M_PI_4)
        confetti.spin = CGFloat(3.5 * intensity)
        confetti.spinRange = CGFloat(4.0 * intensity)
        confetti.scaleRange = CGFloat(intensity)
        confetti.scaleSpeed = CGFloat(-0.1 * intensity)
        confetti.contents = imageForType(type: type)!.cgImage
        return confetti
    }

    public func isActive() -> Bool {
        return self.active
    }
}

It seems your new view is obscuring the button view below it. 您的新视图似乎掩盖了其下方的按钮视图。 Ideally, you should remove the confetti view from its superview inside stopConfetti() method, after everything is finished. 理想情况下,完成所有操作后,应在stopConfetti()方法内将其从五彩纸屑视图中删除。

Bring your button sub-view to front after you start running confetti. 开始运行五彩纸屑后,将按钮子视图置于最前面。

Hope this helps. 希望这可以帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM