【问题标题】:Custom back button on navigation bar导航栏上的自定义后退按钮
【发布时间】:2012-01-03 12:41:11
【问题描述】:

在我的应用程序中有很多UIViewControllersUINavigationControllersUINavigationBar 上必须有一个“返回”按钮和一个“主页”UIButton。所有这些都可以正常工作。

但是我的一些UIViewControllers名字很长,有时候留的地方太小了。我正在尝试用自定义的“后退”替换“后退”按钮的原始标签(它显示上一个视图的标题),但无论我尝试了什么都没有用:

// Title didn't change
[self.navigationItem.backBarButtonItem setTitle:@"Back"];

// Action didn't set, no response from button ( button didn't do anything )
[self.navigationItem.leftBarButtonItem
   setAction:self.navigationItem.backBarButtonItem.action];

而且我需要“后退”按钮的样式类似于这个问题:Draw custom Back button on iPhone Navigation Bar

【问题讨论】:

标签: iphone ios uinavigationcontroller uinavigationitem


【解决方案1】:

试试下面的。它肯定会起作用:

- (void)viewDidLoad {
    [super viewDidLoad];

    UIImage *buttonImage = [UIImage imageNamed:@"back.png"];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setImage:buttonImage forState:UIControlStateNormal];
    button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height);
    [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
    self.navigationItem.leftBarButtonItem = customBarItem;
    [customBarItem release];
}

- (void)back {
    [self.navigationController popViewControllerAnimated:YES];
}

确保您的资源文件夹中有一个导航栏后退按钮大小的按钮图像,名称为back.png

如果需要任何其他帮助,请随时联系。

【讨论】:

  • 我发现您可以通过为突出显示状态设置图像来使自定义后退按钮与股票 iOS 后退按钮无法区分,如下所示:[button setImage:highlightedButtonImage forState:UIControlStateHighlighted];跨度>
  • 为什么我不能用这段代码给我的自定义后退按钮添加标题? [button setTitle:@"Back" forState:UIControlStateNormal];
  • 导航栏有 UIBarButton 类型的按钮。您可以根据需要创建具有自定义内容的 UIBarButton 项或创建标准系统项。
  • 其实我上面用的是你的代码,有[button setImage:buttonImage forState:UIControlStateNormal];这一行,我想我可以在后面加上[button setTitle:@"Back" forState:UIControlStateNormal];,这样就可以了,但是没有...跨度>
  • 这种方法的问题在于您没有自定义后退按钮,而是添加了一个“leftBarButtonItem”,这不是一回事。
【解决方案2】:

目标: 将 UINavigationBar 上的所有后退按钮自定义为白色图标

步骤: 1.在AppDelete的“didFinishLaunchingWithOptions”方法中:

UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"];

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [UINavigationBar appearance].tintColor = [UIColor whiteColor];
    [UINavigationBar appearance].backIndicatorImage = backBtnIcon;
    [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon;
}else{

    UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
}

2.在普通超级ViewController类的“viewDidLoad”方法中:

 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                     style:UIBarButtonItemStylePlain
                                                                    target:nil
                                                                    action:nil];
        [self.navigationItem setBackBarButtonItem:backItem];
    }else{
        //do nothing
    }

【讨论】:

    【解决方案3】:

    试试这个

    UIBarButtonItem *backBarBtnItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(popViewController)];
    [self.navigationItem setBackBarButtonItem:backBarBtnItem];
    
    - (void)popViewController
    {
        [self.navigationController popViewControllerAnimated:YES];
    }
    

    【讨论】:

    • 那行不通。我可以删除通常的后退按钮并添加我自己的,但是如何使它的形状像通常的?
    • 为此,您需要添加具有我猜想的形状图像的自定义按钮...[[UIBarButtonItem alloc] initWithCustomView:customButton];
    • 这是一个小野蛮人的代码,但我想,没有其他解决方案......所以,让我们成为野蛮人一段时间:) 无论如何感谢您的回应。
    【解决方案4】:

    如果你像我一样到处这样做,你最好将 Anil 的解决方案作为一个类别来实现:

    @interface UIViewController (CustomBackButton)
    
    - (void) setCustomBackButton;
    - (void) back;
    
    @end
    
    @implementation UIViewController (CustomBackButton)
    
    - (void) setCustomBackButton
    {
        UIImage *buttonImage = [UIImage imageNamed:@"back.png"];
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        [button setImage:buttonImage forState:UIControlStateNormal];
        button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height);
        [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
        UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
        self.navigationItem.leftBarButtonItem = customBarItem;
    }
    
    - (void) back
    {
        [self.navigationController popViewControllerAnimated:YES];
    }
    
    @end
    

    【讨论】:

      【解决方案5】:

      更简单:

      UIBarButtonItem *barBtnItem = 
        [[UIBarButtonItem alloc]initWithTitle:@"Indietro"
                                        style:UIBarButtonItemStyleBordered
                                       target:self
                                       action:@selector(pop)];
      [barBtnItem setTintColor:[UIColor whiteColor]];
      self.navigationItem.leftBarButtonItem = barBtnItem;
      

      【讨论】:

        【解决方案6】:

        假设您有两个控制器 - Controller1 和 Controller2。 Controller2 从 Controller1 推送。所以在将Controller2从Controller1推到navigationController之前

        Controller2 *controller2 = [[[Controller2 alloc]  init]autorelease];
        self.navigationItem.hidesBackButton = YES;   
        

        现在,在Controller2的viewDidLoad:方法中,添加如下sn-p

        UIBarButtonItem *backBarButtonItem =[[[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(goBackToAllPets:)]autorelease];
        self.navigationItem.leftBarButtonItem = backBarButtonItem;
        

        并且在 backButtonClicked 方法中,您可以执行您想要的检查。

        【讨论】:

          猜你喜欢
          • 2016-04-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-08
          • 2011-05-14
          相关资源
          最近更新 更多