4

我正在使用 Cocoa Touch 创建一个单视图应用程序。我需要一个菜单​​来显示单个视图的不同主题,我一直想知道最好的方法是什么,以及如何实现。

我应该创建一个主从视图吗?如果是这样,我如何让详细视图成为应用程序加载的初始屏幕。但我不确定这是否是最好的方法。

我也一直在看这种弹出菜单之类的东西,但我宁愿自己学习如何实现这种东西,而不仅仅是购买现成的解决方案。Cocoa Touch 中是否有提供类似功能的类?他们显然已经使用 Core Graphics 从头开始​​构建了这个菜单,但是有没有更简单的方法来实现这种类型的菜单,例如使用一组 UIButtons?

代码示例将不胜感激,但我真的在寻找解决这个问题的最佳方法,所以我知道要熟悉哪些框架。

TIA

4

4 回答 4

2

您可以尝试使用UICollectionViewwithUICollectionViewFlowLayout创建一个可用于在不同主题之间切换的按钮网格。

如果不了解更多关于您想要从选择菜单中获得什么、您有多少主题、您希望它如何显示等信息,那么很难推荐一种方法而不是另一种方法。但由于是Apple 提供UICollectionViewFlowLayout的预定义以网格排列方式显示,因此它可能是解决此问题的好方法。UICollectionViewLayoutUIViews

以下是您将如何实现UICollectionViewwith UICollectioViewFlowLayout

头文件

@interface ViewController : UIViewController <UICollectionViewDataSource,UICollectionViewDelegateFlowLayout> {
    UICollectionView * themeSelection;
}

实施文件

- (void)viewDidLoad {
    UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
    themeSelection =[[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:layout];
    [themeSelection setDataSource:self];
    [themeSelection setDelegate:self];

    [themeSelection registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
    [self.view addSubview: themeSelection];

    [super viewDidLoad];
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return 15;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath];

    //Each cell is a theme that could be selected

    return cell;
}     

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return CGSizeMake(100, 100);
}
于 2013-08-01T10:06:39.387 回答
1

如果主题的数量少于或等于六个,您可以使用带有几个按钮的 UIActionSheet。在您的视图控制器中,使用以下代码处理“选择主题”按钮的点击:

UIActionSheet* as = [[UIActionSheet alloc] initWithTitle:@"Choose Theme" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Theme 1", @"Theme 2", @"Blue Theme", @"etc."];
[as showInView:[self view]];

在 .h 文件顶部的类定义旁边,添加以下内容:

<UIActionSheetDelegate>

在 .m 文件广告中,有这样的方法:

-(void)actionSheet:(UIActionSheet*)as clickedButtonAtIndex:(NSInteger)index {
  switch(index) {
    case 0:
      //It was theme 1
      break;
    case 1:
      //It was Theme 2
      break;
    case 3:
      //It was blue theme
      break;
    //And so on...
  }
}

将评论替换为切换到所选主题。

注意:如果您有六个以上的主题,您将需要更类似于操作表中 UIPickerViews 的这个SO 问题中讨论的解决方案。

于 2013-07-30T01:08:42.043 回答
1

使用 UINavigationController 并在导航堆栈上推送带有主题列表的 UITableViewController 怎么样?

您可以提供的主题数量不受限制,而且应该很容易做到。

或者您可以使用 [UIViewController presentViewController:animated:completion:] 并将 modalTransitionStyle 设置为 UIModalTransitionStyleFlipHorizo​​ntal。

于 2013-07-25T21:40:03.170 回答
0

有很多方法可以做到这一点。例如将 UITableView 添加到 UIActionSheet 并在特定按钮上显示 actionSheet。UIPopOverViewController 也最适合做这类工作。

以下是有用的代码源,可能对您的情况有所帮助:

https://github.com/nacho4d/手风琴

https://github.com/kyoshikawa/ZPopoverController

于 2013-07-31T08:23:51.790 回答