我即将开始一个新项目,我有一个自定义菜单,我需要在我拥有的每个视图上显示。我不想使用标签栏,因为这个菜单是自定义设计的,可能会在某些时候添加一些动画。
是否有一种简单的方法可以在一个地方创建此菜单,这样我就不必将其构建到每个xib文件中?
由于
答案 0 :(得分:0)
标签栏控制器是系统提供的容器控制器。如果您使用的是iOS 5及更高版本,则可以创建自己的自定义容器视图控制器:
请参阅 View Controller编程指南中的Custom Container View Controllers讨论。
您需要的关键方法也会在UIViewController Class Reference中枚举。
我还建议查看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的受众规模相当小),所以我不再处理这种愚蠢了,但是希望这能让您了解一种可能的解决方案。