2013-05-03 5 views
6

मैं उस एप्लिकेशन पर काम कर रहा हूं जो tabBarController एप्लिकेशन की अधिक संभावना है। लेकिन मैं tabBarController का उपयोग नहीं कर सकता क्योंकि मुझे नीचे कस्टम tab हैंडलर की आवश्यकता है, मुझे आइटमों के बीच कस्टम स्पेस की भी आवश्यकता है। तो मैं कस्टम tabBarController बना रहा हूं।कस्टम टैब बार नियंत्रक बनाने के लिए सबसे अच्छा तरीका कौन सा है?

मैं सबसे अच्छा तरीका जानना चाहता हूं। वर्तमान में मेरा दृष्टिकोण इस तरह से है (storyboard और iOS6 का उपयोग करके): - मैंने ViewController पर लिया जो tab बार (कस्टमटैबबार व्यू कंट्रोलर) के नीचे कार्य करेगा। मैंने प्रत्येक टैब के लिए ContainerViews लिया। जब उपयोगकर्ता toolbar पर कोई आइटम चुनता है, तो मैं containerView दिखाऊंगा।

कृपया मुझे बताएं कि क्या मैं गलत हूं या सबसे अच्छा तरीका गाइड करता हूं। धन्यवाद।

1: एक UITabBarController ले लो और अपने अनुप्रयोग विंडो के rootViewController के रूप में सेट -:

उत्तर

0

यहाँ कदम आप निम्नलिखित दृश्य बनाने के लिए पालन करने की आवश्यकता है।

2: अब इस UITabbarController में पांच टैब जोड़ें।

3: प्रत्येक टैब पर अलग-अलग पांच अलग-अलग UINavigationController जोड़ें।

4: अब क्रमशः UINavigationController में पांच अलग-अलग UIViewControllers जोड़ें।

5: अब एक कस्टम tabBar बनाएँ:

5.1: कस्टम tabBar बनाने के रास्ते में से एक TabBar ऊंचाई की एक UIView लेने के लिए और TabBar करने के लिए टैब के रूप में UIButtons जोड़ना है।

6: कस्टम टैबबार को मुख्यविंडो पर जोड़ें। अपने कस्टम टैबबार पर विभिन्न बटन चुनने पर अपने एप्लिकेशन UITabbarController के setSelectedIndex को बदलें।

15

आप इसे बहुत गलत कर रहे हैं। कस्टम व्यू पदानुक्रम न बनाएं जब आप केवल डिफ़ॉल्ट का उपयोग कर सकें।

आप क्या करना चाहते हैं UITabBarController का उप-वर्ग बनाना और एक .xib फ़ाइल भी बनाएं जिसमें आपकी कस्टम टैब बार होगी - बस एक छवि और UIButtons की मनमानी राशि (मुझे लगता है 5)। उन सभी के लिए

enter image description here

सेट टैग, सिर्फ 1-5 टैग, आप संभवतः यह एक कस्टम UIView उपवर्ग के साथ कर सकता है, लेकिन वह इस परिदृश्य में अनावश्यक होगा, इसलिए यह सिर्फ प्राप्त करते समय नियंत्रण हो जाएगा टैग के साथ।

UITabBarController का उप-वर्ग बनाएं। आपको उन सभी बटनों के संदर्भ और एक संपत्ति भी देखने की आवश्यकता होगी, यह देखने के लिए कि कौन सा बटन पिछला दबाया गया था, ताकि आप यूआई को उचित रूप से अपडेट कर सकें। विभिन्न नियंत्रण राज्यों के लिए अलग-अलग छवियों या शीर्षकों को भी असाइन करें, मैं डिफ़ॉल्ट रूप से उपयोग कर रहा हूं और इस मामले में चयनित हूं।

MYBaseTabBarController.h

@interface MYBaseTabBarController : UITabBarController 
@property (strong, nonatomic) UIButton *btn1; 
@property (strong, nonatomic) UIButton *btn2; 
@property (strong, nonatomic) UIButton *btn3; 
@property (strong, nonatomic) UIButton *btn4; 
@property (strong, nonatomic) UIButton *btn5; 
@property (weak, nonatomic) UIButton *lastSender; 

@property (strong, nonatomic) UIView *tabBarView; 

@end 

MYBaseTabBarController।मीटर

सबसे पहले, दृश्य नियंत्रक (जो इस मामले में सभी UINavigationController उपवर्गों कर रहे हैं) बनाने और उन्हें अपने UITabBarController के viewControllers संपत्ति के रूप में उपवर्ग के लिए आवंटित।

- (id)init { 
    self = [super init]; 
    if (self) { 
    [self setup]; 
    } 
    return self; 
} 

- (void)setup { 
    NSMutableArray *viewControllers = [NSMutableArray array]; 

    MYViewController1 *viewController1 = [[MYStoryboardManager storyboard1] instantiateInitialViewController]; 
    viewController1.title = @"1"; 
    [viewControllers addObject:viewController1]; 

    MYViewController2 *viewController2 = [[MYStoryboardManager storyboard2] instantiateInitialViewController]; 
    viewController2.title = @"2"; 
    [viewControllers addObject:viewController2]; 

    UIViewController *blankController = [UIViewController new]; // Center button, performs an action instead of leading to a controller 
    [viewControllers addObject:blankController]; 

    MYViewController3 *viewController3 = [[MYStoryboardManager storyboard3] instantiateInitialViewController]; 
    viewController3.title = @"3"; 
    [viewControllers addObject:viewController3]; 

    MYViewController3 *viewController4 = [[MYStoryboardManager storyboard4] instantiateInitialViewController]; 
    viewController4.title = @"4"; 
    [viewControllers addObject:viewController4]; 

    self.viewControllers = viewControllers; 
} 

अगला हड़पने बटन आपने पहले बनाया था और -viewDidLoad विधि में उन्हें कार्रवाइयां असाइन किया है:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    _tabbarView = [[[NSBundle mainBundle] loadNibNamed:@"MyTabBar" owner:nil options:nil] lastObject]; // "MyTabBar" is the name of the .xib file 
    _tabbarView.frame = CGRectMake(0.0, 
           self.view.frame.size.height - _tabbarView.frame.size.height, 
           _tabbarView.frame.size.width, 
           _tabbarView.frame.size.height); // make it overlay your actual tab bar 
    [self.view addSubview:_tabbarView]; 

    _btn1 = (UIButton *)[_tabbarView viewWithTag:1]; 
    [_btn1 addTarget:self action:@selector(processBtn:) forControlEvents:UIControlEventTouchUpInside]; 

    _btn2 = (UIButton *)[_tabbarView viewWithTag:2]; 
    [_btn2 addTarget:self action:@selector(processBtn:) forControlEvents:UIControlEventTouchUpInside]; 

    _btn3 = (UIButton *)[_tabbarView viewWithTag:3]; 
    [_btn3 addTarget:self action:@selector(processBtn:) forControlEvents:UIControlEventTouchUpInside]; 

    _btn4 = (UIButton *)[_tabbarView viewWithTag:4]; 
    [_btn4 addTarget:self action:@selector(processBtn:) forControlEvents:UIControlEventTouchUpInside]; 

    _btn5 = (UIButton *)[_tabbarView viewWithTag:5]; 
    [_btn5 addTarget:self action:@selector(processBtn:) forControlEvents:UIControlEventTouchUpInside]; 

    _lastSender = _btn1; 
    [self setSelectedViewController:self.viewControllers[0]]; // make first controller selected 
} 

प्रसंस्करण विधि जोड़ें:

- (void)processBtn:(UIButton *)sender { 
    _lastSender = sender; 
    [self setSelectedViewController:[self.viewControllers objectAtIndex:sender.tag - 1]]; 
} 

और अंत में -setSelectedViewController: ओवरराइड विधि:

- (void)setSelectedViewController:(UIViewController *)selectedViewController { 
    if (_lastSender != _btn3) { // check if it's not the action button 
    for (UIButton *btn in [_tabbarView subviews]) { 
     if ([btn isKindOfClass:[UIButton class]]) { 
     if (btn == _lastSender) { 
      btn.selected = YES; 
     } 
     else { 
      btn.selected = NO; 
     } 
     } 
    } 
    } 
    if ([self.viewControllers indexOfObject:selectedViewController] == 2) { 
    MYActionController *viewController = [[MYStoryboardManager actionStoryboard] instantiateInitialViewController]; 
    [self presentViewController:viewController animated:YES completion:nil]; 
    } 
    else { 
    if (self.selectedViewController == selectedViewController) { 
     [(UINavigationController *)self.selectedViewController popToRootViewControllerAnimated:animate]; // pop to root if tapped the same controller twice 
    } 
    [super setSelectedViewController:selectedViewController]; 
    } 
} 

मुझे लगता है कि आप एआरसी सक्षम के साथ प्रोग्रामिंग कर रहे हैं और आपके पास एक कक्षा है जो आपके स्टोरीबोर्ड का प्रबंधन करती है, लेकिन यह वैसे भी सरल है।

+0

यह चयनित उत्तर होना चाहिए क्योंकि यह पूरी तरह से काम करता है। धन्यवाद! –

+3

इस लाइन द्वारा देखने के लिए क्या मतलब हैडिडलोड: '[self.view _tabbarView];' - एक टाइपो की तरह दिखता है। – inorganik

0
ios 9.0+ क्षैतिज दिशा में उपयोग UIStackView लिए

और एक xib बना सकते हैं और CustomTabBarView

CustomTabBarView.Xibinsert uistackview in it

Set Stack view attributes like this

एक और देखें CustomTabBarItem बनाएं यह नाम दिया है।

CustomTabBarItem.xib enter image description here

CustomTabBarItem.swift फ़ाइल TabItem की कार्यक्षमता

class CustomTabItem: UIView { 

//MARK:- IBOutlets 
@IBOutlet weak var itemImage: UIImageView! 
@IBOutlet weak var itemTitle: SelectableLabel! 
@IBOutlet weak var topButton: UIButton! 

//MARK:- Variables 
var isSelected: Bool = false { 
    didSet { 
     self.itemImage.image = CommonFunctions.getTabItemImage(isSelected: isSelected, tag: topButton.tag) 
     itemTitle.isSelected = isSelected 
     if isSelected { 
      self.backgroundColor = UIColor.appDarkBlueColor 
     } 
     else { 
      self.backgroundColor = UIColor.appWhiteColor 
     } 
    } 
} 

//MARK:- IBActions 
@IBAction func onClickButton(_ sender: Any) { 

} 

}

को लागू करने के लिए TabBarViewController में बनाने को लागू करें इस संहिता

func createCustomTabBarView(tabItemCount: Int){ 

    customTabBarView = Bundle.main.loadNibNamed("CustomTabBarView", owner: nil, options: nil)?.last as! UIView 
    customTabBarView.frame = CGRect(x: 0, y: self.view.frame.height - self.tabBar.frame.height, width: self.tabBar.frame.width, height: self.tabBar.frame.size.height) 
    self.view.addSubview(customTabBarView) 

    var stackView = UIStackView() 
    for subView in customTabBarView.subviews{ 
     if subView is UIStackView { 
      stackView = subView as! UIStackView 
     } 
    } 

    for i in 0..<tabItemCount { 
     let customTabItemView = Bundle.main.loadNibNamed("CustomTabItem", owner: nil, options: nil)?.last as! CustomTabItem 
     switch i { 
     case CustomTabbarButtonTag.TabBarItem_First.rawValue: 
      customTabItemView.itemTitle.text = "TabBarItem_First" 
      customTabItemView.topButton.tag = CustomTabbarButtonTag.TabBarItem_First.rawValue 
      customTabItemView.isSelected = false 

     case CustomTabbarButtonTag.TabBarItem_Second.rawValue: 
      customTabItemView.itemTitle.text = "TabBarItem_Second" 
      customTabItemView.topButton.tag = CustomTabbarButtonTag.TabBarItem_Second.rawValue 
      lastSelectedTabItem = customTabItemView 
      customTabItemView.isSelected = true 

     case CustomTabbarButtonTag.TabBarItem_Third.rawValue: 
      customTabItemView.itemTitle.text = "TabBarItem_Third" 
      customTabItemView.topButton.tag = CustomTabbarButtonTag.TabBarItem_Third.rawValue 
      customTabItemView.isSelected = false 

     case CustomTabbarButtonTag.TabBarItem_Fourth.rawValue: 
      customTabItemView.itemTitle.text = "TabBarItem_Fourth" 
      customTabItemView.topButton.tag = CustomTabbarButtonTag.TabBarItem_Fourth.rawValue 
      customTabItemView.isSelected = false 
      cmsTabItem = customTabItemView 

     default: 
      break 
     } 

     customTabItemView.topButton.addTarget(self, action: #selector(tabBarButtonPressed), for: .touchUpInside) 
     stackView.addArrangedSubview(customTabItemView) 
    } 
} 

//MARK:- IBActions 
func tabBarButtonPressed(_ sender: UIButton){ 
    // create global variable lastSelectedTabItem for store last selected tab item and set its isSelected value for manage highlight current selected tabItem 
    lastSelectedTabItem.isSelected = false 
    let customTabItem = sender.superview as! CustomTabItem 
    lastSelectedTabItem = customTabItem 
    lastSelectedTabItem.isSelected = true 
    self.selectedIndex = sender.tag 
} 
2

नीचे कोड मेरे प्रोजेक्ट में पूरी तरह से काम करता है।

मैं swift3 संस्करण के रूप में नीचे का इस्तेमाल किया है:

मैं जो 4 बटन के साथ UIView शामिल MyTabBar.xib फ़ाइल जोड़ा। xib फ़ाइल में, UIView के सेट क्लास।

class myTabBarController: UITabBarController { 

var tabBarView: UIView! 

var btn1: UIButton! 
var btn2: UIButton! 
var btn3: UIButton! 
var btn4: UIButton! 

var lastSender: UIButton! 

var categoryViewController: CategoryViewController? 
var subCategoryViewController: SubCategoryViewController? 
var scoreViewController: ScoreViewController? 
var profileViewController: ProfileViewController? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.setup() 

    tabBarView = Bundle.main.loadNibNamed("MyTabBar", owner: nil, options: nil)?.last as! UIView 
    tabBarView.frame = CGRect(x: 0.0, y: self.view.frame.size.height - tabBarView.frame.size.height, width: tabBarView.frame.size.width, height: tabBarView.frame.size.height) 
    self.view.addSubview(tabBarView) 

    btn1 = tabBarView.viewWithTag(1) as? UIButton 
    btn1.addTarget(self, action: #selector(self.processBtn), for: .touchUpInside) 
    btn2 = tabBarView.viewWithTag(2) as? UIButton 
    btn2.addTarget(self, action: #selector(self.processBtn), for: .touchUpInside) 
    btn3 = tabBarView.viewWithTag(3) as? UIButton 
    btn3.addTarget(self, action: #selector(self.processBtn), for: .touchUpInside) 
    btn4 = tabBarView.viewWithTag(4) as? UIButton 
    btn4.addTarget(self, action: #selector(self.processBtn), for: .touchUpInside) 

    let width1 = self.view.frame.width/4 
    btn1.frame = CGRect(x: 0, y: 0, width: width1, height: tabBarView.frame.size.height) 
    btn2.frame = CGRect(x: btn1.frame.width, y: 0, width: width1, height: tabBarView.frame.size.height) 
    btn3.frame = CGRect(x: btn2.frame.origin.x+btn2.frame.width, y: 0, width: width1, height: tabBarView.frame.size.height) 
    btn4.frame = CGRect(x: btn3.frame.origin.x+btn3.frame.width, y: 0, width: width1, height: tabBarView.frame.size.height) 

    lastSender = btn1 
    selectedViewController = viewControllers?[0] 
} 

func processBtn(_ sender: UIButton) { 
    lastSender = sender 
    selectedViewController = viewControllers?[sender.tag - 1] 

    if sender.tag == 1 { 
     btn1.backgroundColor = UIColor.red 
     btn2.backgroundColor = UIColor.yellow 
     btn3.backgroundColor = UIColor.yellow 
     btn4.backgroundColor = UIColor.yellow 
    }else if sender.tag == 2 { 
     btn1.backgroundColor = UIColor.yellow 
     btn2.backgroundColor = UIColor.red 
     btn3.backgroundColor = UIColor.yellow 
     btn4.backgroundColor = UIColor.yellow 
    }else if sender.tag == 3 { 
     btn1.backgroundColor = UIColor.yellow 
     btn2.backgroundColor = UIColor.yellow 
     btn3.backgroundColor = UIColor.red 
     btn4.backgroundColor = UIColor.yellow 
    }else if sender.tag == 4 { 
     btn1.backgroundColor = UIColor.yellow 
     btn2.backgroundColor = UIColor.yellow 
     btn3.backgroundColor = UIColor.yellow 
     btn4.backgroundColor = UIColor.red 
    } 
} 

func setup() { 
    var viewControllers = [AnyObject]() 

    categoryViewController = self.storyboard!.instantiateViewController(withIdentifier: "CategoryViewController") as? CategoryViewController 
    viewControllers.append(categoryViewController!) 

    subCategoryViewController = self.storyboard!.instantiateViewController(withIdentifier: "SubCategoryViewController") as? SubCategoryViewController 
    viewControllers.append(subCategoryViewController!) 

    scoreViewController = self.storyboard!.instantiateViewController(withIdentifier: "ScoreViewController") as? ScoreViewController 
    viewControllers.append(scoreViewController!) 

    profileViewController = self.storyboard!.instantiateViewController(withIdentifier: "ProfileViewController") as? ProfileViewController 
    viewControllers.append(profileViewController!) 

    self.viewControllers = viewControllers as? [UIViewController] 
} 

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

    for view in tabBarView.subviews as [UIView] { 
     if let btn = view as? UIButton { 
      if btn == lastSender { 
       btn.isSelected = true 
      } 
      else { 
       btn.isSelected = false 
      } 
     } 
    } 

    if self.selectedViewController == viewController { 
     (self.selectedViewController as? UINavigationController)?.popToRootViewController(animated: true) 
     // pop to root if tapped the same controller twice 
    } 

    return (viewController != tabBarController.selectedViewController) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 

}

: वर्ग = "MyTabBar"
टैग तदनुसार ..

और myTabBarController नीचे फाइल 1,2,3,4 के रूप में नीचे

myTabBarController.swift कोड 4 बटन दें

इस तरह आप अपनी आवश्यकता के अनुसार कस्टम टैबबार डिज़ाइन कर सकते हैं।

धन्यवाद

संबंधित मुद्दे