यूआईटैबेल को यूआईटूलबार में जोड़ना


97

मैं अपने टूलबार में एक लेबल जोड़ने की कोशिश कर रहा हूं। बटन महान काम करता है, हालांकि जब मैं लेबल ऑब्जेक्ट जोड़ता हूं, तो यह क्रैश हो जाता है। कोई विचार?

UIBarButtonItem *setDateRangeButton = [[UIBarButtonItem alloc] initWithTitle:@"Set date range"
                                                                       style:UIBarButtonItemStyleBordered
                                                                      target:self
                                                                      action:@selector(setDateRangeClicked:)];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(5, 5, 20, 20)];
label.text = @"test";

[toolbar setItems:[NSArray arrayWithObjects:setDateRangeButton,label, nil]];

// Add the toolbar as a subview to the navigation controller.
[self.navigationController.view addSubview:toolbar];

// Reload the table view
[self.tableView reloadData];

जवाबों:


128

इस पर गौर करें

[[UIBarButtonItem alloc] initWithCustomView:yourCustomView];

अनिवार्य रूप से प्रत्येक आइटम में एक "बटन" होना चाहिए, लेकिन उन्हें किसी भी दृश्य के साथ त्वरित किया जा सकता है, जिसकी आपको आवश्यकता है। यहाँ कुछ उदाहरण कोड है। ध्यान दें, चूंकि अन्य बटन आमतौर पर टूलबार पर होते हैं, इसलिए स्पेसर को शीर्षक बटन के प्रत्येक तरफ रखा जाता है ताकि यह केंद्रित रहे।

NSMutableArray *items = [[self.toolbar items] mutableCopy];

UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[items addObject:spacer];
[spacer release];

self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0 , 11.0f, self.view.frame.size.width, 21.0f)];
[self.titleLabel setFont:[UIFont fontWithName:@"Helvetica-Bold" size:18]];
[self.titleLabel setBackgroundColor:[UIColor clearColor]];
[self.titleLabel setTextColor:[UIColor colorWithRed:157.0/255.0 green:157.0/255.0 blue:157.0/255.0 alpha:1.0]];
[self.titleLabel setText:@"Title"];
[self.titleLabel setTextAlignment:NSTextAlignmentCenter];

UIBarButtonItem *spacer2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[items addObject:spacer2];
[spacer2 release];

UIBarButtonItem *title = [[UIBarButtonItem alloc] initWithCustomView:self.titleLabel];
[items addObject:title];
[title release];

[self.toolbar setItems:items animated:YES];
[items release];

10
ध्यान दें कि यदि आपने इस मार्ग पर जाने के लिए चुना है, तो आपको अपने लेबल को उचित रूप से स्टाइल करना चाहिए (लेबल.बैकग्राउंडरकलर = [UIColor ClearColor], आदि)। आप एक UIBarButtonItem को स्टाइल के रूप में भी पहन सकते हैं, जो आपको एक समान लुक देगा
समझदार

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

रयान, यूबेल शायद अभी भी मौजूद है - यह स्वयं है। इस उदाहरण को यूआईबेल * टाइटललैब के लिए घोषित संपत्ति और संश्लेषित की आवश्यकता है, लेकिन वह कोड नहीं दिखाया गया है। यदि आपके पास इस कोड को चलाने वाली ऑब्जेक्ट (शायद एक UIViewController) की एक्सेस है, तो आप इसके टाइटललैब तक पहुंच सकते हैं। उदाहरण के लिए, आप दृश्य नियंत्रक पर एक विधि जोड़ सकते हैं, जो नया शीर्षक आप चाहते हैं, उसमें पास करें और फिर [self.titleLabel setText: newTitle] को कॉल करें।
स्टीव लैडल

7
क्या आप शीर्षक बटन बार आइटम के बाद जोड़ा गया दूसरा स्पेसर नहीं चाहेंगे?
लेन

121

इंटरफ़ेस बिल्डर का उपयोग करने वालों के लिए आपके लेआउट के लिए UIToolBar, इंटरफ़ेस बिल्डर का उपयोग करके ऐसा करना भी संभव है।

एक को जोड़ने के लिए UILabelएक करने के लिए UIToolBarआप एक सामान्य जोड़ने की जरूरत है UIViewअपने को वस्तु UIToolBarएक नया खींचकर आईबी में UIViewअपने से अधिक वस्तु UIToolBarIBस्वचालित रूप से बना देगा जो UIBarButtonItemकि आपके रिवाज के साथ आरंभ किया जाएगा UIView। अगला एक जोड़ने UILabelके लिए UIViewऔर संपादित UILabelरेखांकन अपने पसंदीदा शैली मैच के लिए। फिर आप अपने निर्धारित और / या चर spacers को नेत्रहीन रूप से अपनी स्थिति के अनुसार सेट कर सकते हैं UILabel

आपको सही तरीके से दिखाने के लिए प्राप्त करने के लिए UILabelऔर दोनों की पृष्ठभूमि निर्धारित करनी चाहिए ।UIViewclearColorUIToolBarUILabel


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

क्या उस विधि का उपयोग करके कस्टम छवि के साथ एक UIButton जोड़ने का एक तरीका है? मैं एक UIButton जोड़ सकता हूं, लेकिन छवि दिखाई नहीं देती है।
कैन्यबॉय

4
मैं यह काम करने के लिए प्राप्त करने के लिए प्रतीत नहीं कर सकते। जब मैं टूलबार पर एक UIView खींचता हूं, तो यह टूलबार पर नहीं, व्यू कंट्रोलर के अंदर रखा जाता है। इसके अलावा, क्या हम इसे नेविगेशन कंट्रोलर या व्यू कंट्रोलर में करते हैं?
गुप्त

1
वह काम नहीं लगता है। यदि यह लंबे समय से पहले एक बार काम करता है, तो एक्सकोड 6 में अब नहीं ...
Frédéric Adda

1
आपको अपना जवाब अपडेट करने के लिए कहना चाहिए कि यह केवल टूलबार के साथ काम करता है जो मैन्युअल रूप से व्यू कंट्रोलर में जोड़ा जाता है; यह आपके लिए जोड़े गए टूलबार के साथ काम नहीं करता है।
जेम्स बुश

32

मुझे answerBot का उत्तर बहुत उपयोगी लगा, लेकिन मुझे लगता है कि मुझे इंटरफ़ेस बिल्डर में और भी आसान तरीका मिल गया:

  • एक UIBarButtonItem बनाएं और इसे इंटरफ़ेस बिल्डर में अपने टूलबार में जोड़ें

यहां छवि विवरण दर्ज करें

  • इस BarButtonItem के लिए "सक्षम" को अनचेक करें

यहां छवि विवरण दर्ज करें

  • अपनी कक्षा में एक संपत्ति में इस BarButtonItem को प्लग करें (यह स्विफ्ट में है, लेकिन ओबज-सी में बहुत समान होगा:

    @IBOutlet private weak var lastUpdateButton: UIBarButtonItem! // Dummy barButtonItem whose customView is lastUpdateLabel
  • लेबल के लिए एक और संपत्ति जोड़ें:

    private var lastUpdateLabel = UILabel(frame: CGRectZero)
  • viewDidLoad में, अपने लेबल के गुण सेट करने के लिए निम्न कोड जोड़ें, और इसे अपने BarBltonItem के customView के रूप में जोड़ें

    // Dummy button containing the date of last update
    lastUpdateLabel.sizeToFit()
    lastUpdateLabel.backgroundColor = UIColor.clearColor()
    lastUpdateLabel.textAlignment = .Center
    lastUpdateButton.customView = lastUpdateLabel
    
  • UILabelपाठ को अद्यतन करने के लिए :

    lastUpdateLabel.text = "Updated: 9/12/14, 2:53"
    lastUpdateLabel.sizeToFit() 
    

परिणाम :

यहां छवि विवरण दर्ज करें

lastUpdateLabel.sizetoFit()लेबल पाठ को अपडेट करने के लिए आपको हर बार कॉल करना होगा


1
मैंने आपके समान ही एक UIBarButtonItem बनाया, इसे सक्षम किया, और निम्नलिखित कोड का उपयोग करके एक लेबल लगाया गया: UILabel* label = [[UILabel alloc] init]; label.text = @"Hello"; label.font = [UIFont systemFontOfSize:16]; [label sizeToFit]; self.barItem.customView = label;
ब्रेट डोनाल्ड

6

जिन चीजों के लिए मैं इस ट्रिक का उपयोग कर रहा हूं, उनमें से एक UIActivityIndicatorViewपर सबसे ऊपर है UIToolBar, ऐसा कुछ है जो अन्यथा संभव नहीं होगा। उदाहरण के लिए यहां मेरे पास UIToolBar2 UIBarButtonItem, एक FlexibleSpaceBarButtonItem, और फिर दूसरा है UIBarButtonItem। मैं लचीली जगह और अंतिम (दाहिने हाथ) बटन UIActivityIndicatorViewके UIToolBarबीच में एक सम्मिलित करना चाहता हूं । तो मेरे में RootViewControllerमैं निम्नलिखित है,

- (void)viewDidLoad {
[super viewDidLoad];// Add an invisible UIActivityViewIndicator to the toolbar
UIToolbar *toolbar = (UIToolbar *)[self.view viewWithTag:767];
NSArray *items = [toolbar items];

activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 20.0f, 20.0f)];
[activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhite];    

NSArray *newItems = [NSArray arrayWithObjects:[items objectAtIndex:0],[items objectAtIndex:1],[items objectAtIndex:2],
                     [[UIBarButtonItem alloc] initWithCustomView:activityIndicator], [items objectAtIndex:3],nil];
[toolbar setItems:newItems];}

यह कोड कस्टम गतिविधि संकेतक दृश्य के साथ UIBarButtonItem के लिए आवंटित मेमोरी को लीक करता है। (यह गतिविधि संकेतक की मेमोरी को भी लीक करता है, लेकिन मुझे लगता है कि कोड टुकड़ा के अंत के नीचे जारी किया जा रहा है।
erikprice

3

विवरण

  • Xcode 10.2.1 (10E1001), स्विफ्ट 5

पूरा नमूना

import UIKit

class ViewController: UIViewController {

    private weak var toolBar: UIToolbar?

    override func viewDidLoad() {
        super.viewDidLoad()

        var bounds =  UIScreen.main.bounds
        let bottomBarWithHeight = CGFloat(44)
        bounds.origin.y = bounds.height - bottomBarWithHeight
        bounds.size.height = bottomBarWithHeight
        let toolBar = UIToolbar(frame: bounds)
        view.addSubview(toolBar)

        var buttons = [UIBarButtonItem]()
        buttons.append(UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(ViewController.action)))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .camera, target: self, action: #selector(ViewController.action)))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
        buttons.append(ToolBarTitleItem(text: "\(NSDate())", font: .systemFont(ofSize: 12), color: .lightGray))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action:  #selector(ViewController.action)))
        toolBar.items = buttons

        self.toolBar = toolBar
    }
    @objc func action() { print("action") }
}

class ToolBarTitleItem: UIBarButtonItem {

    init(text: String, font: UIFont, color: UIColor) {
        let label =  UILabel(frame: UIScreen.main.bounds)
        label.text = text
        label.sizeToFit()
        label.font = font
        label.textColor = color
        label.textAlignment = .center
        super.init()
        customView = label
    }
    required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }
}

परिणाम

यहां छवि विवरण दर्ज करें


मुझे यह पसंद है, लेकिन क्या होगा अगर मेरे पास TableView है तो यह इस बार के साथ स्क्रॉल करेगा। मुझसे इसका समाधान किस प्रकार होगा?
मक्सिम नियाज़ेव

हैलो मैक्सिम, मैं आपकी समस्या को नहीं समझ सकता। कृपया, उस परिणाम का वर्णन करें जिसे आप प्राप्त करना चाहते हैं।
वासिली बोर्नार्चुक

ठीक है, मैं UITableViewController का उपयोग कर रहा हूं और अगर मैं view.addSubview (टूलबार) सेट करता हूं और मेरे टेबलव्यू को स्क्रॉल करता हूं तो बार टेबल व्यू के साथ स्क्रॉल करेगा, मैं चाहता हूं कि यह एक निश्चित निचला स्थान हो
मेक्सिम नियावॉव

मुझे लगता है, आपको एक सबव्यू के रूप में यूआईटेबल व्यू (इसके बजाय यूआईटेबल व्यू कॉन्ट्रोलर) के साथ यूआईवाईवीकंट्रोलर का उपयोग करना चाहिए।
वासिली बोर्नार्चुक

ठीक है स्पैसिबो। मैं कोशिश करूँगा कि
मक्सिम नियाज़ेव

2

मैट आरआई के समान ही इंटरफ़ेस बिल्डर का उपयोग किया। लेकिन मैं UIWebViewइसके बजाय 1 को अंदर करना चाहता था ताकि मैं कुछ पाठ बोल्ड कर सकूं और अन्य पाठ नहीं (जैसे मेल ऐप)। इसलिए

  1. इसके बजाय वेबव्यू जोड़ें।
  2. अपारदर्शी को अनचेक करें
  3. सुनिश्चित करें कि पृष्ठभूमि स्पष्ट रंग है
  4. हुक सब कुछ साथ IBOutlet
  5. htmlपारदर्शी बैकग्राउंड होने के लिए नीचे का उपयोग करें ताकि टूलबार चमक सके

कोड:

NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];
NSString *html = [NSString stringWithFormat:@"<html><head><style>body{font-size:11px;text-align:center;background-color:transparent;color:#fff;font-family:helvetica;vertical-align:middle;</style> </head><body><b>Updated</b> 10/11/12 <b>11:09</b> AM</body></html>"];
[myWebView loadHTMLString:html baseURL:baseURL];

1

यदि आप टूलबार दृश्य को जोड़ना चाहते हैं तो आप यह कोशिश कर सकते हैं:

[self.navigationController.tabBarController.view addSubview:yourView];

1

इसे इस्तेमाल करे:

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(140 , 0, 50, 250)];
[label setBackgroundColor:[UIColor clearColor]];
label.text = @"TEXT";
UIView *view = (UIView *) label;
[self.barItem setCustomView:view];

नोट: ऑब्जेक्ट लाइब्रेरी से self.barItemएक UIBarButtonItemजोड़ा गया है और दो लचीले स्थानों के बीच रखा गया है।

दूसरा तरीका यह है कि [self.barItem setCustom:view]लाइन को हटा दें और label(चौड़ाई) के मापदंडों को बदल दें ताकि यह पूरे टूलबार को भर दे और संरेखण को मध्य में और फ़ॉन्ट को कोड में सेट कर दे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.