0

我即将开始一个新项目,其中有一个自定义菜单,我需要在我拥有的每个视图上显示该菜单。我不想使用标签栏,因为此菜单是自定义设计的,并且可能会在某些时候添加一些动画。

有没有一种简单的方法可以在一个地方创建这个菜单,这样我就不必将它构建到每个 xib 文件中?

谢谢

4

1 回答 1

0

标签栏控制器是系统提供的容器控制器。如果您使用的是 iOS 5 及更高版本,您可以制作自己的自定义容器视图控制器:


更新:

如果您想编写自己的自定义菜单,您可以执行以下操作。我没有做任何花哨的事情,但我只是添加了三个可能对应于您的自定义按钮的彩色子视图。而且我每个都有一个轻击手势识别器,您显然可以根据需要进行处理:

NSInteger const kHeight = 50;
NSInteger const kCount = 3;

@interface CustomMenu ()
@property (nonatomic, strong) NSMutableArray *menuViews;
@end

@implementation CustomMenu


- (id)init
{
    self = [super init];
    if (self)
    {
        _menuViews = [[NSMutableArray alloc] init];
        for (NSInteger i = 0; i < kCount; i++)
        {
            UIView *subview = [[UIView alloc] init];
            subview.tag = i;
            [self addSubview:subview];
            [_menuViews addObject:subview];
            UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
            [subview addGestureRecognizer:recognizer];
        }

        [_menuViews[0] setBackgroundColor:[UIColor blueColor]];
        [_menuViews[1] setBackgroundColor:[UIColor redColor]];
        [_menuViews[2] setBackgroundColor:[UIColor greenColor]];
    }
    return self;
}

- (void)layoutSubviews
{
    CGFloat width = self.superview.bounds.size.width;
    CGFloat height = self.superview.bounds.size.height;

    CGFloat menuChoiceWidth = width / kCount;

    self.frame = CGRectMake(0, height - kHeight, width, kHeight);

    NSInteger subviewIndex = 0;

    for (UIView *subview in self.menuViews)
    {
        subview.frame = CGRectMake(subviewIndex * menuChoiceWidth, 0,
                                   menuChoiceWidth, kHeight);
        subviewIndex++;
    }

}
- (void)handleTap:(UITapGestureRecognizer *)recognizer
{
    NSLog(@"%s tapped on %d", __FUNCTION__, recognizer.view.tag);
}

@end

然后,您的各种视图控制器只需要确保将其添加CustomMenu到视图中:

@interface ViewController ()
@property (nonatomic, strong) CustomMenu *menu;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.menu = [[CustomMenu alloc] init];
    [self.view addSubview:self.menu];
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [self.menu layoutSubviews];
}

@end

我承认我已经放弃了对 iOS 4.3 的支持(只是不值得心痛,而且现在 4.3 的受众规模很小),所以我不再处理这种愚蠢的事情,但希望这能给您了解一种可能的解决方案可能是什么样子。

于 2012-12-19T20:42:40.643 回答