如何使用UISegmentedControl切换视图?

我试图找出如何使用UISegmentedControl的不同状态来切换视图,类似于苹果公司在App Store中在“Top Paid”和“Top Free”之间切换时的操作。

最简单的方法是有两个视图,您可以切换其可见性以指示哪个视图已被选中。 下面是一些关于如何完成的示例代码,绝对不是处理视图的优化方式,而只是演示如何使用UISegmentControl切换可见视图:

- (IBAction)segmentSwitch:(id)sender { UISegmentedControl *segmentedControl = (UISegmentedControl *) sender; NSInteger selectedSegment = segmentedControl.selectedSegmentIndex; if (selectedSegment == 0) { //toggle the correct view to be visible [firstView setHidden:NO]; [secondView setHidden:YES]; } else{ //toggle the correct view to be visible [firstView setHidden:YES]; [secondView setHidden:NO]; } } 

你当然可以进一步重新编码来隐藏/显示正确的视图。

就我而言,我的观点是相当复杂的,我不能只是改变不同意见的隐藏属性,因为它会占用太多的内存。

我已经尝试了几种解决scheme,而且他们中的任何一个都不适合我,或者执行不正常,特别是navBar的titleView在推/视图时并不总是显示segmentedControl。

我发现这个博客文章解释了如何以正确的方式做到这一点。 似乎他在WWDC'2010中得到了苹果工程师的帮助,想出了这个解决scheme。

http://redartisan.com/2010/6/27/uisegmented-control-view-switching-revisited

这个链接的解决scheme是迄今为止我发现的最好的解决scheme。 有一点调整,它也可以在底部的tabBar工作正常

或者,如果它是一个表格,您可以重新加载表格,并在cellForRowAtIndex中,根据选定的片段选项从不同的数据源填充表格。

一个想法是使用分段控件的视图有一个容器视图,您可以使用不同的子视图(在切换切片时添加为容器视图的唯一子视图)。 你甚至可以为这些子视图设置不同的视图控制器,但是如果你需要它们(必须知道它们在哪个导航控制器下),你必须转发诸如“viewWillAppear”和“viewWillDisappear”之类的重要方法。

通常情况下,这样做的效果非常好,因为您可以在IB中使用容器布局主视图,并且子视图将填充容器允许的任何空间(确保您的autoresize掩码设置正确)。

试试这个代码,这将帮助你在不同的视图之间切换段控制段的切换

打开不同的视图select不同的段的UISegmentControl

尝试使用SNFSegmentedViewController ,这是一个开源组件,通过像UITabBarController这样的设置来完成您正在寻找的任务。

从刘慧卿的回答中,我创造了这个:

 // // ViewController.m // ResearchSegmentedView // // Created by Ta Quoc Viet on 5/1/14. // Copyright (c) 2014 Ta Quoc Viet. All rights reserved. // #define SIZE_OF_SEGMENT 56 #import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize theSegmentControl; UIView *firstView; UIView *secondView; CGRect leftRect; CGRect centerRect; CGRect rightRect; - (void)viewDidLoad { [super viewDidLoad]; leftRect = CGRectMake(-self.view.frame.size.width, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT); centerRect = CGRectMake(0, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT); rightRect = CGRectMake(self.view.frame.size.width, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT); firstView = [[UIView alloc] initWithFrame:centerRect]; [firstView setBackgroundColor:[UIColor orangeColor]]; secondView = [[UIView alloc] initWithFrame:rightRect]; [secondView setBackgroundColor:[UIColor greenColor]]; [self.view addSubview:firstView]; [self.view addSubview:secondView]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)segmentSwitch:(UISegmentedControl*)sender { NSInteger selectedSegment = sender.selectedSegmentIndex; [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.2]; if (selectedSegment == 0) { //toggle the correct view to be visible firstView.frame = centerRect; secondView.frame = rightRect; } else{ //toggle the correct view to be visible firstView.frame = leftRect; secondView.frame = centerRect; } [UIView commitAnimations]; } @end 

分配.H in

  UISegmentedControl *lblSegChange; - (IBAction)segValChange:(UISegmentedControl *) sender 

声明.M

 - (IBAction)segValChange:(UISegmentedControl *) sender { if(sender.selectedSegmentIndex==0) { viewcontroller1 *View=[[viewcontroller alloc]init]; [self.navigationController pushViewController:view animated:YES]; } else { viewcontroller2 *View2=[[viewcontroller2 alloc]init]; [self.navigationController pushViewController:view2 animated:YES]; } } 

一个快速的Swift版本:

 @IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) { if segmentControl.selectedSegmentIndex == 0 { // do something } else { // do something else } }