【问题标题】:iPhone : making UIBarButtonItem that is arrow shapediPhone:制作箭头形状的 UIBarButtonItem
【发布时间】:2011-01-20 18:30:09
【问题描述】:

我在导航栏上有一个 UIBarButtonItem。我想把它做成箭头形状。我的意思是我希望它是方形的,除了尖的一面。有谁知道怎么做?

谢谢!

【问题讨论】:

    标签: iphone xcode uinavigationcontroller uibarbuttonitem


    【解决方案1】:

    我在这方面尝试了几种方法,最后使用了来自多个来源的所有答案找到了答案。有几个技巧;这个 sn-p 将显示这一切(我正在创建一个自定义 rightNavButton,但您可以轻松地将其调整为任何 UIBarButtonItem):

    // Produces a nice "right arrow" style button that mirrors the back arrow
    // automatically added by the navController
    //
    UIImage *buttonImage = [UIImage imageNamed:@"forwardButton.png"];
    UIButton *forwardButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [forwardButton setBackgroundImage:buttonImage forState:UIControlStateNormal];
    [forwardButton setTitle:@"Meter" forState:UIControlStateNormal];
    forwardButton.font = [UIFont boldSystemFontOfSize:12];
    forwardButton.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height);
    [forwardButton addTarget:self action:@selector(showMeter) 
               forControlEvents:UIControlEventTouchUpInside];
    
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] 
               initWithCustomView:forwardButton];
    

    注意:事实证明,如果您在使用 UIButton 分配自定义视图后尝试直接在按钮项上设置目标和操作,则不会采取 - 您必须在按钮本身 - 显然navBar 使用逐字提供的按钮。

    这是我在不透明黑色navBar 上使用的图像(显然你可以使用任何东西):http://raretiger.com/images/forwardbutton.png

    【讨论】:

    • 您可以在此处下载,兼容 Retina 的透明图像:[链接]handleopenurl.com/assets/docs/arrow-buttons.zip[/link] 后退箭头的 leftCap 为 15,前进箭头为 5。(正常大小的按钮。)
    • 您在分配UIBarButtonItem 'retain +1' 然后将其分配给属性rightBarButtonItem 'retain +1' 时出现内存泄漏。这意味着 UIBarButtonItem 现在的保留计数为 2 并且永远不会被释放。你需要自动释放 UIBarButtonItem:self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:forwardButton] autorelease];
    【解决方案2】:

    制作自定义背景。具体方法见Creating a left-arrow button (like UINavigationBar's "back" style) on a UIToolbar


    您可以-pushNavigationItem:animated: 使内置的后退按钮出现,尽管您不能为其分配自定义操作。


    对于未记录的方法,您可以使用

    UIButton* backButton = [UIButton buttonWithType:101];
    

    创建一个后退“按钮”。

    【讨论】:

    • @Matt:那不是内置按钮类型。
    • 快速破解,有点太晚了:前进按钮是带有 transform=scale(-1,1) 且其 textLabel 具有 transform=scale(-1,1) 的后退按钮。
    • 如果你使用 [UIButton buttonWithType:101];您将如何更改“tintColor”?
    • @kennytm 如何在 Swift 中实现?
    【解决方案3】:

    您可以使用所需的图像创建一个 UIImageView 或一个 UIButton 然后使用:

    [[UIBarButtonItem alloc] initWithCustomView: arrowButton];
    

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      继续@Plamen Dragozov 的想法:我注意到如果您将uibutton 保持原样,它会在触摸时触发图片调整,这与普通导航返回按钮的作用完全相反。所以我所做的是取消选中“突出显示调整图像”,它就像一个魅力。

      希望这对像我这样的新手有所帮助。

      【讨论】:

        【解决方案5】:

        更优雅的解决方案:

        UIBarButtonItem * backButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Title" style:UIBarButtonItemStylePlain target:self action:@selector(back:)];
        [backButtonItem setBackgroundImage:[UIImage imageNamed:@"back.png"]      forState:UIControlStateNormal     barMetrics:UIBarMetricsDefault];
        self.navigationItem.leftBarButtonItem = backButtonItem;
        

        【讨论】:

          【解决方案6】:

          我的问题是重命名出现在推送视图控制器上的后退按钮。我发现了一个肮脏的解决方法,如果你忽略不理想的动画问题,你会得到一个带有你想要的标题的后退按钮。

          诀窍是在viewWillDisappear中更改第一个VC的标题并在viewWillAppear中重新设置它

          (不用说,默认情况下,如果没有设置leftBarButtonItemUINavigationController会显示一个后退按钮,带有推送当前VC的VC的标题)

          在你推送当前 VC 的 VC 中,做

          -(void) viewWillDisappear:(BOOL) animated {
            [super viewWillDisappear:animated];
            self.title = @"Back";
          }
          
          -(void) viewWillAppear:(BOOL) animated {
            [super viewWillAppear:animated];
            self.title = @"Original Title";
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-30
            • 1970-01-01
            • 2015-07-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多