【问题标题】:Swift - Button not clickable after UIView is addedSwift - 添加 UIView 后按钮不可点击
【发布时间】:2018-06-02 14:15:10
【问题描述】:

所以,我有一个创建 UIView 的 Confetti 子类的类,它在达到高分时运行。但是,当五彩纸屑运行时,我的按钮变得不可点击,这使得它有问题。当五彩纸屑没有运行时,我的按钮是可点击的并且没有错误。请帮助我,我试图解决这个问题已经好几个小时了。

这是我运行 Confetti 的代码:

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

这是我创建五彩纸屑的代码:

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
    }
}

【问题讨论】:

  • 您能告诉我们您是如何创建“confettiView”对象并添加到您的超级视图中的吗?

标签: ios swift button uiview


【解决方案1】:

开始运行五彩纸屑后,将按钮子视图置于最前面。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    您的新视图似乎掩盖了它下面的按钮视图。 理想情况下,您应该在所有内容完成后,从 stopConfetti() 方法内的父视图中删除五彩纸屑视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      相关资源
      最近更新 更多