我正在尝试创建一个包含容器的View。在该视图上,我想在表视图和地图视图之间切换。 Yelp的应用程序完全符合我的目标。
我遇到的问题是在视图之间切换。以下是我的故事板的设置方式:
我创建了一个用于在表格和地图之间切换的控制器。问题是如果我使用模态或自定义segue,它将接管整个视图。
我已经尝试将它们嵌入到导航控制器中(我认为),但是一旦用户点击控制器中的某些内容,我需要将它们从导航控制器中取出并返回主导航
答案 0 :(得分:3)
执行此操作的一种方法是使SwitchViewController成为自定义容器控制器,并将表视图或地图视图添加为其子视图。以下是我之前使用的示例,它与您的故事板具有相同的设置(我的ContainerViewController是您的SwitchViewController,我的控制器带有标识符" InitialVC"以及" substituteVC&#34 ;将是您的表视图和地图视图)。 这是我在ContainerViewController中的代码,
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
UIViewController *initial = [self.storyboard instantiateViewControllerWithIdentifier:@"InitialVC"];
[self addChildViewController:initial];
[self.view addSubview:initial.view];
self.currentController = initial;
[self constrainViewEqual:self.currentController];
}
-(void)switchToNewView {
UIViewController *sub = [self.storyboard instantiateViewControllerWithIdentifier:@"SubstituteVC"];
[self addChildViewController:sub];
sub.view.frame = self.view.bounds;
[self moveToNewController:sub];
}
-(void)moveToNewController:(UIViewController *) newController {
[self.currentController willMoveToParentViewController:nil];
[self transitionFromViewController:self.currentController toViewController:newController duration:.6 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{}
completion:^(BOOL finished) {
[self.currentController removeFromParentViewController];
[newController didMoveToParentViewController:self];
self.currentController = newController;
[self constrainViewEqual:self.currentController];
}];
}
constrainViewEqual是一种类别方法,用于设置视图的布局约束。它看起来像这样,
-(void)constrainViewEqual:(UIViewController *) vc {
[vc.view setTranslatesAutoresizingMaskIntoConstraints:NO];
NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeCenterX relatedBy:0 toItem:vc.view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeCenterY relatedBy:0 toItem:vc.view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];
NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeWidth relatedBy:0 toItem:vc.view attribute:NSLayoutAttributeWidth multiplier:1 constant:0];
NSLayoutConstraint *con4 = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeHeight relatedBy:0 toItem:vc.view attribute:NSLayoutAttributeHeight multiplier:1 constant:0];
NSArray *constraints = @[con1,con2,con3,con4];
[self.view addConstraints:constraints];
}
我从初始视图控制器(你标记为ViewController的按钮)中的按钮调用switchToNewView,如下所示,
-(IBAction)doStuff:(id)sender {
ContainerController *cc = (ContainerController *)self.childViewControllers[0];
[cc switchToNewView];
}
答案 1 :(得分:0)
您可以将新的详细视图控制器添加到情节提要板,并配置它们的大小以匹配界面构建器中的容器
然后
从您的交换机视图控制器中查看,新视图控制器应该只占用该视图的大小。
我希望这有帮助,
干杯,
吉姆