কোনও ইউআইটিউলবারে একটি ইউআইএলবেল যুক্ত করা হচ্ছে


98

আমি আমার সরঞ্জামদণ্ডে একটি লেবেল যুক্ত করার চেষ্টা করছি। বোতামটি দুর্দান্ত কাজ করে, তবে আমি যখন লেবেলটি যুক্ত করি তখন এটি ক্র্যাশ হয়ে যায়। কোন ধারনা?

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];

উত্তর:


129

এটি একবার দেখুন

[[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
নোট করুন যে আপনি যদি এই পথে যেতে চান তবে আপনার লেবেল যথাযথভাবে স্টাইল করতে হবে (লেবেল.ব্যাকগ্রাউন্ড কালার = [ইউআইসি কালার ক্লিয়ার কালার] ইত্যাদি)। আপনি সরল স্টাইল করার জন্য একটি ইউআইবারবার বাটন আইটেমও শুরু করতে পারেন যা আপনাকে একইরকম চেহারা দেবে
বুদ্ধিমানের কাজ

আমি জানি এটি একটি সত্যই পুরানো পোস্ট, তবে এই উত্তর সম্পর্কে আমার একটি প্রশ্ন আছে। একবার এটি হয়ে গেলে, পরে এটি পরিবর্তন করার জন্য লেবেল শিরোনাম অ্যাক্সেস করার কোনও উপায় আছে, বা সবকিছু প্রকাশিত হওয়ার পরে এটি কি অসম্ভব?
রায়ান

রায়ান, ইউআইএলবেল সম্ভবত এখনও আছে - এটি সেল্ফ টাইটেল লেবেল। এই উদাহরণটির জন্য ইউআইএলবেল * শিরোনামলাবেলের জন্য ঘোষিত এবং সংশ্লেষিত একটি সম্পত্তি দরকার, তবে সেই কোডটি প্রদর্শিত হয় নি। যদি আপনার এই কোডটি চালিত বস্তুর (সম্ভবত কোনও ইউআইভিউউকন্ট্রোলার) অ্যাক্সেস থাকে তবে আপনি এর শিরোনামলবেলটি অ্যাক্সেস করতে পারেন। উদাহরণস্বরূপ, আপনি ভিউ কন্ট্রোলারে একটি পদ্ধতি যুক্ত করতে পারেন, আপনি যে নতুন শিরোনাম চান তা পাস করতে পারেন এবং তারপরে [self.titleLabel setText: newTitle] কল করতে পারেন।
স্টিভ লিডল

7
আপনি কি শিরোনাম বোতাম বার আইটেমের পরে দ্বিতীয় স্পেসার যুক্ত করতে চান না?
লেন

121

ইন্টারফেস বিল্ডার আপনার লেআউট করতে যারা ব্যবহার করেন তাদের পক্ষে UIToolBar, কেবল ইন্টারফেস বিল্ডার ব্যবহার করে এটি করা সম্ভব।

একটি যোগ করতে UILabelএকটি থেকে UIToolBarআপনি একটি জেনেরিক যোগ করতে হবে UIViewআপনার টু বস্তুর UIToolBarএকটি নতুন টেনে এনে আইবি মধ্যে UIViewআপনার উপর বস্তু UIToolBarIBস্বয়ংক্রিয়ভাবে এমন একটি তৈরি UIBarButtonItemকরবে যা আপনার কাস্টম দিয়ে আরম্ভ করা হবে UIView। এরপরে একটি যুক্ত UILabelকরুন UIViewএবং UILabelআপনার পছন্দসই শৈলীর সাথে মেলে গ্রাফিকভাবে সম্পাদনা করুন । তারপরে আপনি নিজের স্থির করতে ইচ্ছামত আপনার স্থির এবং / অথবা ভেরিয়েবল স্পেসারগুলি দৃশ্যত সেট আপ করতে পারেনUILabel যথাযথভাবে যথাযথ ।

আপনাকে অবশ্যই নীচের মাধ্যমে প্রদর্শন করার জন্য দুটি UILabelএবং এর উভয়ের পটভূমি সেট করতে হবে ।UIViewclearColorUIToolBarUILabel


4
ভাল কৌশল, আপনি ইন্টারফেস বিল্ডারে এটি করতে পারেন তা জানেন না। আপনাকে অনেক ধন্যবাদ.
রাফায়েল বুগাজিস্কি

সেই পদ্ধতিটি ব্যবহার করে কাস্টম চিত্র সহ কোনও ইউআইবাটন যুক্ত করার কোনও উপায় আছে কি? আমি একটি ইউআইবাটন যোগ করতে পারি, তবে চিত্রটি প্রদর্শিত হবে না।
ক্যানিবয়

4
আমি এটি কাজ করতে পারে বলে মনে হচ্ছে না। আমি যখন কোনও ইউআইভিউকে সরঞ্জামদণ্ডে টেনে আনি, তখন এটি সরঞ্জাম বারের মধ্যে নয় বরং ভিউ কন্ট্রোলারের অভ্যন্তরে স্থাপন করা হয়। এছাড়াও, আমরা কি নেভিগেশন নিয়ামক বা ভিউ কন্ট্রোলারে এটি করি?
গুপ্ত্রন

4
কাজ করে বলে মনে হয় না। এটি যদি দীর্ঘদিন আগে একবার কাজ করে, এক্সকোড 6 তে আর হয় না ...
ফ্রেডেরিক অ্যাডা

4
আপনাকে নিজের উত্তরটি আপডেট করতে হবে যে এটি নির্দেশ করে যে এটি কেবলমাত্র একটি ভিউ নিয়ন্ত্রকের সাথে ম্যানুয়ালি যোগ করা সরঞ্জামদণ্ডগুলির সাথে কাজ করে; এটি আপনার জন্য যোগ করা সরঞ্জামদণ্ডের সাথে কাজ করে না।
জেমস বুশ

33

আমি উত্তরবোটের উত্তরটি খুব দরকারী খুঁজে পেয়েছি, তবে আমি মনে করি ইন্টারফেস বিল্ডারে আমি আরও সহজ উপায় খুঁজে পেয়েছি:

  • একটি ইউআইবারবারটন আইটেম তৈরি করুন এবং এটিকে ইন্টারফেস বিল্ডারে আপনার সরঞ্জামদণ্ডে যুক্ত করুন

এখানে চিত্র বর্ণনা লিখুন

  • এই বারবুটন আইটেমটির জন্য "সক্ষম" নির্বাচন করুন

এখানে চিত্র বর্ণনা লিখুন

  • এই বারবুটন আইটেমটি আপনার শ্রেণির কোনও সম্পত্তিতে প্লাগ করুন (এটি সুইফটে রয়েছে তবে ওবজে-সিতে এটি একই রকম হবে):

    @IBOutlet private weak var lastUpdateButton: UIBarButtonItem! // Dummy barButtonItem whose customView is lastUpdateLabel
    
  • লেবেল নিজেই জন্য অন্য সম্পত্তি যুক্ত করুন:

    private var lastUpdateLabel = UILabel(frame: CGRectZero)
    
  • ভিডডিলোডে, আপনার লেবেলের বৈশিষ্ট্যগুলি নির্ধারণ করতে নিম্নলিখিত কোডটি যুক্ত করুন এবং এটি আপনার বারবটন আইটেমের কাস্টমভিউ হিসাবে যুক্ত করুন

    // 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()প্রতিবার আপনি লেবেলের পাঠ্য আপডেট করার সময় কল করতে হবে


4
আমি আপনার মতো একটি ইউআইবারবার্টন আইটেম তৈরি করেছি, এটি সক্ষম করে রেখেছি এবং নীচের কোডটি ব্যবহার করে একটি লেবেল সুপারপোজ করেছি: UILabel* label = [[UILabel alloc] init]; label.text = @"Hello"; label.font = [UIFont systemFontOfSize:16]; [label sizeToFit]; self.barItem.customView = label;
ব্রেট ডোনাল্ড

6

আমি এই কৌশলটি যে জিনিসগুলির জন্য ব্যবহার করছি তার মধ্যে একটি হ'ল UIActivityIndicatorViewউপরের দিকে ইনস্ট্যান্ট করা UIToolBar, এমন কিছু যা অন্যথায় সম্ভব হয় না। উদাহরণস্বরূপ এখানে আমার UIToolBarসাথে 2 UIBarButtonItem, a 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];}

এই কোডটি কাস্টম ক্রিয়াকলাপের সূচক দর্শনের সাথে ইউআইবারবারটন আইটেমের জন্য বরাদ্দ হওয়া মেমরি ফাঁস করে। (এটি ক্রিয়াকলাপের সূচকটির স্মৃতিও ফাঁস করে দেয় তবে আমি ধরে নিই যে কোডটি খণ্ডের শেষের নিচে মুক্তি
পেয়েছে

3

বিশদ

  • এক্সকোড 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) }
}

ফলাফল

এখানে চিত্র বর্ণনা লিখুন


আমি এটি পছন্দ করি তবে আমার যদি টেবিল ভিউ থাকে তবে এটি এই বারটি দিয়ে স্ক্রোল করবে। আমি কীভাবে এটি ঠিক করব?
মাকসিম নিয়াজেভ

হ্যালো ম্যাক্সিম, আমি আপনার সমস্যা বুঝতে পারি না। দয়া করে আপনি যে ফলাফলটি পেতে চান তা বর্ণনা করুন।
ভ্যাসিলি বোদনারচুক

ঠিক আছে, আমি ইউআইটিএবলভিউ কনট্রোলার ব্যবহার করছি এবং যদি আমি ভিউ.এডডসউভিউ (সরঞ্জামদণ্ড!) সেট করে এবং আমার টেবিলভিউটি টেবিলভিউ দিয়ে স্ক্রোল করি তবে আমি এটির স্থির নীচের অবস্থানটি পেতে চাই
মাকসিম নিয়াজেভ

আমি মনে করি, আপনার ইউআইটিভিউ কনট্রোলারটি ইউআইটিএবলভিউয়ের পরিবর্তে (পরিবর্তে ইউআইটিএবলভিউ কনট্রোলার) সাবউভিউ হিসাবে ব্যবহার করা উচিত।
ভ্যাসিলি বোদনারুকুক

ঠিক আছে স্প্যাসিবো। আমি এটি চেষ্টা করবো
মাকসিম নিয়াজেভ

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.barItemUIBarButtonItem অবজেক্ট লাইব্রেরি থেকে যুক্ত এবং দুটি নমনীয় স্থানের মধ্যে স্থাপন করা হয়।

অন্য উপায়টি হ'ল [self.barItem setCustom:view]লাইনটি মুছে ফেলা এবং label(প্রস্থের) পরামিতিগুলি পরিবর্তন করা যাতে এটি পুরো সরঞ্জামদণ্ডটি পূরণ করে এবং কোডটি নিজের দ্বারা বিন্যাসটি মাঝারি এবং ফন্টে সেট করে,

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.