我尝试使用动画以动画方式关闭菜单,
我决定在大小减小到所需值时减小按钮上的UIScrollView
的大小,然后将其隐藏。
为了在某些时候根据所需的用户界面完成任务,我使用了“延时功能”(给定300毫秒)
一切顺利:如果我不反复按下按钮,直到达到时间限制
发生错误:我在300毫秒内一次又一次按下按钮
func disAppearBlanceMenu(){
let x1 = btn_addBalance.clickableimg.frame.midX
let y1 = btn_addBalance.clickableimg.frame.maxY
UIView.animate(withDuration: 0.3) {
self.BalanceMenu.scrollview.frame = CGRect(x: x1 - 150, y: y1 + 20, width: 200, height: 20)
}
time.delay(milliSec: 300) {
self.BalanceMenu.triangle.isHidden = true
self.BalanceMenu.scrollview.isHidden = true
for i in 0...(self.BalanceMenuBtn.count - 1) {
self.BalanceMenuBtn[i].imag.removeFromSuperview()
self.BalanceMenuBtn[i].button.removeFromSuperview()
}
self.BalanceMenuBtn.removeAll()
}
displayBalanceMenu = true
}
哪里
class time {
static func delay(milliSec:Int, code: @escaping () -> Void ) {
let deadline = DispatchTime.now() + .milliseconds(milliSec)
DispatchQueue.main.asyncAfter(deadline: deadline) {
code()
}
}
}
错误发生在这里:
time.delay(milliSec: 300) {
说
“线程1:致命错误:无法与upperBound
答案 0 :(得分:0)
在您的代码中,您应该在执行for循环之前添加一个条件,如下所示:
time.delay(milliSec: 300) {
self.BalanceMenu.triangle.isHidden = true
self.BalanceMenu.scrollview.isHidden = true
if self.BalanceMenuBtn.count > 0 {
for i in 0...(self.BalanceMenuBtn.count - 1) {
self.BalanceMenuBtn[i].imag.removeFromSuperview()
self.BalanceMenuBtn[i].button.removeFromSuperview()
}
self.BalanceMenuBtn.removeAll()
}
}
在for循环中,下限大于上限时,会出现此错误。在您的代码中,当第一次完成动画时,数组的计数将为0,第二次情况将是这样
for I in 0...-1
这就是为什么您崩溃的原因,并且通过检查计数的条件(如我的答案所示),不会崩溃。
希望这会有所帮助。
答案 1 :(得分:0)
动画制作完成后,您似乎想做点什么。如果是这样,请使用其completion
参数:
UIView.animate(withDuration: 0.3, animations: {
self.BalanceMenu.scrollview.frame = CGRect(x: x1 - 150, y: y1 + 20, width: 200, height: 20)
}, completion: { _ in
self.BalanceMenu.triangle.isHidden = true
self.BalanceMenu.scrollview.isHidden = true
for button in self.BalanceMenuBtn {
button.imag.removeFromSuperview()
button.button.removeFromSuperview()
}
self.BalanceMenuBtn.removeAll()
})
它避免了该delay
方法引入的时序问题。这也使意图更加明确。
不用说,一旦遇到这个直接问题,就应该重命名属性BalanceMenu
和BalanceMenuBtn
以小写字母开头,例如balanceMenu
和{{1 }}, 分别。另外请注意使用balanceMenuButtons
后缀而不是Buttons
,以使其清楚是一个按钮数组。