测试已测试 | ✗ |
语言语言 | objective-cObjective C |
许可证 | MIT |
发布上次发布 | 2017年12月 |
swiftSwift 版本 | 4.0 |
由 Hector Matos 维护。
这里有一个简单而优秀的在 iOS 中创建上下文菜单的方法。您是否想要通过点击游戏中的精灵来访问一个快速而美观的弹出菜单?您是否想模仿 Pinterest,在您的 UICollectionView 中通过长按单元格来弹出上下文菜单?
欢迎您来到正确的地方。希望这能帮助我的 iOS 开发者同仁快速而容易地为他们的应用程序创建美丽的 UX!
要运行示例项目,请先克隆仓库,然后在 Example 目录中首先运行 pod install
。在那里提供了一个完整示例。如果你不想这样做,那么请继续阅读!
iOSContextualMenu 使用类似于 UITableView、UICollectionView、 UIPickerView 等的 dataSource/delegate 架构。
要在您的代码中实现它,请遵循以下步骤(这些步骤中的代码是将上下文菜单放入 UICollectionView 中每个单元格。在这个例子中,我在自定义 UICollectionViewCell 子类中添加了上下文菜单代码。如果您不希望这样,则可以将其添加到任意 UIView 或 UIView 的子类。以下示例也适用于 UITableView 和其UITableViewCell 子类。感谢抽象化!)
在您的接口声明中,确保您的对象遵守 BAMContextualMenuDelegate 和 BAMContextualMenuDataSource
@interface BAMCollectionViewCell () <BAMContextualMenuDelegate, BAMContextualMenuDataSource>
@end
创建您的 UIView 后,添加以下行以向其添加上下文菜单。注意:除非长按在该视图的边界内,否则上下文菜单不会激活。
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[BAMContextualMenu addContextualMenuToView:self.contentView delegate:self dataSource:self activateOption:kBAMContextualMenuActivateOption];
}
return self;
}
现在实现上下文菜单的数据源方法,就像实现UITableView、UICollectionView或UIPickerView一样。
数据源:注意:numberOfContextualMenuItems是必须的。如果未实现此方法,则上下文菜单将完全不会显示。
- (NSUInteger)numberOfContextualMenuItems
{
return 3;
}
实现数据源后,我们将实现我们的代理方法
注意:唯一必须实现的代理方法是contextualMenu:viewForMenuItemAtIndex:。您必须在方法中提供UIView。未这样做将导致抛出异常。
此外,您也可以返回任何UIView。BAMContextualMenu的一个优点是,当您返回UIImageView实例时,上下文菜单会为您调用setHighlighted:。这允许您在contextualMenu:viewForMenuItemAtIndex:方法中只提供一个imageView实例,该实例具有高亮图像和普通图像,并且在高亮显示时,imageView会将其原图替换为高亮图像。
- (UIView *)contextualMenu:(BAMContextualMenu *)contextualMenu viewForMenuItemAtIndex:(NSUInteger)index
{
UIImage *menuItemImage = [self imageForMenuItemAtIndex:index];
UIImage *highlightedMenuItemImage = [self highlightedImageForMenuItemAtIndex:index];
UIImageView *menuItemImageView = [[UIImageView alloc] initWithImage:menuItemImage highlightedImage:highlightedMenuItemImage];
return menuItemImageView;
}
这属于可选内容,但如果您想为每个菜单项的高亮状态使用单独的视图,可以使用contextualMenu:viewForHighlightedMenuItemAtIndex:。
- (UIView *)contextualMenu:(BAMContextualMenu *)contextualMenu viewForHighlightedMenuItemAtIndex:(NSUInteger)index
{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 50.0, 50.0)];
view.backgroundColor = [UIColor redColor];
return view;
}
就像UIPickerView一样,您还可以为每个菜单项关联一个标题。这也是可选的,但是通过实现contextualMenu:titleForMenuItemAtIndex:将放置一个标签,当菜单项被高亮时,该标签会弹出并居中显示。这个标签是一个轻微透明的白色圆形矩形标签,内部文字为黑色。返回空字符串或nil的NSString对象将防止显示标题标签。
- (NSString *)contextualMenu:(BAMContextualMenu *)contextualMenu titleForMenuItemAtIndex:(NSUInteger)index
{
NSString *title;
if (index == facebookMenuItemIndex) {
title = @"Share on Facebook";
} else if (index == googlePlusMenuItemIndex) {
title = @"Share on Google+";
} else if (index == pinterestMenuItemIndex) {
title = NSLocalizedString(@"Pin It!", nil);
}
return title;
}
如果您喜欢标题标签的外观,只想更改字体,可以使用contextualMenu:fontForMenuItemTitleViewAtIndex:。
- (UIFont *)contextualMenu:(BAMContextualMenu *)contextualMenu fontForMenuItemTitleViewAtIndex:(NSUInteger)index
{
return [UIFont boldSystemFontOfSize:19.0];
}
为了进一步定制,您可以通过实现contextualMenu:titleViewForMenuItemAtIndex:为自己的菜单项标题视图创建视图。
- (UIView *)contextualMenu:(BAMContextualMenu *)contextualMenu titleViewForMenuItemAtIndex:(NSUInteger)index
{
//Create a custom view here
return yourCustomView;
}
在某些情况下,开发者可能想在他们的游戏中将上下文菜单添加到移动精灵中,以便访问它的选项(例如:防御、攻击、逃跑)。在这种情况下,您可能想暂停游戏,以便用户可以在不干扰游戏的情况下选择选项。为此,您可以实现代理方法contextualMenuActivated:和contextualMenuDismissed。
- (void)contextualMenuActivated:(BAMContextualMenu *)contextualMenu
{
//Pause your game here.
}
- (void)contextualMenuDismissed:(BAMContextualMenu *)contextualMenu
{
//Unpause your game here.
}
此外,如果需要此类功能,可以随时通过调用removeContextualMenuFromView:来移除上下文菜单。
[BAMContextualMenu removeContextualMenuFromView:self.contentView];
目前,此类要正常工作,iOS的最小要求是iOS7。我正在开发一个适用于更早版本的版本。敬请期待!
Hector Matos,[email protected]
iOSContextualMenu在MIT许可协议下可用。有关更多信息,请参阅LICENSE文件。