2017-02-01 4 views
1

В моем приложении, и как только пользователь входит в него, у меня слишком много анимаций на панели инструментов, когда это происходит только один раз - когда пользователь впервые заходит в приложение -Зачем использовать self.view.layoutIfNeeded() в анимации заставлять приложение замораживать?

Я выполняю анимацию таким образом в viewDidAppear в вызове upperViewAnimation() функции, которая вызывает другую анимацию функции, чтобы быть более ясным это используется код:

func upperViewAnimation() { 

    contianerTop.constant = 0 
    UIView.animateWithDuration(0.45, animations: {() -> Void in 

     self.view.layoutIfNeeded() 

     }, completion:{(finished) in 

      if finished { 
       if noInternetConnection && !noInternetConnectionPopup { 
        self.noConnectionViewHeight.constant = 50 
        UIView.animateWithDuration(0.3, animations: { 
        self.view.layoutIfNeeded() 
        }) 

        noInternetConnectionPopup = true 
        openNoInternetConnection() 
       } 
       else if noInternetConnection { 
        self.noConnectionViewHeight.constant = 50 
        UIView.animateWithDuration(0.3, animations: { 
        self.view.layoutIfNeeded() 
        }) 

       } 
       else { 
        self.noConnectionViewHeight.constant = 0 
        UIView.animateWithDuration(0.3, animations: { 
        self.view.layoutIfNeeded() 
         }, completion: { (finished) in 
          self.pullToRefreshAction() 
        }) 
       } 
       self.notificationButtonAnimationAndMenuButton() 
       self.moreAppsLabel.hidden = false 
      } 
    }) 
} 

func pullToRefreshAction() { 
    pullToRefreshContainsFailure = false 
    addBlurToCellDelegate?.removeBlurFromAllCells() 

    if firstAppear || userLoggedIn { 
     self.firstAppear = false 
     userLoggedIn = false 
     loadingView2.removeFromSuperview() 
     sucessView.removeFromSuperview() 
     var viewHeight:CGFloat = 50 
     if isiPadFlag { 
      viewHeight = 60 
     } 
     loadingView2 = NSBundle.mainBundle().loadNibNamed("GettingDataView", owner: self, options: nil)[0] as! GettingDataView 
     loadingView2.frame = CGRect(x: 0, y: 0, width: screenWidth, height: viewHeight) 
     self.noConnectionView.addSubview(loadingView2) 
     loadingView2.initView() 
     gettingDataForFirstTime = true 

     if showPullToRefreshBool { 
       self.noConnectionViewHeight.constant = 50 
      } 
      UIView.animateWithDuration(0.3, animations: { 
       self.view.layoutIfNeeded() 
      }) 
     } 
     else { 
      self.noConnectionViewHeight.constant = 0 
     } 
    } if !gettingData { 
      // I called requests to get data 

     } 
} 

, когда я выполняю предыдущий код мое приложение иногда замерзает, и, кажется, что расположение никогда не изменял (т. е. кажется, что приложение никогда не отображает пользовательский интерфейс)

Интересно, если слишком много self.view.layoutIfNeeded() вызывают эту проблему?

Действительно я отказаться от этой странной проблемы,

Пожалуйста, помогите,

Спасибо.

+0

Необходимо увидеть ваш видDidLayoutSubviews. 99% вероятность того, что вы что-то делаете, что снова запускает макет, так что он работает в бесконечном цикле. Его легко проверить; разместите там заявление печати и посмотрите, печатает ли он несколько раз. –

+0

@JoshHomann эй Josh, спасибо за вашу помощь, actullay я не делал каких-либо важных вещей в viewDidLayoutSubviews, это мой код в нем: переопределение функ viewDidLayoutSubviews() { infoButtoniPad.highlighted = MainDashboardState.InfoStatus settingsButtoniPad.highlighted = MainDashboardState.SettingStatus profileButtoniPad.highlighted = MainDashboardState.ProfileStatus dashboardButtoniPad.highlighted = MainDashboardState.DashboardStatus openGreenPointFromDashboard = ложь } – Rawan

ответ

0

Попробуйте установить блок завершения анимации UIView в вашем первом блоке завершения в upperViewAnimation и продолжите запуск своих вещей в завершающем блоке, а не за его пределами.

Если это не поможет. Попробуйте добавить свои методы в viewDidLayoutSubviews. Также убедитесь, что ваши анимации вызываются только один раз за раз, viewDidAppear/viewDidLayoutSubviews может вызываться несколько раз, и если вы вызываете его несколько раз во время анимации, все может зависнуть или стать более странным.

Вы можете решить эту проблему с помощью простого флажка BOOL при запуске анимации и установить значение false при завершении анимации в готовом блоке.

+0

спасибо за ваш ответ, но я не получил эту точку зрения: «Попытка установить блок завершения для UIView анимации в вашем первом завершающем блоке в upperViewAnimation и продолжайте использовать ваши материалы в завершающем блоке вместо вне его ". Можете ли вы, пожалуйста, объяснить больше или дать мне пример моего кода, пожалуйста? – Rawan

+0

self.notificationButtonAnimationAndMenuButton() self.moreAppsLabel.hidden = false, например, методы помещают их в завершающий блок анимации. Но я думаю, что ваша главная проблема - это то, что я изложил в своем ответе, viewDidAppear и viewDidLayoutSubviews не гарантируют, что вы получите только один раз, вам нужно проверить флаг, что ваши анимации выполняются только один раз за один раз, что решит ваши проблемы. Я конечно. –

+0

Спасибо, за указанную проблему, да, я обрабатываю ее уже в флагом Bool :( – Rawan