详解iOS应用中自定义UIBarButtonItem导航按钮的创建方法

iOS系统导航栏中有leftBarButtonItem和rightBarButtonItem,我们可以根据自己的需求来自定义这两个UIBarButtonItem。

四种创建方法

系统提供了四种创建的方法:


- (instancetype)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:(id)target action:(SEL)action;

- (instancetype)initWithImage:(UIImage *)image style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action;

- (instancetype)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action;

- (instancetype)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:(id)target action:(SEL)action;

- (instancetype)initWithCustomView:(UIView *)customView;


通过系统UIBarButtonSystemItem创建

自定义rightBarButtonItem,代码如下:


self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(right:)];


UIBarButtonSystemItem有以下样式可以供选择:

typedef NS_ENUM(NSInteger, UIBarButtonSystemItem) {

    UIBarButtonSystemItemDone,

    UIBarButtonSystemItemCancel,

    UIBarButtonSystemItemEdit,  

    UIBarButtonSystemItemSave,  

    UIBarButtonSystemItemAdd,

    UIBarButtonSystemItemFlexibleSpace,

    UIBarButtonSystemItemFixedSpace,

    UIBarButtonSystemItemCompose,

    UIBarButtonSystemItemReply,

    UIBarButtonSystemItemAction,

    UIBarButtonSystemItemOrganize,

    UIBarButtonSystemItemBookmarks,

    UIBarButtonSystemItemSearch,

    UIBarButtonSystemItemRefresh,

    UIBarButtonSystemItemStop,

    UIBarButtonSystemItemCamera,

    UIBarButtonSystemItemTrash,

    UIBarButtonSystemItemPlay,

    UIBarButtonSystemItemPause,

    UIBarButtonSystemItemRewind,

    UIBarButtonSystemItemFastForward,

#if __IPHONE_3_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED

    UIBarButtonSystemItemUndo,

    UIBarButtonSystemItemRedo,

#endif

#if __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED

    UIBarButtonSystemItemPageCurl,

#endif

};


最后别忘了实现right:方法:

- (void)right:(id)sender

{

    NSLog(@"rightBarButtonItem");

}


自定义文字的UIBarButtonItem

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStylePlain target:self action:@selector(back:)];
UIBarButtonItemStyle有以下三种选择:


typedef NS_ENUM(NSInteger, UIBarButtonItemStyle) {

    UIBarButtonItemStylePlain,

    UIBarButtonItemStyleBordered NS_ENUM_DEPRECATED_IOS(2_0, 8_0, "Use UIBarButtonItemStylePlain when minimum deployment target is iOS7 or later"),

    UIBarButtonItemStyleDone,

};


实现back:方法:

- (void)back:(id)sender

{

    [self.navigationController popViewControllerAnimated:YES];

}


自定义照片的UIBarButtonItem

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"test"] style:UIBarButtonItemStylePlain target:self action:@selector(right:)];


自定义UIView的UIBarButtonItem

自定义UIView,然后通过initWithCustomView:方法来创建UIBarButtonItem。


UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 60)];

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:testView];


看到有朋友在后台提问:

我现在即需要改那个导航原生的返回图片,也要改返回文字,应该怎么改呢,求指教。
其实,这个就可以用initWithCustomView:来解决,自定义UIView你可以放UIImageView和UILabel。可以自定义UIView,那么想怎么定义都是可以的。

下面来看一个有趣的例子:
先说一下需求:
1.做一个RightBarButtonItem不断旋转的Demo;
2.点击RightBarButtonItem 按钮旋转或暂停;
最终效果展示:

就是那个音符图形的旋转。
关键代码展示(已加注释):


//

// ViewController.m

// NavigationBtn

//

#import "ViewController.h" #define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)

///ImageView旋转状态枚举 typedef enum { RotateStateStop, RotateStateRunning, }RotateState;

@interface ViewController () { ///旋转角度 CGFloat imageviewAngle; ///旋转ImageView UIImageView *imageView; ///旋转状态 RotateState rotateState; }

@end



@implementation ViewController

- (void)viewDidLoad { [super viewDidLoad]; self.title=@"微信公众账号:乐Coding"; [self buildBarButtonItem]; } #pragma mark 添加 RightBarButtonItem -(void)buildBarButtonItem{

imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon"]]; imageView.autoresizingMask = UIViewAutoresizingNone; imageView.contentMode = UIViewContentModeScaleToFill; imageView.bounds=CGRectMake(0, 0, 40, 40); //设置视图为圆形 imageView.layer.masksToBounds=YES; imageView.layer.cornerRadius=20.f; UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(0, 0, 40, 40); [button addSubview:imageView]; [button addTarget:self action:@selector(animate) forControlEvents:UIControlEventTouchUpInside]; imageView.center = button.center; //设置RightBarButtonItem UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithCustomView:button]; self.navigationItem.rightBarButtonItem = barItem; } #pragma mark 点击 RightBarButtonItem - (void)animate { //改变ImageView旋转状态 if (rotateState==RotateStateStop) { rotateState=RotateStateRunning; [self rotateAnimate]; }else{ rotateState=RotateStateStop; } } #pragma mark 旋转动画 -(void)rotateAnimate{ imageviewAngle+=50; //0.5秒旋转50度 [UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{ imageView.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(imageviewAngle)); } completion:^(BOOL finished) { if (rotateState==RotateStateRunning) { [self rotateAnimate]; } }]; }

- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. }

@end


声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。