是否有任何方法可以通过编程方式隐藏splitviewcontroller中的主视图。在我的应用程序中,第一个屏幕将是一个splitviewcontroller,我不需要任何拆分视图用于下一个屏幕。我怎么能实现这个
答案 0 :(得分:25)
- (BOOL)splitViewController:(UISplitViewController*)svc
shouldHideViewController:(UIViewController *)vc
inOrientation:(UIInterfaceOrientation)orientation
{
return YES;
}
唯一可以看到它的地方是旋转 - 主视图的一部分在动画期间可见。我已经用简单的方法解决了这个问题,只是在master中加载了空白和黑色视图。
PS:不确定这是否适用于i0707。但希望这对现在有同样问题的其他人有用。
答案 1 :(得分:7)
与杰克的答案相同但只有一个班轮。过去 - (void)setDetailItem:(id)newDetailItem {...}解散主人。
[[UIApplication sharedApplication] sendAction: self.navigationItem.leftBarButtonItem.action
to: self.navigationItem.leftBarButtonItem.target
from: nil
forEvent: nil];
答案 2 :(得分:5)
Matt Gemmell创建了一个名为“MGSplitViewController”的优秀自定义splitViewController。它非常容易实现,评论很多,并且包含许多普通splitViewController所没有的优秀功能(在横向视图中隐藏主视图,在横向视图中更改分割的位置,允许用户在运行时流畅地更改分割的大小,等)。
信息和演示:http://mattgemmell.com/2010/08/03/mgsplitviewcontroller-updated/
答案 3 :(得分:5)
SplitViewController提供的BarButtonItem是以编程方式隐藏主视图控制器的关键。
这段代码很危险!但优雅:)
导入目标c消息库
#import <objc/message.h>
接下来,获取SplitViewController提供的UIBarButtonItem句柄
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem
forPopoverController:(UIPopoverController *)popoverController
{
barButtonItem.title = @"Master";
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
//Obtain handle to BarButtonItem
[self setMasterButtonItem:barButtonItem];
}
然后当事件被触发时应触发主视图控制器的自动解除,即
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
你可以这样做
objc_msgSend(self.masterButtonItem.target, self.masterButtonItem.action);
答案 4 :(得分:3)
试试这个:
splitVC.modalPresentationStyle = UIModalPresentationFullScreen;
[splitVC presentModalViewController:[[splitVC viewControllers] objectAtIndex:1] animated:NO];
为我工作4.2!
这是另一个很棒的技巧。 video link就在这里。
答案 5 :(得分:3)
但是,当我尝试
时,上面的代码对我没有用CGRect selfFrame = self.splitViewController.view.frame;
确实如此。所以....这对我有用..(这段代码应该在你的detailviewcontroller中)
-(void)hideMaster {
UIViewController *masterController = GetAppDelegate().masterController;
CGRect selfFrame = self.splitViewController.view.frame;
CGFloat aWidth = masterController.view.frame.size.width;
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.30f];
if(orientation == UIDeviceOrientationLandscapeLeft)
{
selfFrame.size.height += aWidth;
selfFrame.origin.y -= aWidth;
}
else if(orientation == UIDeviceOrientationLandscapeRight)
{
selfFrame.size.height += aWidth;
}
[self.splitViewController.view setFrame:selfFrame];
[UIView commitAnimations];
}
要允许轮换,则需要:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation duration:(NSTimeInterval)duration
{
[super willAnimateRotationToInterfaceOrientation:interfaceOrientation duration:duration]; // not sure if needed
//By the time this method is called the bounds of the view have been changed
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
if (UIInterfaceOrientationIsPortrait(interfaceOrientation)) {
if (masterIsHidden) {
[self showMaster];
}
} else {
if (self.editing) {
[self hideMaster];
}
}
[UIView setAnimationDuration:duration];
[UIView commitAnimations];
}
答案 6 :(得分:0)
虽然它没有很好的转换(抱歉),但您可以通过将根视图设置为详细视图控制器的视图,然后使用UISplitView交换视图并将详细视图移动到UISplitView来完成此操作。 (实际上你可能能够为视图交换设置动画(推/翻/等),但是在视图更改动画期间更改任何内容是一个坏主意,并且将详细视图移动到UISplitView内部可能符合条件。)
答案 7 :(得分:0)
不知道这是否是您正在寻找的。例如,要在单击按钮时以横向模式隐藏主视图,您可以执行以下操作(在选择器方法中)
UIViewController *master = [splitViewController.viewControllers objectAtIndex:0];
UIViewController *detail = [splitViewController.viewControllers objectAtIndex:1];
[master.view setFrame:CGRectMake(0, 0, 0, 0)];
detail.view.frame = splitViewController.view.bounds; // or use master and detail length
答案 8 :(得分:0)
这有效:
将“隐藏”方法附加到您的按钮,例如:
UIBarButtonItem *hideButton = [[UIBarButtonItem alloc] initWithTitle:@"hide"
style: UIBarButtonItemStylePlain
target: self
action: @selector(hide:)
];
[self.mainView.navigationItem setLeftBarButtonItem:hideButton];
在此代码中,“self.mainView”是splitview第二个视图中导航控制器中的视图控制器 - 仅作为参考。
隐藏方法看起来像这样。
-(void)hide:(id)sender
{
UIViewController *masterController = [self.viewControllers objectAtIndex:0];
CGRect selfFrame = self.view.frame;
CGFloat aWidth = masterController.view.frame.size.width;
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.30f];
if(orientation == UIDeviceOrientationLandscapeLeft)
{
selfFrame.size.height += aWidth;
selfFrame.origin.y -= aWidth;
}
else if(orientation == UIDeviceOrientationLandscapeRight)
{
selfFrame.size.height += aWidth;
}
[self.view setFrame:selfFrame];
[UIView commitAnimations];
}
这是一个起点,显然需要做更多的逻辑来处理轮换,再次显示它等等......
我希望这会有所帮助。
使用iOS5和Xcode 4.3进行测试