[英]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.