2015-04-16 4 views
5

Я пытаюсь анимировать изменение корневого контроллера в моем приложении. После того, как я поменяю контроллеры представлений, я сразу же загружу данные, необходимые для второго контроллера. Пока данные загружаются, я показываю загрузчик (MBProgressHUD). Это моя функция для замены контроллеров отображений:UIView.transitionWithView разбивает макет загрузчика

class ViewUtils { 

    class func animateRootViewController(duration: NSTimeInterval, changeToViewController: UIViewController) { 
     let window = UIApplication.sharedApplication().delegate?.window? 
     if window == nil { 
      return 
     } 
     UIView.transitionWithView(window!, 
      duration: duration, 
      options: UIViewAnimationOptions.TransitionFlipFromLeft | UIViewAnimationOptions.AllowAnimatedContent, 
      animations: { 
       window!.rootViewController = changeToViewController 
      }, 
      completion: nil 
     ) 
    } 
} 

Все хорошо с этим, но одна вещь - это полностью ломает загрузчик. Я добавляю представление о том, что происходит: 2nd view controller Это 2-й контроллер просмотра при вращении. Как только поворот завершен, погрузчик выглядит просто отлично, как прядильщик, так и текстовая анимация в правильном положении в закругленном прямоугольнике.

Я действительно не понимаю, почему это происходит, может кто-нибудь объяснить это мне, пожалуйста? Есть ли способ предотвратить это?

Код 2-го контроллера представления, где я показываю погрузчик:

override func viewDidLoad() { 
    super.viewDidLoad() 

    hud = HUD(containingView: view) 
    hud.show() 

    createBackground() 
} 

И мой класс HUD:

class HUD { 

    private var hudBG: UIView! 
    private var view: UIView! 
    private(set) var isShown = false 

    init(containingView: UIView) { 
     view = containingView 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func show() { 
     if !isShown { 
      if(hudBG == nil) { 
       hudBG = UIView(frame: CGRectMake(0, 0, view.bounds.width, view.bounds.height)) 
       hudBG.backgroundColor = UIColor(white: 0, alpha: 0.4) 
      } 
      view.addSubview(hudBG) 
      let hud = MBProgressHUD.showHUDAddedTo(view, animated: true) 
      hud.mode = MBProgressHUDModeIndeterminate 
      hud.labelText = "Cargando" 

      hudBG.alpha = 0 

      UIView.animateWithDuration(0.3, animations: {() -> Void in 
       self.hudBG.alpha = 1 
      }) 
      isShown = true 
     } 
    } 

    func hide() { 
     if isShown { 
      UIView.animateWithDuration(0.3, animations: { 
       () -> Void in 
       self.hudBG.alpha = 0 
      }, completion: { 
       (b) -> Void in 
       self.hudBG.removeFromSuperview() 
      }) 
      MBProgressHUD.hideHUDForView(view, animated: true) 
      isShown = false 
     } 
    } 
} 

спасибо за любые идеи!

ответ

2

Вы добавляете хад в представление, которое еще не было правильно инициализировано. Если вы загружаете контроллер вида из xib или раскадровки, представление и его подвид имеют размер, поскольку они были загружены из интерфейса.

Вы должны добавить hud после того, как размеры были изменены до их окончательного размера.

Если вы переезжаете

hud = HUD(containingView: view) 
hud.show() 

к viewDidLayoutSubviews, он должен работать нормально.

+0

Почему, по вашему мнению, представление не правильно инициализировано в viewDidLoad? Он уже имеет правильные границы и правильный кадр (например, (0,0,0,0,320,0,480.0) для iP4/S). Это вращение регулятора зрения, что заставляет его сходить с ума - без перехода нет проблем. – Fygo

+0

Как вы знаете, что представление имеет правильный фрейм? Вы поместили журнал в viewDidLoad? – pteofil

+0

Может также иметь значение, о чем мы говорим. Что это за «вид», что вы добавляете хад, основной вид контроллера или одно из его подзонов? Если это главное мнение, я думаю, вы должны использовать его с self.view. – pteofil

0

Я заметил подобную проблему при перемещении приложения из iOS 7 в iOS 8. Во время анимации, особенно при масштабировании, позиции представления исказились.

Я уверен, что это ошибка. Простейшим обходным решением является анимация только скриншотов или просмотр снимков, а не фактических просмотров - это больше работает, и вы не можете просматривать анимацию, когда идет основная анимация, но в целом это более стабильное решение.

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