2015-04-16 14 views
5

Tôi đang cố gắng tạo hiệu ứng thay đổi gốc-view-controller trong ứng dụng của mình. Sau khi tôi trao đổi bộ điều khiển xem, tôi tải dữ liệu cần thiết cho bộ điều khiển thứ 2 ngay lập tức. Trong khi dữ liệu đang tải, tôi hiển thị trình tải (MBProgressHUD). Đây là chức năng của tôi để hoán đổi bộ điều khiển chế độ xem:UIView.transitionWithView ngắt bố cục của trình tải

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 
     ) 
    } 
} 

Tất cả điều này chỉ có một điều - nó hoàn toàn phá vỡ bộ nạp. Tôi đang gắn một tưởng tượng về những gì đang xảy ra: 2nd view controller Đây là bộ điều khiển xem thứ 2 trong khi xoay. Khi xoay hoàn thành, bộ tải xuất hiện tốt, cả trục xoay và văn bản được ghép với vị trí chính xác trong hình chữ nhật tròn.

Tôi thực sự không hiểu tại sao điều này xảy ra, ai đó có thể giải thích cho tôi không? Có cách nào để ngăn chặn nó không?

Mã của bộ điều khiển xem 2 nơi tôi hiển thị các bộ nạp:

override func viewDidLoad() { 
    super.viewDidLoad() 

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

    createBackground() 
} 

Và lớp hud tôi:

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 
     } 
    } 
} 

Thanks a lot cho bất kỳ ý tưởng!

Trả lời

2

Bạn đang thêm hud vào một chế độ xem chưa được khởi tạo đúng cách. Nếu bạn đang tải trình điều khiển xem từ một bảng phân cảnh hoặc bảng phân cảnh, chế độ xem và các bản xem phụ của nó có kích thước khi chúng được tải từ giao diện.

Bạn phải thêm hud sau khi lượt xem đã được thay đổi kích thước thành kích thước cuối cùng của chúng.

Nếu bạn di chuyển

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

để viewDidLayoutSubviews, nó sẽ làm việc tốt.

+0

Tại sao bạn cho rằng chế độ xem không được khởi chạy đúng trong viewDidLoad? Nó đã có các giới hạn chính xác và khung chính xác (ví dụ: (0,0,0,0,320,0,480,0) cho một iP4/S). Đó là vòng quay của bộ điều khiển xem khiến cho nó trở nên điên rồ - không có sự chuyển đổi không có vấn đề gì. – Fygo

+0

Làm cách nào để bạn biết chế độ xem có khung chính xác? Bạn đã đặt nhật ký trong viewDidLoad chưa? – pteofil

+0

Nó cũng có thể quan trọng xem chúng ta đang nói về cái gì. "View" này là gì, bạn thêm hud vào, khung nhìn chính của controller hoặc một trong các subviews của nó? Nếu đó là quan điểm chính tôi nghĩ bạn nên sử dụng nó với self.view. – pteofil

0

Tôi nhận thấy sự cố tương tự khi di chuyển ứng dụng từ iOS 7 sang iOS 8. Trong hoạt ảnh, đặc biệt là khi mở rộng quy mô, vị trí chế độ xem bị bóp méo.

Tôi chắc chắn đó là lỗi. Cách giải quyết đơn giản nhất là chỉ tạo ảnh chụp màn hình hoặc xem ảnh chụp nhanh, không phải lượt xem thực tế - nó hoạt động nhiều hơn và bạn không thể xem hoạt ảnh khi hoạt ảnh chính đang diễn ra nhưng nhìn chung nó là giải pháp ổn định hơn.

Các vấn đề liên quan