3

我需要向 UINavigationItem 添加一个按钮titleView(实际上是在 UINavigation Bar 的中心。

我使用以下代码来完成此操作:

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(0, 0, 70, 30);
[btn setSelected:YES];
[btn setTitle:@"list" forState:UIControlStateNormal];

我做了以下事情:

在此处输入图像描述

我需要为按钮“列表”提供相同样式的“完成”按钮(即UIBarButtonItem)?

4

4 回答 4

7

You can use UISegmentedControl:

UISegmentedControl *mySegmentedControl = [[UISegmentedControl alloc]
                initWithItems:@"Example"]];
mySegmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
[mySegmentedControl addTarget:self action:@selector(myMethod)
       forControlEvents:UIControlEventValueChanged];

self.navigationItem.titleView = mySegmentedControl;
于 2012-11-22T23:00:59.497 回答
1

UIBarButtonItems 只能用作 UIToolbar 中的项目(它们实际上不是 UIView 的实例),因此在您的 titleView 中直接使用 UIBarButtonItem 的唯一方法是将 UIToolbar 的实例设置为您的 titleView 并将您的 barButtonItem 添加到其中工具栏。但是,我认为这不会奏效。

我认为您需要做的是找到一种使用普通旧 UIButton 来模仿 UIBarButtonItem 样式的方法。您可以使用UIKit 艺术品提取器获取用于创建 UIBarButtonItems 的实际图像文件。然后,只需使用该背景图像创建自定义 UIButton 即可,一切顺利。

于 2012-02-15T19:16:30.027 回答
1

我使用了 andrej 的基于 UISegmentedControl 的方法,并对其进行了扩展,使其表现得更像一个普通的 UIButton:

@interface SPWKBarButton : UISegmentedControl
- (id)initWithTitle:(NSString *)title;
- (void)setTitle:(NSString *)title;
@end

@implementation SPWKBarButton 

- (id)initWithTitle:(NSString *)title
{
    self = [super initWithItems:@[title]];

    if (self) {
        self.segmentedControlStyle = UISegmentedControlStyleBar;

        NSDictionary *attributes = [NSDictionary dictionaryWithObject:[UIColor whiteColor]
                                                               forKey:UITextAttributeTextColor];

        [self setTitleTextAttributes:attributes
                            forState:UIControlStateNormal];
    }

    return self;
}

- (void)setTitle:(NSString *)title
{
    [self setTitle:title forSegmentAtIndex:0];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];

    if (CGRectContainsPoint(self.bounds, [[touches anyObject] locationInView:self])) {
        self.selectedSegmentIndex = 0;
    } else {
        self.selectedSegmentIndex = UISegmentedControlNoSegment;
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesEnded:touches withEvent:event];

    if (CGRectContainsPoint(self.bounds, [[touches anyObject] locationInView:self])) {
        [self sendActionsForControlEvents:UIControlEventTouchUpInside];
    }

    self.selectedSegmentIndex = UISegmentedControlNoSegment;
}

@end

对于基本用法,您可以将其用作 UIButton 插件替换:

_button = [[SPWKBarButton alloc] initWithTitle:titles[0]];

[_button addTarget:self
            action:@selector(doSomething:)
  forControlEvents:UIControlEventTouchUpInside];

[self.navigationItem setTitleView:_button];

该事件仅在触摸发生在分段控件的范围内时才会触发。享受。

于 2013-05-28T12:51:32.523 回答
0

是的,您也应该为按钮“列表”使用 UIBarButtonItem

使用自定义标识符和标题属性。

您可以使用 UIBarButtonItem 标识符“灵活空间”在中心显示按钮“列表”。

于 2012-02-15T19:16:22.980 回答