【问题标题】:Swift: How can I make a animation happen only once and not every time I edit something斯威夫特:我怎样才能让动画只发生一次,而不是每次编辑时
【发布时间】:2016-01-12 22:47:43
【问题描述】:

我是 swift 的初学者。我正在构建一个单一视图提示计算器应用程序,我只希望在应用程序第一次加载时发生一些动画。并且不是每次我编辑某些东西时都会发生。

这是我的代码: 当应用程序加载时,我将容器隐藏在视图之外

override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated) 

    billView.center.y -= (billView.frame.height)/2

}

并使其向下移动

override func viewDidLayoutSubviews() {
           super.viewDidLayoutSubviews()

    UIView.animateWithDuration(0.8, delay: 0.0,
        options: [.CurveEaseOut], animations: {
            self.billView.center.y = 210  }, completion: nil)
    print(billView.center.y)

}

这在应用加载时工作正常。不幸的是,每当我与应用程序交互时,这个动画就会一次又一次地发生。

当调用此函数时(即在文本字段中输入任何信息或移动滑块时)会发生此动画

让 billAmount = NSString(string: billField.text!).doubleValue

    var tipPercentages = [0.15, 0.18, 0.22]

    let tipPercentage = tipPercentages[segTipControl.selectedSegmentIndex]

    let percentLabel = round(tipPercentage * 100)

    selectedbillPercentageLabel.text = "+\(percentLabel)%"

    let tipAmount = billAmount * tipPercentage

    let totalAmount = billAmount + tipAmount

    let roundedTotalAmount = round(totalAmount * 100)/100

    totalLabel.text = "$\(roundedTotalAmount)"

    let splitSelected = Double(splitValueSlider.value)

    let intsplitSelected = Int(splitSelected)

    splitLabel.text = "\(intsplitSelected)"

    let splitDollarAmount = roundedTotalAmount/splitSelected

    let roundedSplitDollarAmount = round(splitDollarAmount * 100)/100

    splitAmount.text = "$\(roundedSplitDollarAmount)"

有什么方法可以避免在应用中输入任何数据时调用 viewDidLayoutSubviews() 方法。

animated gif

【问题讨论】:

  • 您不想在应用中输入数据时避免调用viewDidLayoutSubviews。相反,你应该在正确的地方调用你的动画来达到你的目的,或者你可以使用某些控制标志让它只发生一次。

标签: ios swift uikit


【解决方案1】:

您可以添加一个简单的布尔翻转来只显示一次动画,而不是避免调用viewDidLayourSubviews。添加一个你初始化为false的布尔属性;在此属性为 false 的情况下显示动画,并在动画显示后翻转布尔值。

var animationHasBeenShown = false // class property

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if !animationHasBeenShown {
        UIView.animateWithDuration(0.8, delay: 0.0,
            options: [.CurveEaseOut], animations: {
                self.billView.center.y = 210  }, completion: nil)
        print(billView.center.y)

        animationHasBeenShown = true
    }
}

或者,考虑将您的动画放在另一个上下文中;它真的需要在viewDidLayoutSubviews() 中吗(取决于您的应用程序的上下文,但可能在viewDidAppear() 中?)

【讨论】:

  • 感谢您的快速回复。我尝试设置布尔标志,但即使将布尔标志设置为 true,也无法避免动画的发生。如果我在 [viewDidAppear()] 中添加动画,那么动画根本不会发生。
  • 这听起来很奇怪。你能看到重复打印的print(billView.center.y) 吗?此外,请确保在类范围内声明 animationHasBeenShown(在函数外部),而不是在 viewDidLayoutSubviews() 内。如果它仍然不起作用,请确保您不会在其他地方错误地运行相同的动画。
  • 类 ViewController: UIViewController { var animationHasBeenShown = false
  • override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) billView.center.y = -210 } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() if !animationHasBeenShown { UIView.animateWithDuration (0.8, 延迟: 0.0, 选项: [.CurveEaseOut], 动画: { self.billView.center.y = 210 }, 完成: nil) print(billView.center.y) var animationHasBeenShown = true }
  • 我们有它!您正在创建一个局部变量 animationHasBeenShown within for 循环,并将其值设置为 true(不是类属性 animationHasBeenShown)。在 for 循环中删除 animationHasBeenShown 之前的 var,布尔翻转应该按预期工作。
猜你喜欢
  • 2017-08-30
  • 1970-01-01
  • 2015-12-06
  • 2022-08-20
  • 1970-01-01
  • 2015-11-20
  • 2018-10-27
  • 2020-11-28
  • 1970-01-01
相关资源
最近更新 更多