2016-01-12 2 views
0

Я начинаю быстро. Я создаю одно приложение калькулятора подсказки для просмотра, и я хочу, чтобы какая-то анимация произошла, когда приложение загружается в первый раз. И не каждый раз, когда я что-то редактирую.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 (строка: 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

+0

Вы не хотите избегать вызова 'viewDidLayoutSubviews', когда данные вводятся в ваше приложение. Вместо этого вы должны вызвать свою анимацию в нужном месте, чтобы служить своей цели, или вы можете использовать определенный флаг управления, чтобы это произошло только один раз. –

ответ

0

Вместо того, чтобы избежать вызова viewDidLayourSubviews, вы можете добавить простое логическое сальто, чтобы показать свою анимацию только один раз. Добавить свойство boolean, которое вы инициализируете до false; show animation при условии, что это свойство является ложным, и переверните логическое значение после отображения анимации.

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()?)

+0

Спасибо за быстрый ответ. Я попытался настроить флагов boolean, но не смог избежать анимации, даже после установки логического флага true. Если я добавлю анимацию в [viewDidAppear()], анимация не произойдет вообще. – sudeep

+0

Это звучит странно. Вы можете многократно печатать 'print (billView.center.y)'? Кроме того, убедитесь, что вы объявляете 'animationHasBeenShown' в области класса (вне функции if), а не внутри' viewDidLayoutSubviews() '. Если он все еще не работает, убедитесь, что вы не запускаете идентичную анимацию в другом месте, по ошибке. – dfri

+0

класс ViewController: UIViewController { вара animationHasBeenShown = ложная – sudeep

Смежные вопросы