【问题标题】:UIView.transitionWithView breaks the loader's layoutUIView.transitionWithView 破坏了加载器的布局
【发布时间】:2015-06-23 14:42:21
【问题描述】:

我正在尝试为我的应用程序中的 root-view-controller-change 设置动画。交换视图控制器后,我立即加载第二个控制器所需的数据。在加载数据时,我显示了一个加载器(MBProgressHUD)。这是我交换视图控制器的功能:

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

这一切都很好,但有一件事 - 它完全破坏了装载机。我附上了正在发生的事情的想象: 这是旋转时的第二个视图控制器。旋转完成后,加载器看起来就好了,微调器和文本补间到圆角矩形中的正确位置。

我真的不明白为什么会发生这种情况,请有人向我解释一下吗?有什么办法可以预防吗?

我展示加载器的第二个视图控制器的代码:

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

非常感谢您的任何想法!

【问题讨论】:

    标签: ios objective-c swift animation uiview


    【解决方案1】:

    您正在将 hud 添加到尚未正确初始化的视图中。 如果您从 xib 或故事板加载视图控制器,则视图及其子视图的大小与从界面加载时一样。

    在将视图调整为最终大小后,您必须添加 hud。

    如果你移动

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

    viewDidLayoutSubviews,它应该可以正常工作。

    【讨论】:

    • 为什么你认为viewDidLoad中没有正确初始化视图?它已经具有正确的边界和正确的帧(例如,iP4/S 的 (0.0,0.0,320.0,480.0))。正是视图控制器的旋转让它变得疯狂——没有过渡就没有问题。
    • 你怎么知道视图有正确的框架?你在 viewDidLoad 中写了日志吗?
    • 我们谈论的观点可能也很重要。将 hud 添加到控制器主视图或其中一个子视图的“视图”是什么?如果它是主视图,我认为您应该将其与 self.view 一起使用。
    • 在 viewDidLoad 中,视图总是有正确的框架。我仍然尝试将您的建议放在 viewDidLayoutSubviews 中,但它的行为方式完全相同。 “视图”是控制器的主视图。不需要 self.view,因为它在同一范围内,而不是在闭包内。
    • 根据一些用户 cmets 对这里的回答:stackoverflow.com/questions/7703806/… 问题出在您更改了 rootViewController 的事实。我建议您为您的应用程序创建另一个根本不更改的 RootViewController。并将您当前的 rootViewControlelr 作为子视图控制器添加到创建的新 RootViewController 中。当你想要进行过渡时,在 RootViewController 的子视图控制器之间进行动画过渡
    【解决方案2】:

    在将应用程序从 iOS 7 移动到 iOS 8 时,我注意到了类似的问题。在动画期间,尤其是在涉及缩放时,视图位置会失真。

    我很确定这是一个错误。最简单的解决方法是仅对屏幕截图或视图快照进行动画处理,而不是实际视图 - 这需要更多的工作,并且在主动画正在进行时您不能让视图动画,但总的来说这是一个更稳定的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      相关资源
      最近更新 更多