swift:计时器(每秒)+gestureRecognizer 使 GUI 崩溃

标签 swift user-interface timer crash uigesturerecognizer

我有一个简单的手势识别器。当手势为“向上”时,菜单向上滑动。 “DOWN”:菜单向下滑动。这有效。

我也有一个计时器。它只是每秒计算一个数字++。这也有效。但计时器一起导致我的 GUI 崩溃。 动画正确启动,但是当计时器调用我的计数器方法时,它会跳回原始 GUI。

这是什么问题?我在谷歌上什么也没找到,但我想我搜索了错误的词。 (英语不是我的母语,德语也没有那么多文献......)

这是我的代码片段:

class ViewController: UIViewController, MKMapViewDelegate{

@IBOutlet weak var swipe: UILabel!
var number: Int = 0

@IBOutlet weak var menuView: UIView!

override func viewDidLoad() {
    super.viewDidLoad()

    var topSwipe = UISwipeGestureRecognizer(target: self, action: Selector("handleSwipes:"))
    var downSwipe = UISwipeGestureRecognizer(target: self, action: Selector("handleSwipes:"))

    topSwipe.direction = .Up
    downSwipe.direction = .Down

    view.addGestureRecognizer(topSwipe)
    view.addGestureRecognizer(downSwipe)

    var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "counter", userInfo: nil, repeats: true)

}

func counter() {
    number++
    swipe.text = "\(number)"
}

func handleSwipes(sender:UISwipeGestureRecognizer) {

    if (sender.direction == .Up) {
        print("TOP")

            var menuPosition = CGPointMake(self.menuView.frame.origin.x, self.menuView.frame.origin.y - 100.0)

            UIView.animateWithDuration(0.65, animations: {
                self.menuView.frame = CGRectMake(menuPosition.x,menuPosition.y,self.menuView.frame.size.width,self.menuView.frame.size.height)
                })


    }

    if (sender.direction == .Down) {
            menuChoose = true
            UIView.animateWithDuration(0.65, animations: {

            var menuPosition = CGPointMake(self.menuView.frame.origin.x, self.menuView.frame.origin.y + 100.0)
        self.menuView.frame = CGRectMake(menuPosition.x,menuPosition.y,self.menuView.frame.size.width,self.menuView.frame.size.height)
            })
    }

  }   
}

我试图锁定计时器。因此,当手势开始时,只需计算数字即可,无需 swipe.text = "(number)" 动画结束,但“解锁”后 GUI 跳回原点。

感谢您提供一些我可以搜索的代码片段或关键字:)

最佳答案

似乎每当设置 UILabeltext 属性时,它都会重新绘制 View ,从而导致重置 menuView 的位置(也许有人可以在评论中详细说明“为什么”)。如果您使用自动布局约束来操纵 menuView 的位置,它就可以工作。您可以通过设置 spaceConstraint.constant += 100spaceConstraint.constant -= 100 然后调用

来完成此操作
UIView.animateWithDuration(0.65, animations: {
    self.view.layoutIfNeeded()
})

关于swift:计时器(每秒)+gestureRecognizer 使 GUI 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33219384/

相关文章:

timer - 如何设置16位P&F校正PWM中Timer1的频率和占空比

ios - 保存图像以进行解析

ios - 如何在移动应用程序 (iOS) 的谷歌分析中使用多个 View 设置事件跟踪

ios - 使用 Swift 对日历进行 Google 身份验证

ios - SDK 中支持 Swift,部署目标为 7.0

java - 如何垂直对齐 JLabel-JTextField 对

java - 使用什么工具包可以在绘画中制作多个线程? Swing、GWT、FX、Qt 还是什么?

mysql - SSRS 是否是为 MSSQL 过程创建用户界面以检索后端数据的理想工具?

c++ - 如何在 C++ 中设置登录超时?

php - 如何防止多页?