导航回父视图控制器时 UIButton 位于选项卡栏后面 - iOS
UIButton going behind Tab Bar when navigating back to parent View Controller - iOS
我在 TabBarViewController
上放置了 2 个 UIButton
(也嵌入了导航控制器)。
在最后ViewController(在导航控制器堆栈中),我必须隐藏标签栏,我已经成功实现了。
问题是,当我导航回 parentViewController
时,UIButton
位于标签栏后面(参见下面的 GIF 图片):
红色的录制按钮和红色的“保留”按钮是UIButton
,而不是tabBarButtons
这就是我在 tabBarViewController
中添加 UIButtons
的方式:
self.button1 = [UIButton buttonWithType:UIButtonTypeCustom];
[self.button1 addTarget:self action:@selector(recordButtonClick:) forControlEvents:UIControlEventTouchUpInside];
self.button1.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin;
self.button1.frame = CGRectMake(0.0, 0.0, buttonImage.size.width, buttonImage.size.height);
[self.button1 setBackgroundImage:[UIImage imageNamed:@"bar_button_record"] forState:UIControlStateNormal];
heightDifference = buttonImage.size.height - self.tabBar.frame.size.height;
if (heightDifference < 0)
self.button1.center = self.tabBar.center;
else
{
CGPoint center = self.tabBar.center;
center.y = center.y - heightDifference/2.0 - 0;
self.button1.center = center;
}
[self.view addSubview:self.button1];
另一个红色的“Preserve”按钮也添加了与上面类似的代码。
现在在我的最后一个 navigationViewController
中,我通过以下代码隐藏 tabBar
:
#pragma mark - Overriden UIViewController methods, this function gets called automatically when viewController is loaded
- (BOOL)hidesBottomBarWhenPushed {
return YES;
}
上面的函数返回 YES
隐藏了 tabBar,但它使按钮在转到以前的视图控制器时位于 tabBar 后面。
如果我将其更改为 NO
,则按钮不会落后于 tabBar
,而且 tabBar
也不会隐藏在最后一个 viewController
.
请提出一种方法,以不同的方式隐藏 tabBar,或将 UIButton
置于前面。
谢谢!
您是否尝试过在视图布局时将按钮放在前面?
例如
self.view.bringSubviewToFront(self.button1)
或者实例化在tabBar上方
self.view.insertSubview(self.button1, aboveSubview: self.tabBar)
好的,找到解决方案了!而不是通过
隐藏 tabBar
- (BOOL)hidesBottomBarWhenPushed {
return YES;
}
在最后 viewController
中隐藏 [tabBarController.tabBar setHidden:YES]
的 tabBar
。然后在返回时,在 viewWillDisappear
.
中执行 [tabBarController.tabBar setHidden:NO];
这样 tabBarController
中的 subviews
排列保持不变 :)
尝试了@Sha 的回答,另外这就是我对 运行 所做的成功。
确保在 Last ViewController
中添加此代码
var tabbarViewController: tabbarViewController?
var tabbarHoldonFrame = CGRect()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.hideTabbar()
}
func hideTabbar() {
// get instance of tabbar controller
tabbarViewController = self.navigationController?.tabBarController as? tabbarViewController
// hide tabbar
tabbarViewController?.tabBar.isHidden = true
// hide your additional button placed above tabbar
tabbarViewController?.buttonCreateContest.isHidden = true
// hold it's frame in tabbarHoldonFrame, set zero temporarily
tabbarHoldonFrame = (tabbarViewController?.tabBar.frame)!
tabbarViewController?.tabBar.frame = CGRect.zero
}
override func viewWillDisappear(_ animated: Bool) {
self.showTabbar()
}
func showTabbar() {
// show it
tabbarViewController?.tabBar.isHidden = false
// show your button
tabbarViewController?.buttonCreateContest.isHidden = false
// add default frame
tabbarViewController?.tabBar.frame = tabbarHoldonFrame
}
在您的自定义标签栏控制器中添加以下方法以解决您的自定义按钮在标签栏后面的问题。
Objective-C代码:
-(void)viewDidLayoutSubviews {
if (self.centerButton != nil) {
[self.view bringSubviewToFront:self.centerButton];
for (UIView *vw in self.view.subviews) {
if ([vw isKindOfClass:[UITabBar class]]){
if(vw.hidden){
self.centerButton.hidden = true;
}
else {
self.centerButton.hidden = false;
}
}
}
}
}
Swift代码:
override func viewDidLayoutSubviews() {
if self.centerButton != nil {
self.view.bringSubview(toFront: self.centerButton)
for vw in self.view.subviews {
if let subView = vw as? UITabBar {
if subView.isHidden == true {
self.centerButton.isHidden = true
} else {
self.centerButton.isHidden = false
}
}
}
}
}
只是有点慢,视图从隐藏到显示或从显示到隐藏有0.5秒左右的延迟。
我在 TabBarViewController
上放置了 2 个 UIButton
(也嵌入了导航控制器)。
在最后ViewController(在导航控制器堆栈中),我必须隐藏标签栏,我已经成功实现了。
问题是,当我导航回 parentViewController
时,UIButton
位于标签栏后面(参见下面的 GIF 图片):
红色的录制按钮和红色的“保留”按钮是UIButton
,而不是tabBarButtons
这就是我在 tabBarViewController
中添加 UIButtons
的方式:
self.button1 = [UIButton buttonWithType:UIButtonTypeCustom];
[self.button1 addTarget:self action:@selector(recordButtonClick:) forControlEvents:UIControlEventTouchUpInside];
self.button1.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin;
self.button1.frame = CGRectMake(0.0, 0.0, buttonImage.size.width, buttonImage.size.height);
[self.button1 setBackgroundImage:[UIImage imageNamed:@"bar_button_record"] forState:UIControlStateNormal];
heightDifference = buttonImage.size.height - self.tabBar.frame.size.height;
if (heightDifference < 0)
self.button1.center = self.tabBar.center;
else
{
CGPoint center = self.tabBar.center;
center.y = center.y - heightDifference/2.0 - 0;
self.button1.center = center;
}
[self.view addSubview:self.button1];
另一个红色的“Preserve”按钮也添加了与上面类似的代码。
现在在我的最后一个 navigationViewController
中,我通过以下代码隐藏 tabBar
:
#pragma mark - Overriden UIViewController methods, this function gets called automatically when viewController is loaded
- (BOOL)hidesBottomBarWhenPushed {
return YES;
}
上面的函数返回 YES
隐藏了 tabBar,但它使按钮在转到以前的视图控制器时位于 tabBar 后面。
如果我将其更改为 NO
,则按钮不会落后于 tabBar
,而且 tabBar
也不会隐藏在最后一个 viewController
.
请提出一种方法,以不同的方式隐藏 tabBar,或将 UIButton
置于前面。
谢谢!
您是否尝试过在视图布局时将按钮放在前面?
例如
self.view.bringSubviewToFront(self.button1)
或者实例化在tabBar上方
self.view.insertSubview(self.button1, aboveSubview: self.tabBar)
好的,找到解决方案了!而不是通过
隐藏tabBar
- (BOOL)hidesBottomBarWhenPushed {
return YES;
}
在最后 viewController
中隐藏 [tabBarController.tabBar setHidden:YES]
的 tabBar
。然后在返回时,在 viewWillDisappear
.
[tabBarController.tabBar setHidden:NO];
这样 tabBarController
中的 subviews
排列保持不变 :)
尝试了@Sha 的回答,另外这就是我对 运行 所做的成功。
确保在 Last ViewController
var tabbarViewController: tabbarViewController?
var tabbarHoldonFrame = CGRect()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.hideTabbar()
}
func hideTabbar() {
// get instance of tabbar controller
tabbarViewController = self.navigationController?.tabBarController as? tabbarViewController
// hide tabbar
tabbarViewController?.tabBar.isHidden = true
// hide your additional button placed above tabbar
tabbarViewController?.buttonCreateContest.isHidden = true
// hold it's frame in tabbarHoldonFrame, set zero temporarily
tabbarHoldonFrame = (tabbarViewController?.tabBar.frame)!
tabbarViewController?.tabBar.frame = CGRect.zero
}
override func viewWillDisappear(_ animated: Bool) {
self.showTabbar()
}
func showTabbar() {
// show it
tabbarViewController?.tabBar.isHidden = false
// show your button
tabbarViewController?.buttonCreateContest.isHidden = false
// add default frame
tabbarViewController?.tabBar.frame = tabbarHoldonFrame
}
在您的自定义标签栏控制器中添加以下方法以解决您的自定义按钮在标签栏后面的问题。
Objective-C代码:
-(void)viewDidLayoutSubviews {
if (self.centerButton != nil) {
[self.view bringSubviewToFront:self.centerButton];
for (UIView *vw in self.view.subviews) {
if ([vw isKindOfClass:[UITabBar class]]){
if(vw.hidden){
self.centerButton.hidden = true;
}
else {
self.centerButton.hidden = false;
}
}
}
}
}
Swift代码:
override func viewDidLayoutSubviews() {
if self.centerButton != nil {
self.view.bringSubview(toFront: self.centerButton)
for vw in self.view.subviews {
if let subView = vw as? UITabBar {
if subView.isHidden == true {
self.centerButton.isHidden = true
} else {
self.centerButton.isHidden = false
}
}
}
}
}
只是有点慢,视图从隐藏到显示或从显示到隐藏有0.5秒左右的延迟。