Viewcontrollers最佳实践

时间:2012-12-19 20:21:30

标签: ios xcode uiviewcontroller

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

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

由于

1 个答案:

答案 0 :(得分: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的受众规模相当小),所以我不再处理这种愚蠢了,但是希望这能让您了解一种可能的解决方案。