【问题标题】:Programmatically add a UISegmentedControl to a UINavigationBar以编程方式将 UISegmentedControl 添加到 UINavigationBar
【发布时间】:2014-07-20 19:52:34
【问题描述】:

如何以编程方式将 UISegmentedControl 添加到 UINavigationBar?

我不想为此使用 XIB 文件。

我有一个 UIView 和一个作为子视图添加的 UITableView。

我尝试了两种方法,但都不满意:

1)

self.segmentedControl = [[UISegmentedControl alloc]initWithItems:[NSArray arrayWithObjects:@"All",@"Subject",@"Category",@"Finished",nil]];
self.segmentedControl.backgroundColor = [UIColor cloudsColor];
[self.segmentedControl setSelectedSegmentIndex:0];
[self.segmentedControl addTarget:self action:@selector(segmentedControlHasChangedValue) forControlEvents:UIControlEventValueChanged];
self.mainView.tableHeaderView = self.segmentedControl;

第一个失败的原因是在 UITableView 中,当用户滚动时,分段控件也会滚动!我不希望这种情况发生。它必须固定在顶部。

2) 第二次尝试

UISegmentedControl *statFilter = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Filter_Personnal", @"Filter_Department", @"Filter_Company", nil]];
[statFilter setSegmentedControlStyle:UISegmentedControlStyleBar];
[statFilter sizeToFit];
self.navigationItem.titleView = statFilter;

这会删除我的标题!!!我在 UINavigationBar 的顶部有一个标题,这个方法将它删除!!

这是我想要完成的示例:UISegmentedControl below UINavigationbar in iOS 7

UISegmentedControl 必须作为 UINavigationBar 的一部分固定在下方,并且必须位于标题下方!

谢谢!

【问题讨论】:

  • 将分段控件添加为表格视图上方的子视图。这有什么复杂的?
  • 呃……好吧,我一开始没有尝试这个,因为我不想弄乱我的 UITableView 的边界……
  • 重新定位表格是一行代码。您在他们使用工具栏的地方发布的链接也是一种简单的方法。
  • @WayWay 我回答了这个问题:UISegmentedControl below UINavigationbar in iOS 7

标签: ios objective-c uinavigationbar uisegmentedcontrol


【解决方案1】:

使用tableView:viewForHeaderInSection:(也可能是tableView:heightForHeaderInSection:)而不是tableHeaderView。将tableStyle 设置为UITableViewStylePlain(这应该是默认值)。

【讨论】:

  • 这是我对方法 1 的处理方法,但它不起作用,因为它随着我的桌子滚动!
  • 您的代码使用了tableHeaderView(全局标题),而不是委托方法(部分标题)...部分标题贴在屏幕顶部。
【解决方案2】:

正如其他海报所建议的那样,您可以将分段控件放在表格视图上方和导航栏下方,但您需要将表格视图向下移动。

...或者,您可以将分段控件添加为 tableHeaderView。

第三种选择是将其实际添加到导航栏。为此,您必须将其转换为 navBarItem。像这样的:

UISegmentedControl *statFilter = [[UISegmentedControl alloc] 
  initWithItems:
    [NSArray arrayWithObjects:
      @"Filter_Personnal", 
      @"Filter_Department", 
      @"Filter_Company", 
      nil]];
[statFilter setSegmentedControlStyle:UISegmentedControlStyleBar];
[statFilter sizeToFit];

UIBarItem *theBarItem = [[UIBarItem alloc] initWithCustomView: statFilter];
self.navigationItem.rightBarButtonItem = theBarItem;

【讨论】:

    【解决方案3】:

    您可以使用以下代码:

    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    
    
         if (section == 0) {
             UIView *viewHeader = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];
    
    
             UISegmentedControl *segmentedControl = [[UISegmentedControl alloc]initWithItems:[NSArray arrayWithObjects:@"All",@"Subject",@"Category",@"Finished",nil]];
             segmentedControl.backgroundColor = [UIColor cloudsColor];
             [segmentedControl setSelectedSegmentIndex:0];
             [segmentedControl addTarget:self action:@selector(segmentedControlHasChangedValue) forControlEvents:UIControlEventValueChanged];
             segmentedControl.frame = CGRectMake(0, 20, viewHeader.frame.size.width, 50);
    
    
             [viewHeader addSubview:segmentedControl];
    
             return viewHeader;
    
         }
         return nil; 
    }
    

    希望这会有所帮助。 谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 2015-11-30
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      相关资源
      最近更新 更多