কাস্টম চিত্র এবং কোনও সীমানা সহ UIBarButtonItem tem


89

আমি একটি কাস্টম চিত্র সহ একটি ইউআইবারবার্টন আইটেম তৈরি করতে চাই, তবে আইফোন যুক্ত করা সীমানাটি আমি চাই না, কারণ আমার চিত্রটির একটি বিশেষ সীমানা রয়েছে।

এটি পিছনের বোতামের মতো তবে একটি ফরওয়ার্ড বোতাম।

এই অ্যাপটি একটি ইনহাউস প্রকল্পের জন্য, সুতরাং অ্যাপল এটি প্রত্যাখ্যান করে বা অনুমোদন করেছে বা এটি পছন্দ করে কিনা আমি তাতে পাত্তা দিই না :-)

আমি যদি ইউআইবারবার্টন আইটেমের initwithCustomView: 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 টি ভিউতে এই প্রক্রিয়াটি পুনরাবৃত্তি করতে হয় তবে এটি ডিআরওয়াই নয়।

আমি মনে করি আমার সাবক্লাস করতে হবে, তবে কী?

  • এনএসভিউ?
  • ইউআইবারবারটন আইটেম?

ধন্যবাদ,

শুভেচ্ছা,


4
আপনার কোডটি ভাগ করে নেওয়ার জন্য ধন্যবাদ, এটাই আমার প্রয়োজন :)।
সর্বোচ্চ

4
প্রত্যেকে, আমি সান দ্বারা প্রদত্ত উত্তরটি 6 ফেব্রুয়ারিতে ব্যবহার করেছি, আমার স্টোরিবোর্ডে একীভূত হতে 5 মিনিটের সময় লেগেছিল এবং এটি পুরোপুরি কার্যকর হয়েছিল। নির্বাচক সম্পত্তি আইবির সংযোগ পরিদর্শকের অধীনে রয়েছে। ইউআইবাটন থেকে ভিউকন্ট্রোলার অবজেক্টে টেনে আনুন এবং পদ্ধতিগুলি পপ আপ হবে। আপনি যে পদ্ধতিটি চান তা আলতো চাপুন এবং আপনি বেশ সম্পন্ন করেছেন। কেবলমাত্র কিছু কোড ক্লিনআপ থাকবে। বার্বুটোনাইটেম = শূন্যস্থান প্রতিস্থাপনের জন্য লুকানো এবং লুকোচুরি করতে লুকানো এবং গোপন রাখতে বিডিএনএক্সএক্সএক্সএক্সএক্সএক্স ব্যবহার করা হয়েছে Used তবে এই পদ্ধতিটি ছিল সহজ এবং খুব পরিষ্কার।
ব্যবহারকারী589642

উত্তর:


44

আপনি কাস্টম বিভাগটি ব্যবহার করে সাবক্ল্যাসিং না করেই কোনও পদ্ধতি ইউআইবারবার্টন আইটেমে যুক্ত করতে পারেন:

@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

সুতরাং আপনার কোডের যে কোনও জায়গায় আপনি এই পদ্ধতিটিকে কল করে বার আইটেম তৈরি করতে পারেন (আপনি যদি তার ঘোষণার সাথে শিরোনাম অন্তর্ভুক্ত করেন তবে)।

পিএস আপনাকে 'ভি' ইউআইভিউউ ব্যবহার করার দরকার নেই যেহেতু আপনি UIBarButtonItemসরাসরি কাস্টম ভিউ হিসাবে একটি বোতাম দিয়ে তৈরি করতে পারেন ।
পিপিএস আপনার কোডেও [ফরওয়ার্ড রিলিজ] দরকার।


কাস্টম বিভাগ: আমাকে সেই ঘোষণাগুলির সাথে শিরোনামের ফাইল এবং বাস্তবায়ন ফাইলটি তৈরি করতে হবে, যেখানে আপনি কোডটি রেফারিং করছেন? ধন্যবাদ
mongea

এটির কাজ অনেক বেশি তবে আমি নির্বাচক লিখতে পারছি না আমি বিভাগে নির্বাচককে কীভাবে লিখতে চাই না আমি কীভাবে এটি আমার ক্লাসে লিখতে পারি
নীলেশ টুপে

@ নিলেশতুপে আপনার মানে কি? আপনি নির্বাচক পদ্ধতি এবং লক্ষ্যটি পাস করেন - সুতরাং লক্ষ্য আপনি যা চান তা হতে পারে
ভ্লাদিমির

4
বিটিডাব্লু- আমি এটি ইউআইকিট সুবিধা বিভাগের জন্য আমার ছোট্ট ওপেন সোর্স রেপোতে যুক্ত করেছি। অনুপ্রেরণার জন্য @ ভ্লাদিমিরকে ধন্যবাদ। (সমস্ত নোট আমার স্টাফ এআরসি ভিত্তিক হয়) github.com/egold/UIKitConvenience/blob/master/UIKitConvenience/...
এরিক গোল্ডবার্গ

50

আর একটি সহজ সমাধান হ'ল

  1. একটি মানক UIButton টানুন
  2. বোতামের স্টাইলটি কাস্টম করতে সেট করুন এবং সেই বোতামটির জন্য আপনার চিত্রটি সেট করুন
  3. এটি ইউআইএনএভিগেশনবারে টানুন
  4. নির্বাচক সেট করুন

4
সম্ভবত সবচেয়ে সহজ সমাধান। ধন্যবাদ!
প্রিন

4
উজ্জ্বল! একমাত্র কৌতুক - আপনি সরাসরি বার বারে বোতামটি টানলে এটি কার্যকর হবে না। বোতামটি এনএভি বারে যুক্ত হওয়ার আগে কাস্টম সেট করতে হবে। কেন নিশ্চিত না, তবে এটি কীভাবে হয়। সুতরাং পদক্ষেপ # 1 - এর অর্থ এনআইভি বার ব্যতীত অন্য কোথাও আপনার ইউআই ব্যাটনের টানুন।
আন্দ্রে টচিজভ

4
এটি সহজ এবং কার্যকর হওয়া শক্ত। উত্তম উত্তর
80 বিবিএ

37

আমি এটি সহজ উপায় খুঁজে পেয়েছি। এটি শীর্ষে sugested হয়। "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 সাবক্লাস করার একটি বিকল্প। কেন? যাতে ক্রিয়াটি সঠিক প্রেরকের সাথে লক্ষ্যবস্তুতে আহ্বান জানানো হয়। উপরের কোডে, অ্যাকশন বার্তায় প্রেরকের যুক্তিটি ইউআইবাটনের উদাহরণ, ইউআইবারবার বাটন আইটেম নয়। এটি গুরুত্বপূর্ণ হবে, উদাহরণস্বরূপ, আপনি বার বোতাম আইটেম থেকে কোনও ইউআইপিপভারকন্ট্রোলার উপস্থাপন করতে চান। UIBarButtonItem সাবক্লাসিং করে আপনি আমাদের আইটেম যুক্ত করতে পারেন যা আমাদের লক্ষ্যটি ধরে রাখে, আমাদের সাবক্লাস দৃষ্টান্তগুলি যথাযথ প্রেরকের সাথে ক্রিয়া বার্তাকে বাধা, সংশোধন এবং ফরোয়ার্ড করতে দেয়।

সুতরাং, সিসিএফবার বারটন আইটেম এইচ:

#import <uIKit/UIBarButtonItem.h>

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

এবং সিসিএফবারবারটন আইটেম.এম

#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


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 *customBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customView];

এখন, কাস্টম UIBarButton বামে বারবার বাটন আইটেম যুক্ত করুন:

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 পিক্সেলের স্বচ্ছ png চিত্র যা আপনি নীচের লিঙ্ক থেকে ডাউনলোড করতে পারেন

http://commons.wikimedia.org/wiki/File splitx1.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];
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.