iOS 动画 UITabBarController 滑动; View 重叠状态栏 - 仅在第一次加载时

标签 ios animation layout swipe tabbar

我尝试自己制作 TabBarControllers View 的左/右滑动动画。当您滑动时,新的传入 View 会向上移动 iOS 状态栏的高度。因此,它直接连接到屏幕顶部并与状态栏重叠。动画完成后, View 会跳到正确的位置。 这只发生在第一次加载 View / View 尚未加载时。如果失败,则在动画开始之前 isViewLoaded 为 false。

    UIView.transition(from: selectedViewController!.view, to: getTabView(index),
    duration: 0.3, options: UIView.AnimationOptions.transitionCrossDissolve,
    completion: { _ in selectedIndex = index })

    ...

    func getTabView(_ index:Int) -> UIView {
      if self.viewControllers![index].isViewLoaded {
        //print "loaded" - all fine - view's position is correct
        //tried loadView() but doesnt change anything
      }
      else {
        //print "first load" - view is shifted up
      }
      return viewControllers![index].view //when accessing .view, the view is loaded anyway (docs)
    }

顺便说一句,当我通过 tabBar 按钮切换选项卡时,不会出现该问题。

非常感谢!

最佳答案

虽然还是很奇怪,但我已经解决了。 首先,我设置了一个 UITabBarControllerDelegate,以便在触摸选项卡栏按钮时在选项卡之间进行 CrossDissolve。 因为这可以正常工作,所以我想我可以以某种方式调用委托(delegate)函数

    tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool

以编程方式代替

    UIView.transition(from: selectedViewController!.view, to: getTabView(index),
    duration: 0.3, options: UIView.AnimationOptions.transitionCrossDissolve,
    completion: { _ in selectedIndex = index })

这不起作用,还有另一个故障。但之前它在某种程度上是显而易见的,因为我读到它并不打算直接调用这个委托(delegate)函数。 通过尝试这个和那个,它突然起作用了。我不小心取消了以下两项注释:委托(delegate)函数调用和 UIView.transition 之后。这有效。

关于iOS 动画 UITabBarController 滑动; View 重叠状态栏 - 仅在第一次加载时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58989844/

相关文章:

ios - UITableView 无法在模拟器中正确显示内容(视网膜 4 英寸)

ios - 涂鸦...Open GL?

java - 如何先播放动画然后再做一些事情?

类对象数组中的 C++ 内存

html - 通过 CSS 处理大字符串、截断或隐藏的更优雅的方法是什么?

ios - 针对 Game Center 身份验证的 Xcode 4.6 ARC 警告

ios - 火力地堡错误 : "cannot assign type User? to type User?"

jquery - 如何在 Canvas 中制作一个圆圈,当它的容器悬停时,圆圈的边框会增加几个px,或者建议?

ios - 在 Apple Watch/WatchKit 中快速设置几秒钟后 View 的 Alpha 的更好方法

Java AWT 应用程序窗口填充