Существует ли какой-либо способ скрыть главный вид в программном обеспечении splitviewcontroller. В моем приложении первый экран будет иметь splitviewcontroller, мне не нужен какой-либо раздвоенный вид для следующих экранов. Как я могу достичь этого
Как скрыть главный вид в UiSplitviewcontroller в ipad
Ответ 1
Matt Gemmell создал отличный пользовательский элемент splitViewController под названием "MGSplitViewController". Он очень легко реализуется, сильно комментируется и содержит множество отличных функций, не найденных с обычным splitViewController (скрыть главный вид на ландшафтном представлении, изменить размещение разделенного в альбомном виде, разрешить пользователю изменять размер раскола во время работы, и т.д.).
Информация и демонстрация: http://mattgemmell.com/2010/08/03/mgsplitviewcontroller-updated/
Прямо к источнику: https://github.com/mattgemmell/MGSplitViewController/
Ответ 2
в SDK 5.0 они добавили новый метод для UISplitViewControllerDelegate, который сделает это легко для вас. Просто реализуйте его, как показано ниже, и вы не увидите основной вид:
- (BOOL)splitViewController:(UISplitViewController*)svc
shouldHideViewController:(UIViewController *)vc
inOrientation:(UIInterfaceOrientation)orientation
{
return YES;
}
Единственное место, где вы можете видеть, это вращение - часть основного вида видна во время анимации. Я исправил это простым способом, просто загрузил пустой и черный вид в мастер.
PS: не уверен, что это актуально для i0707. Но надеюсь, что это может быть полезно для других людей, которые теперь имеют те же проблемы.
Ответ 3
То же, что и ответ от Джека, но один лайнер. Прошлое - (void) setDetailItem: (id) newDetailItem {...}, чтобы отменить мастер.
[[UIApplication sharedApplication] sendAction: self.navigationItem.leftBarButtonItem.action
to: self.navigationItem.leftBarButtonItem.target
from: nil
forEvent: nil];
Ответ 4
Функция BarButtonItem, предоставляемая SplitViewController, является ключом к программному скрытию контроллера главного представления.
Этот код ОПАСНО! но элегантный:)
импортировать библиотеку сообщений цели c
#import <objc/message.h>
Далее, возьмите дескриптор UIBarButtonItem, предоставленный SplitViewController
- (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);
Ответ 5
Попробуйте следующее:
splitVC.modalPresentationStyle = UIModalPresentationFullScreen;
[splitVC presentModalViewController:[[splitVC viewControllers] objectAtIndex:1] animated:NO];
Работает на 4.2 для меня!
Вот еще один потрясающий трюк. ссылка на видео здесь.
Ответ 6
Приведенный выше код не работал у меня, однако, когда я пробовал
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];
}
Ответ 7
В то время как у него не будет приятных переходов (извините), вы можете сделать это, установив представление корня в представление контроллера подробного представления, а затем обменяйтесь представлениями с помощью UISplitView и переместите представление детали в UISplitView. (На самом деле вы можете анимировать swap представления (push/flip/etc.), Но это плохая идея изменить что-либо во время анимации смены вида, и перемещение подробного представления внутри UISplitView может быть квалифицировано.)
Ответ 8
Не знаю, это то, что вы ищете. Например, чтобы скрыть главный вид в ландшафтном режиме при нажатии кнопки, вы можете сделать следующее (в методе выбора)
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
Ответ 9
Это работает:
Прикрепите метод "скрыть" к вашей кнопке, например:
UIBarButtonItem *hideButton = [[UIBarButtonItem alloc] initWithTitle:@"hide"
style: UIBarButtonItemStylePlain
target: self
action: @selector(hide:)
];
[self.mainView.navigationItem setLeftBarButtonItem:hideButton];
В этом коде "self.mainView" является контроллером представления в контроллере навигации во втором представлении splitview - как ссылка.
Метод hide выглядит так.
-(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