आईफ - Iphone: क्या TabBar को छिपाना संभव है?(पूर्व iOS 8)




आईफोन महंगा क्यों होता है (11)

UITabBarController के एक उपवर्ग के अंदर मोनोटोच में बस निम्न कोड बनाया गया है:

    public void ShowTabBar()
    {
        UIView.BeginAnimations("Anim");
        UIView.SetAnimationDuration(0.25f);
        this.View.Subviews[0].Frame = new RectangleF(0f, 0f, 320f, 431f);
        this.TabBar.Frame = new RectangleF(0f, 431f, 320f, 49f);
        this.TabBar.Hidden = false;
        UIView.CommitAnimations();
    }

    public void HideTabBar()
    {
        UIView.BeginAnimations("Anim");
        UIView.SetAnimationDuration(0.25f);
        this.View.Subviews[0].Frame = new RectangleF(0f, 0f, 320f, 480f);
        this.TabBar.Frame = new RectangleF(0f, 481f, 320f, 510f);
        this.TabBar.Hidden = true;
        UIView.CommitAnimations();          
    }

मेरे पास एक एप्लिकेशन है जो मोड के बीच स्विच करने के लिए एक UITabBarController का उपयोग करता है। जब एक निश्चित मोड में, मैं टैब बार को छुपाना चाहूंगा जब तक कि उस मोड के चरण पूरे नहीं हो जाते। ध्यान दें कि मैं नेविगेशन नियंत्रक का उपयोग नहीं कर रहा हूं, इसलिए मैं टैब बार को छिपाने के लिए नेविगेशन नियंत्रक पर setHidesBottomBarWhenPushed विधि का उपयोग नहीं कर सकता।

IOS 8 से पहले, जब मैं तारबार को छिपाने का प्रयास करता हूं:

self.tabBarController.tabBar.hidden = YES

टैब बार चला जाता है, लेकिन यह स्क्रीन के निचले भाग में एक 50 पिक्सेल खाली क्षेत्र छोड़ता है जहां टैब बार हुआ करता था। मैं यह नहीं जान सकता कि उस क्षेत्र को कैसे भरा जाए। UI में कुछ भी जो उस क्षेत्र में है, उसे क्लिप किया जाता है और उसे देखा नहीं जा सकता है।

किसी भी विचार अगर यह भी संभव है? मैं वास्तव में नेविगेशन कंट्रोलर से दूर रहना चाहता हूं।


UIViewController की init विधि में स्टेटमेंट डालें

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        self.hidesBottomBarWhenPushed = true
        setupDependencyConfigurator()
    }

आप नेविगेशन नियंत्रक का उपयोग क्यों नहीं कर रहे हैं। टैब बार की तुलना में नेव बार को छिपाना बहुत आसान है ...


आशा है कि यह काम करेगा।

@interface UITabBarController (Additions)

-(void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated;

@end

@implementation UITabBarController (Additions)

-(void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated
{
    if (animated)
    {
        [UIView beginAnimations:nil context:nil];
    }
    if (hidden)
    {

        self.tabBar.frame = CGRectMake(self.tabBar.frame.origin.x, self.tabBar.superview.frame.size.height, self.tabBar.bounds.size.width, self.tabBar.bounds.size.height);
    }
    else
    {
        self.tabBar.frame = CGRectMake(self.tabBar.frame.origin.x, self.tabBar.superview.frame.size.height - self.tabBar.frame.size.height + 10, self.tabBar.bounds.size.width, self.tabBar.bounds.size.height);
    }
    if (animated)
    {
        [UIView commitAnimations];
    }

}


क्या आपके पास उप दृश्य पर autoResizingMask सेट है?

view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

कुछ ऐसा करना चाहिए कि चाल चलें और बैठे हुए दृश्य को फिर से आकार में ढेर होने दें।


दिन में थोड़ी देर हो गई है, लेकिन इस सवाल के सभी जवाबों के बारे में जो मैंने आज दोपहर तक फंसे हुए हैं, यह वह है जिसने मेरे लिए सबसे अच्छा काम किया है।

Uitabbarcontroller को कैसे छिपाएं

// Method call
[self hideTabBar:self.tabBarController];   
// Method implementations
- (void)hideTabBar:(UITabBarController *) tabbarcontroller
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];

    for(UIView *view in tabbarcontroller.view.subviews)
    {
        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)];
        } 
        else 
        {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)];
        }
    }

    [UIView commitAnimations];   
}

- (void)showTabBar:(UITabBarController *) tabbarcontroller
{       
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    for(UIView *view in tabbarcontroller.view.subviews)
    {
        NSLog(@"%@", view);

        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, 431, view.frame.size.width, view.frame.size.height)];

        } 
        else 
        {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 431)];
        }
    }

    [UIView commitAnimations]; 
}

मैं इसे प्राप्त करने के लिए केवल एक ही लाइन का उपयोग करता हूं। टैब बार वाले व्यू कंट्रोलर को दिखाने से पहले मैं तैयारफोरगेज विधि का उपयोग करता हूं।

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([segue.identifier isEqualToString:@"showLogin"]){
        [segue.destinationViewController setHidesBottomBarWhenPushed:YES];
    }
}

मैंने ऊपर दिए गए कई समाधानों की कोशिश की, लेकिन iOS 8 में कोई खुशी नहीं है। मुझे लगता है कि मेरे लिए निम्नलिखित कार्यों को देखने में सेटिंग। IOS 7 में काम करना चाहिए क्योंकि विस्तारितLayoutIncludesOpaqueBars तब पेश किया गया था।

    self.extendedLayoutIncludesOpaqueBars = true
    self.tabBarController?.tabBar.isHidden = true
    self.tabBarController?.tabBar.isOpaque = true

और यदि आपको बार-बार tabBars चालू करने की आवश्यकता होती है, जब आप viewWillDisappear में निम्नलिखित का उपयोग करना छोड़ दें।

    self.tabBarController?.tabBar.isHidden = false
    self.tabBarController?.tabBar.isOpaque = false

मैं TabBar छिपाए रखने के लिए एक संक्रमण से वापसी की अनुमति देने के लिए इसका उपयोग करता हूं। एक बटन कार्रवाई में इसका इस्तेमाल नहीं किया गया था, लेकिन अगर आप की तरह मुझे अब कुछ भी नहीं मिलता है, तो यह एक प्रोग्राम योग्य समाधान का आधार हो सकता है।


यहाँ उस के लिए मेरा कोड है:

यह, निश्चित रूप से, नियंत्रक के दृष्टिकोण पदानुक्रम में चल रहा है। यह बदल सकता है / टूट सकता है। यह परिभाषित API का उपयोग करता है, इसलिए Apple परवाह नहीं करेगा, लेकिन वे आपके कोड को तोड़ने की परवाह नहीं करेंगे।

- (void)hideTabBar {
  UITabBar *tabBar = self.tabBarController.tabBar;
  UIView *parent = tabBar.superview; // UILayoutContainerView
  UIView *content = [parent.subviews objectAtIndex:0];  // UITransitionView
  UIView *window = parent.superview;

  [UIView animateWithDuration:0.5
                   animations:^{
                     CGRect tabFrame = tabBar.frame;
                     tabFrame.origin.y = CGRectGetMaxY(window.bounds);
                     tabBar.frame = tabFrame;
                     content.frame = window.bounds;
                   }];

  // 1
}

- (void)showTabBar {
  UITabBar *tabBar = self.tabBarController.tabBar;
  UIView *parent = tabBar.superview; // UILayoutContainerView
  UIView *content = [parent.subviews objectAtIndex:0];  // UITransitionView
  UIView *window = parent.superview;

  [UIView animateWithDuration:0.5
                   animations:^{
                     CGRect tabFrame = tabBar.frame;
                     tabFrame.origin.y = CGRectGetMaxY(window.bounds) - CGRectGetHeight(tabBar.frame);
                     tabBar.frame = tabFrame;

                     CGRect contentFrame = content.frame;
                     contentFrame.size.height -= tabFrame.size.height;
                   }];

  // 2
}

संपादित करें : एक अनाम उपयोगकर्ता ने 7.0 के लिए निम्नलिखित जोड़ का सुझाव दिया है (मैंने यह परीक्षण नहीं किया है, और यह नहीं कह सकता है कि क्या यह वर्कअराउंड या एक आदर्श कार्यान्वयन है):

// 1. To Hide the black line in IOS7 only, this extra bit is required
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [self.tabBarController.tabBar setTranslucent:YES];
}  

// 2. For IOS 7 only
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [self.tabBarController.tabBar setTranslucent:NO];
}

संपादित करें : 8.x में पूरी तरह से अप्रकाशित और कुछ लेआउट में कमी।


यहाँ मेरा समाधान है (मेरा टैब व्यू कंट्रोलर अच्छे उपाय के लिए नेविगेशन कंट्रोलर के अंदर है) ... इसलिए मैंने UITabBarController को उप- -setTabBarHidden: किया है और यह किया है ... -setTabBarHidden: विधि

- (void)setTabBarHidden:(BOOL)hidden {
    _tabBarHidden = hidden;

    [UIView performWithoutAnimation:^{
        [self adjustViews];
    }];

}

- (void)adjustViews {
    if ( _tabBarHidden ) {
        CGRect f = self.tabBar.frame;

        // move tab bar offscreen
        f.origin.y = CGRectGetMaxY(self.view.frame);
        self.tabBar.frame = f;

        // adjust current view frame
        self.selectedViewController.view.frame = self.view.frame;
    } else {
        CGRect f = self.tabBar.frame;

        // move tab bar on screen
        f.origin.y = CGRectGetMaxY(self.view.frame) - (CGRectGetMaxY(self.tabBar.bounds) + CGRectGetMaxY(self.navigationController.navigationBar.frame));
        self.tabBar.frame = f;

        // adjust current view frame
        f = self.view.bounds;
        f.size.height -= CGRectGetMaxY(self.tabBar.bounds);
        self.selectedViewController.view.frame = f;
    }
}

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];

    [UIView performWithoutAnimation:^{
        [self adjustViews];
    }];
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    [UIView performWithoutAnimation:^{
        [self adjustViews];
    }];
}

स्पष्ट समाधान, आपकी मूल वास्तुकला को ध्यान में रखते हुए, उस दृश्य को औपचारिक रूप से प्रस्तुत करना होगा:

- (void)tabBarController:(UITabBarController *)tb
 didSelectViewController:(UIViewController *)vc {
    if (tb.selectedIndex == MODALONE) {
        UIViewController* mod = 
            [[UIViewController alloc] initWithNibName: @"ModalView" 
                                               bundle: nil];
        [tb presentModalViewController:mod animated:NO];
        [mod release];
    }
}

दृश्य अब संपूर्ण स्क्रीन को कवर करता है (टैब बार सहित स्टेटस बार को छोड़कर एक है), इसलिए ऐसा लगता है कि टैब बार आइटम को दबाने वाले उपयोगकर्ता के जवाब में टैब बार दूर चला गया है।





uitabbarcontroller