使用分段控制器更改视图

时间:2014-11-16 18:37:33

标签: ios objective-c uiviewcontroller uinavigationbar uisegmentedcontrol

我知道之前已经问过这个问题,我知道如何实际更改视图或查看具有分段控件的控制器,但我有一个更具体的问题。我设计了我的UI,设计师使用了像UISegmentedControl这样的东西,作为视图转换器。但是,它位于导航栏下方,因此我无法在导航栏中嵌入分段控件,让导航控制器处理在堆栈上和窗口外推送和弹出视图,因为我需要分段控件不动画,就好像它是导航栏的一部分。我已经尝试了几种方法,例如使用带有包含分段控件的子类导航栏的导航控制器,但是您无法编辑导航控制器导航栏的框架。如果有人可以帮助设置自定义动画,使得分段控件不会动画,那也会很棒。我正在使用下面的导航栏将图片链接到分段控件以获取上下文。 https://dl.dropboxusercontent.com/s/qjiedv4thpaosru/Screen%20Shot%202014-11-16%20at%201.30.45%20PM.png?dl=0

谢谢!

更新:

如果这个问题没有暂停,我会将此作为答案发布并选择它,但这是我如何解决自己的问题:

我使用navBar +分段控件(如上所示)创建了一个UIViewController,并在其下创建了一个容器视图。

我拿了两个VC(测验和学习)并将它们放在导航控制器中。通过分段控件上的IBAction,我使用操纵导航堆栈来访问正确的视图控制器。

1 个答案:

答案 0 :(得分:2)

假设您有一个嵌入在UINavigationController中的ViewController,mainVC,并且mainVC具有分段控件。选择第一个段时,您需要显示firstVC viewController,第二个段需要secondVC。

我发现如果你让mainVC成为UIPageViewController的子类,那么很难让分段控件从动画开/关屏幕停止。所以相反,我会创建一个UIPageViewController,并将其作为mainVC视图的子视图嵌入(它可以具有相同的框架)。分段控件同样是mainVC视图的子视图(因此您可以根据需要进行布局 - 例如,在导航栏的下方)。我在mainVC的viewDidLoad代码中完成了所有这些:

// Set up a page controller to manage the pages....
self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
// self.pageController.dataSource = self;
// self.pageController.delegate = self;
self.pageController.view.frame = CGRectMake(0,0,self.view.frame.size.width, self.view.frame.size.height);
[self.pageController setViewControllers:@[firstVC] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
[self addChildViewController:self.pageController];
[self.view addSubview:self.pageController.view];
// And lay a segmented control over the top....
CGRect segmentFrame = CGRectMake(0,0,self.view.frame.size.width,50); // or whatever
self.segmentedControl = [[UISegmentedControl alloc] initWithItems:@[@"First",@"Second"]];
[self.segmentedControl addTarget:self action:@selector(segmentTapped:) forControlEvents:UIControlEventValueChanged];
self.segmentedControl.frame = segmentFrame;
[self.view addSubview:self.segmentedControl];

在你的segmentTapped:方法中,你可以触发pageViewController从firstVC交换到secondVC,反之亦然:

[self.pageController setViewControllers:@[secondVC] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];

如果您实现了UIPageViewController的委托和数据源方法,您甚至可以使用滑动手势来切换页面。