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: Đâ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!
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
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
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