2010-04-21 17 views
88

Tôi muốn tạo UIBarButtonItem bằng một hình ảnh tùy chỉnh, nhưng tôi không muốn viền mà iPhone thêm vào, vì Hình ảnh của tôi có đường viền đặc biệt.UIBarButtonItem với hình ảnh tùy chỉnh và không có đường viền

Cũng giống như nút quay lại nhưng nút chuyển tiếp.

App này là dành cho một dự án trong nhà, vì vậy tôi không quan tâm nếu Apple từ chối hoặc chấp thuận hay thích nó :-)

Nếu tôi sử dụng initWithCustomView: tài sản v của UIBarButtonItem, tôi có thể làm điều đó :

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

Công trình này, nhưng nếu tôi phải lặp lại quy trình này trong 10 chế độ xem, điều này không phải là KHÔ.

Tôi cho rằng tôi phải phân lớp, nhưng cái gì?

  • NSView?
  • UIBarButtonItem?

cảm ơn,

regards,

+3

Cám ơn chia sẻ mã của bạn, đó là tất cả tôi cần :). – Max

+1

Mọi người, tôi đã sử dụng câu trả lời được cung cấp bởi San vào ngày 6 tháng Hai. Phải mất tất cả 5 phút để tích hợp vào Bảng phân cảnh của tôi và nó hoạt động hoàn hảo. Thuộc tính Selector thuộc Bộ kiểm tra kết nối của IB. Điều khiển kéo từ UIButton đến đối tượng ViewController và các phương thức sẽ bật lên. Nhấn vào phương thức bạn muốn và bạn thực hiện khá nhiều. Điều duy nhất còn lại sẽ là dọn dẹp mã. Được sử dụng btnXXXXX.hidden để ẩn và bỏ ẩn để thay thế barbuttonitem = nil. Nhưng phương pháp này rất dễ dàng và rất sạch sẽ. – user589642

Trả lời

44

Bạn có thể thêm một phương pháp để UIBarButtonItem mà không subclassing nó sử dụng loại tùy chỉnh:

@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 

Vì vậy, bất cứ nơi nào trong mã của bạn, bạn có thể tạo mục thanh gọi phương pháp này (miễn là bạn bao gồm một tiêu đề với tuyên bố của nó).

P.S. Bạn không cần phải sử dụng 'v' UIView vì bạn có thể tạo UIBarButtonItem bằng một nút làm chế độ xem tùy chỉnh trực tiếp.
P.P.S. Bạn cũng cần [chuyển tiếp] trong mã của bạn.

+0

PS => yes, nó cũng hoạt động, ít mã :-) – mongeta

+0

PPS => thanks, bây giờ đã thêm – mongeta

+0

Loại tùy chỉnh: Tôi phải tạo tệp tiêu đề với các khai báo đó và tệp triển khai, nơi tôi đặt mã bạn đang giới thiệu? cảm ơn – mongeta

6

Cách khác là phân lớp UIBarButtonItem. Tại sao? Vì vậy, hành động được gọi trên mục tiêu với người gửi chính xác. Trong đoạn mã trên, đối số người gửi trong thông báo hành động là cá thể UIButton, không phải là cá thể UIBarButtonItem. Điều này sẽ rất quan trọng, ví dụ, nếu bạn muốn trình bày một UIPopoverController từ mục nút thanh. Bằng cách phân lớp UIBarButtonItem, bạn có thể thêm một ivar giữ lại đích ban đầu, cho phép các cá thể lớp con của chúng ta chặn, sửa đổi và chuyển tiếp thông báo hành động với người gửi thích hợp.

Vì vậy, CCFBarButtonItem.h:

#import <uIKit/UIBarButtonItem.h> 

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

và 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 
36

tôi thấy nó cách này dễ dàng. Đó là sugested trên đầu trang. "random.png" phải nằm trong dự án. Chỉ cần kéo và thả bất kỳ hình ảnh nào.

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; 
+1

cảm ơn, nó hoạt động! – offset

49

Một giải pháp đơn giản là

  1. Kéo một UIButton chuẩn
  2. Đặt phong cách của nút để tùy chỉnh và thiết lập hình ảnh cho nút đó
  3. Kéo nó vào UINavigationBar
  4. Set Selector
+0

Có lẽ là giải pháp dễ nhất. Cảm ơn! – Prine

+0

@Prine Cảm ơn :) – san

+1

Tuyệt vời! Quirk duy nhất - nó sẽ không hoạt động nếu bạn kéo nút thẳng đến thanh điều hướng. Nút phải được đặt thành tùy chỉnh trước khi được thêm vào thanh điều hướng. Không chắc chắn tại sao, nhưng đây là cách nó được. Vì vậy, bướC# 1 - có nghĩa là kéo UIBatton ở đâu đó trên giao diện người dùng của bạn ngoài thanh điều hướng. –

1

Ok that c ategory hoạt động rất tốt bởi vì không có vấn đề với Popovercontroller :-)

#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 
3

này cũng có thể được thực hiện theo chương trình cũng như (các khóa học):

Đầu tiên, tạo một giao diện tùy chỉnh. Chế độ xem tùy chỉnh này có thể chứa hình ảnh, nút hoặc bất kỳ thứ gì khác bạn muốn. Chế độ xem tùy chỉnh có thể được lập trình hoặc bằng IB:

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

Tiếp theo, tạo UIBarButtonItem và khởi tạo chế độ xem tùy chỉnh.

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

Bây giờ, chỉ cần thêm UIBarButton tùy chỉnh để các leftBarButtonItem:

self.navigationItem.leftBarButtonItem = customBarButtonItem; 
0

Một giải pháp khác, nghĩ rằng nó đơn giản trong trường hợp khi tạo nút programatically:

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

Kiểm tra này ra đơn giản dung dịch.

- (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; 
} 

Đây 1x1.png là một hình ảnh png trong suốt 1 pixel mà bạn có thể tải về từ liên kết dưới đây

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

+0

Một dòng giải pháp mã chắc chắn là tốt trong cuốn sách của tôi –

+0

Bạn chỉ có thể sử dụng [UIImage new] thay vì sử dụng hình ảnh trong suốt. –

4
UIBarButtonItem *menuItem = [[UIBarButtonItem alloc] initWithImage: [UIImage imageNamed:@"icon-menu.png"] 
                    style:UIBarButtonItemStylePlain 
                    target:self 
                    action:@selector(showMenu)]; 
Các vấn đề liên quan