以编程方式将UISegmentedControl添加到UINavigationBar

时间:2014-05-30 23:58:01

标签: ios objective-c uinavigationbar uisegmentedcontrol

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

我不想为此使用XIB文件。

我有一个带有UITableView的UIView,它被添加为子视图。

我尝试了两种方法,但两种方法都不尽如人意:

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的一部分留在下面,并且必须低于标题!

谢谢!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您可以使用以下代码:

- (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; 
}

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

答案 2 :(得分:0)

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

...或者,您可以将分段控件添加为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;