我即将开始一个新项目,其中有一个自定义菜单,我需要在我拥有的每个视图上显示该菜单。我不想使用标签栏,因为此菜单是自定义设计的,并且可能会在某些时候添加一些动画。
有没有一种简单的方法可以在一个地方创建这个菜单,这样我就不必将它构建到每个 xib 文件中?
谢谢
我即将开始一个新项目,其中有一个自定义菜单,我需要在我拥有的每个视图上显示该菜单。我不想使用标签栏,因为此菜单是自定义设计的,并且可能会在某些时候添加一些动画。
有没有一种简单的方法可以在一个地方创建这个菜单,这样我就不必将它构建到每个 xib 文件中?
谢谢
标签栏控制器是系统提供的容器控制器。如果您使用的是 iOS 5 及更高版本,您可以制作自己的自定义容器视图控制器:
请参阅View Controller Programming Guide中的Custom Container View Controllers讨论。
UIViewController 类参考中也列举了您需要的关键方法。
我还建议查看 WWDC 2011 #102 - Implementing UIViewController Containment。
更新:
如果您想编写自己的自定义菜单,您可以执行以下操作。我没有做任何花哨的事情,但我只是添加了三个可能对应于您的自定义按钮的彩色子视图。而且我每个都有一个轻击手势识别器,您显然可以根据需要进行处理:
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 的受众规模很小),所以我不再处理这种愚蠢的事情,但希望这能给您了解一种可能的解决方案可能是什么样子。