如何防止UITabBarController更新子视图?

时间:2019-03-05 23:04:30

标签: ios swift

在ContainerView内,我有一个UITabBarController子类,在其中我已修改了UITabBar Y位置。而不是放在底部,我使用以下代码将其移到顶部附近:

override func viewDidLayoutSubviews() {
    tabBar.frame = CGRect(x: 0, y: 0, width: tabBar.frame.size.width, height: tabBar.frame.size.height)
    super.viewDidLayoutSubviews()
    delegate = self
    selectedViewController?.view.frame.origin = CGPoint(x: 0, y: tabBar.frame.size.height)
}

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    selectedViewController?.view.frame.origin = CGPoint(x: 0, y: tabBar.frame.size.height)
}

最初效果很好:第一个选项卡视图包含一个UITableView,并且似乎为UITabBar的新位置调整了其框架。但是,如果在推送动画进行到一半时将ViewController推送到堆栈上,则包含UITableView的视图的底部会像UITabBar一样跳到顶部。因此,视图顶部的一部分结束于UITabBar的后面,并在将新的ViewController弹出堆栈后,返回到UITabBarController时,视图(带有tableView)保持在tabBar的新位置之后的位置。我尝试过在ViewWillAppear,ViewWillDisappear,ViewDidDisappear中更改视图原点,并且这些方法都无法将视图(包含tableView)的位置重置为UITabBar的新位置。

我不确定是什么原因导致这种情况发生,或者不确定要研究哪种生命周期方法。

有什么想法或建议吗?

编辑:TableView是实际更改其Origin(而不是视图)的一个。

2 个答案:

答案 0 :(得分:0)

似乎您可能需要将my_paths = [] for line in open(r'd:\mydata\text.txt').readlines(): my_paths.append(line.strip()) print my_paths for dirpath, dirnames, filenames in os.walk(line): my_paths.append(filenames) for filename in filenames: full_path = os.path.join(dirpath, filename) if last_modified(full_path) < threshold: string_output='Age :' +age_file(full_path)+'\n'+'File Size : '+file_size(full_path)+'\n' print(string_output) #create(string_output); 调用放在替代的顶部。你有尝试过吗?我认为超类方法实际上还会调整位置,因此您的更改可能会被覆盖。

答案 1 :(得分:0)

我通过在ViewWillAppear和ViewWillDisappear中执行此代码解决了布局问题。我无法解释为什么会这样,但我确实知道会这样。

tabBar.invalidateIntrinsicContentSize()
tabBar.superview?.setNeedsLayout()
tabBar.superview?.layoutSubviews()