कस्टम छवि और कोई सीमा के साथ UIBarButtonItem


89

मैं एक कस्टम छवि के साथ एक UIBarButtonItem बनाना चाहता हूं, लेकिन मैं उस सीमा को नहीं चाहता जो iPhone जोड़ता है, क्योंकि मेरी छवि की एक विशेष सीमा है।

यह बैक बटन की तरह ही है लेकिन फॉरवर्ड बटन है।

इस एप्लिकेशन को एक inHouse परियोजना के लिए है, इसलिए मुझे परवाह नहीं है अगर Apple इसे अस्वीकार या मंजूरी देता है या इसे पसंद करता है :-)

अगर मैं initWithCustomView: UIBarButtonItem की v संपत्ति का उपयोग करता हूं, तो मैं यह कर सकता हूं:

UIImage *image = [UIImage imageNamed:@"right.png"];

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setBackgroundImage: [image stretchableImageWithLeftCapWidth:7.0 topCapHeight:0.0] forState:UIControlStateNormal];
[button setBackgroundImage: [[UIImage imageNamed: @"right_clicked.png"] stretchableImageWithLeftCapWidth:7.0 topCapHeight:0.0] forState:UIControlStateHighlighted];

 button.frame= CGRectMake(0.0, 0.0, image.size.width, image.size.height);

[button addTarget:self action:@selector(AcceptData)    forControlEvents:UIControlEventTouchUpInside];

UIView *v=[[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, image.size.width, image.size.height) ];

[v addSubview:button];

UIBarButtonItem *forward = [[UIBarButtonItem alloc] initWithCustomView:v];

self.navigationItem.rightBarButtonItem= forward;

[v release];
[image release];

यह काम करता है, लेकिन अगर मुझे इस प्रक्रिया को 10 दृश्यों में दोहराना है, तो यह DRY नहीं है।

मुझे लगता है कि मुझे उपवर्ग करना होगा, लेकिन क्या?

  • NSView?
  • UIBarButtonItem?

धन्यवाद,

सादर,


3
अपना कोड साझा करने के लिए धन्यवाद, बस इतना ही चाहिए मुझे :)।
अधिकतम

1
हर कोई, मैं सैन द्वारा प्रदान किए गए उत्तर का उपयोग 6 फरवरी को करता था। मेरे स्टोरीबोर्ड में एकीकृत करने में सभी 5 मिनट लगते थे, और यह पूरी तरह से काम करता था। चयनकर्ता संपत्ति आईबी के कनेक्शन निरीक्षक के अधीन है। UIButton से ViewController ऑब्जेक्ट पर नियंत्रण खींचें और विधियाँ पॉप अप होंगी। जिस विधि को आप चाहते हैं उसे टैप करें और आप बहुत कुछ कर चुके हैं केवल एक चीज बची होगी जो कुछ कोड क्लीनअप होगी। BbutnXXXXX का उपयोग किया जाता है। बारबटनटोनिट = नील को बदलने के लिए छिपाना और अनहाइड करना। लेकिन यह तरीका आसान और बहुत साफ था।
user589642

जवाबों:


44

आप कस्टम श्रेणी का उपयोग करके उप-लिंक किए बिना UIBarButtonItem में एक विधि जोड़ सकते हैं:

@interface UIBarButtonItem(MyCategory)

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action;

@end

@implementation UIBarButtonItem(MyCategory)

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action{
 // Move your item creation code here
}
@end

तो आपके कोड में कहीं भी आप इस पद्धति से बार आइटम बना सकते हैं (बशर्ते कि आप इसकी घोषणा के साथ एक हेडर शामिल करें)।

PS आपको 'v' UIView का उपयोग करने की आवश्यकता नहीं है क्योंकि आप UIBarButtonItemसीधे कस्टम दृश्य के रूप में एक बटन के साथ बना सकते हैं ।
PPS आपको अपने कोड में [फॉरवर्ड रिलीज़] की भी आवश्यकता है।


कस्टम श्रेणी: मुझे उन घोषणाओं और शीर्षक फ़ाइल के साथ हेडर फ़ाइल बनानी होगी, जहाँ मैं आपके द्वारा संदर्भित कोड डालूँ? धन्यवाद
mongeta

इसका काम थैक्स अलॉट है, लेकिन मैं चयनकर्ता लिखने में सक्षम नहीं हूं, मैं चयनकर्ता को श्रेणी पर नहीं लिखना चाहता हूं मैं इसे अपनी कक्षा पर कैसे लिख सकता हूं
नीलेश तुपे

@ निलेश तुपे क्या मतलब है आपका? आप चयनकर्ता विधि और लक्ष्य पास करते हैं - इसलिए लक्ष्य जो भी आप चाहते हैं वह हो सकता है
व्लादिमीर

2
BTW- मैंने इसे UIKit सुविधा श्रेणियों के लिए अपने छोटे से ओपन सोर्स रेपो में जोड़ा। धन्यवाद @Vladimir प्रेरणा के लिए। (ध्यान दें कि मेरा सारा सामान ARC-
एरिक गोल्डबर्ग

50

एक और सरल उपाय है

  1. एक मानक UIButton खींचें
  2. बटन की शैली को कस्टम पर सेट करें और उस बटन के लिए अपनी छवि सेट करें
  3. इसे UINavigationBar पर खींचें
  4. चयनकर्ता सेट करें

1
शायद सबसे आसान उपाय। धन्यवाद!
प्राइन

1
प्रतिभाशाली! केवल quirk - यदि आप बटन को सीधे नेव बार पर खींचते हैं तो यह काम नहीं करेगा। नेव बार में जोड़ने से पहले बटन को कस्टम पर सेट करना होगा। यकीन नहीं क्यों, लेकिन यह है कि यह कैसे है। तो चरण # 1 - का अर्थ है UIBatton को आप पर UI बार के अलावा कहीं और खींचें।
आंद्रेई तचिज़ोव

1
यह सरल और प्रभावी होना कठिन है। अच्छा जवाब
Add080bbA

37

मुझे यह आसान लगा। यह शीर्ष पर अंकित है। "random.png" को प्रोजेक्ट में होना चाहिए। बस किसी भी छवि को खींचें और छोड़ें।

 UIButton *a1 = [UIButton buttonWithType:UIButtonTypeCustom];
        [a1 setFrame:CGRectMake(0.0f, 0.0f, 25.0f, 25.0f)];
        [a1 addTarget:self action:@selector(randomMsg) forControlEvents:UIControlEventTouchUpInside];
        [a1 setImage:[UIImage imageNamed:@"config.png"] forState:UIControlStateNormal];
        UIBarButtonItem *random = [[UIBarButtonItem alloc] initWithCustomView:a1];

 //? line incomplete ?//   imageNamed:@"random.png"] style:UIBarButtonItemStylePlain target:self action:@selector(randomMsg)];

    self.navigationItem.rightBarButtonItem = random;

6

एक विकल्प UIBarButtonItem को उप-वर्ग करना है। क्यों? ताकि सही प्रेषक के साथ लक्ष्य पर कार्रवाई हो। उपरोक्त कोड में, एक्शन संदेश में प्रेषक तर्क UIButBोन उदाहरण है, UIBarButtonItem उदाहरण नहीं। यह महत्वपूर्ण होगा, उदाहरण के लिए, यदि आप बार बटन आइटम से एक UIPopoverController पेश करना चाहते हैं। UIBarButtonItem को उप-लिंक करके, आप मूल लक्ष्य को बनाए रखने वाले आइवर को जोड़ सकते हैं, जिससे हमारे उप-वर्ग के उदाहरणों को उचित प्रेषक के साथ कार्रवाई संदेश को अवरोधन, संशोधित करने और अग्रेषित करने की अनुमति मिलती है।

तो, CCFBarButtonItem.h:

#import <uIKit/UIBarButtonItem.h>

@interface CCFBarButtonItem : UIBarButtonItem
{
@protected
    id _originalTarget;
}
- (id)initWithImage:(UIImage *)image target:(id)target action:(SEL)action;
@end

और CCFBarButtonItem.m

#import "CCFBarButtonItem.h"
#import <UIKit/UIButton.h>
#import <UIKit/UIView.h>
#import <UIKit/UIImage.h>

@implementation CCFBarButtonItem

#pragma mark - Object life cycle

- (id)initWithImage:(UIImage *)image target:(id)target action:(SEL)action;
{
    _ASSIGN( _originalTarget, target );

    UIButton *imgButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [imgButton setImage:image forState:UIControlStateNormal];
    imgButton.frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
    [imgButton addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];

    self = [super initWithCustomView:imgButton];

    return self;
}

- (void)dealloc;
{
    MCRelease(_originalTarget);
    [super dealloc];
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
{
    if( [_originalTarget respondsToSelector:aSelector] )
    {
        return [_originalTarget methodSignatureForSelector:aSelector];
    }
    else
    {
        return [super methodSignatureForSelector:aSelector];
    }
}

- (void)forwardInvocation:(NSInvocation *)anInvocation;
{
    SEL aSelector = [anInvocation selector];
    if( [_originalTarget respondsToSelector:aSelector] )
    {
        //  modify the 'sender' argument so that it points to self
        [anInvocation setArgument:&self atIndex:2];
        [anInvocation invokeWithTarget:_originalTarget];
    }
    else
    {
        [self doesNotRecognizeSelector:aSelector];
    }
}
@end

5
UIBarButtonItem *menuItem = [[UIBarButtonItem alloc] initWithImage: [UIImage imageNamed:@"icon-menu.png"]
                                                                    style:UIBarButtonItemStylePlain
                                                                   target:self
                                                                   action:@selector(showMenu)];

3

यह प्रोग्रामेटिक रूप से भी किया जा सकता है (कोर्स):

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

UIImage *customImage = [UIImage imageNamed:@"imageName"];
UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, customImage.size.width, customImage.size.height)];
customView.backgroundColor = [UIColor colorWithPatternImage:customImage];

अगला, एक UIBarButtonItem बनाएं और इसे कस्टम दृश्य के साथ प्रारंभ करें।

UIBarButtonItem *customBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customView];

अब, केवल कस्टम UIBarButton को बाईं ओर जोड़ेंButButtonItem:

self.navigationItem.leftBarButtonItem = customBarButtonItem;

1

ठीक है कि श्रेणी बहुत अच्छा काम करती है क्योंकि पॉपओवरकंट्रोलर के साथ कोई समस्या नहीं है :-)

#import <UIKit/UIKit.h>

@interface UIBarButtonItem (BarButtonItemExtended)
+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action;
-(void)performBarButtonAction:(id)sender;
@end



#import "UIBarButtonItem+BarButtonItemExtended.h"

@implementation UIBarButtonItem (BarButtonItemExtended)

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action
{    
    UIButton *imgButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [imgButton setImage:image forState:UIControlStateNormal];
    imgButton.frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height);

    UIBarButtonItem *b = [[UIBarButtonItem alloc]initWithCustomView:imgButton];

    [imgButton addTarget:b action:@selector(performBarButtonAction:) forControlEvents:UIControlEventTouchUpInside];

    [b setAction:action];
    [b setTarget:target];

    return b;
}

-(void)performBarButtonAction:(UIButton*)sender
{
    [[self target] performSelector:self.action withObject:self];
}
@end

1

इस सरल उपाय की जाँच करें।

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
barButtonItem.image = [UIImage imageNamed:@"navButton.png"];
barButtonItem.style = UIBarButtonItemStylePlain;

[barButtonItem setBackgroundImage:[UIImage imageNamed:@"1x1.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
self.masterPopoverController = popoverController;
}

यहाँ 1x1.png एक 1 पिक्सेल पारदर्शी पीएनजी छवि है जिसे आप नीचे दिए गए लिंक से डाउनलोड कर सकते हैं

http://commons.wikimedia.org/wiki/File:1x1.png


आप पारदर्शी छवि का उपयोग करने के बजाय बस [UIImage नया] का उपयोग कर सकते हैं।
जेम्स कैम्पबेल

0

एक अन्य समाधान, प्रोग्राम को बटन बनाते समय इसे सरल समझें:

UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithImage:defaultImage
                                             landscapeImagePhone:landscapeImage
                                                           style:UIBarButtonItemStylePlain
                                                          target:self
                                                          action:@selector(someSelector)];
[button setBackgroundImage:[UIImage new] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[button setBackgroundImage:[UIImage new] forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.