Как скрыть главный вид в UiSplitviewcontroller в ipad - PullRequest
26 голосов
/ 23 апреля 2010

Есть ли какой-либо способ скрыть главное представление в контроллере splitview В моем приложении первый экран будет с контроллером splitview, мне не нужен разделенный вид для следующих экранов. Как я могу достичь этого

Ответы [ 9 ]

25 голосов
/ 31 октября 2011

в SDK 5.0 они добавили новый метод для UISplitViewControllerDelegate, который сделает это легко для вас. Просто внедрите его, как показано ниже, и вы не увидите главный вид:

- (BOOL)splitViewController:(UISplitViewController*)svc 
   shouldHideViewController:(UIViewController *)vc 
              inOrientation:(UIInterfaceOrientation)orientation 
{
    return YES;
}

Единственное место, где вы можете видеть это вращение - часть основного вида видна во время анимации. Я починил это простым способом, просто загрузил пустой и черный вид в мастер.

PS: не уверен, актуально ли это для i0707. Но надеюсь, что это может быть полезно для других людей, которые сейчас имеют те же проблемы.

7 голосов
/ 08 сентября 2013

То же, что и ответ от Джека, но один вкладыш. Прошло в - (void) setDetailItem: (id) newDetailItem {...}, чтобы закрыть мастер.

[[UIApplication sharedApplication] sendAction: self.navigationItem.leftBarButtonItem.action
                                           to: self.navigationItem.leftBarButtonItem.target
                                         from: nil
                                     forEvent: nil];
5 голосов
/ 14 марта 2013

BarButtonItem, предоставляемый SplitViewController, является ключом для программного скрытия Master View Controller.

Этот код ОПАСЕН! но элегантно :) 1003 *

импортировать целевую библиотеку сообщений 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 голосов
/ 22 марта 2012

Мэтт Джеммелл (Matt Gemmell) создал отличный пользовательский splitViewController под названием «MGSplitViewController». Он очень легко реализуется, комментируется и содержит множество отличных функций, которых нет в обычном splitViewController (скрыть главный вид в альбомной ориентации, изменить расположение разбиения в альбомной ориентации, позволить пользователю плавно изменять размер разделения во время выполнения, и т.д.).

Информация и демонстрация: http://mattgemmell.com/2010/08/03/mgsplitviewcontroller-updated/

Прямо к источнику: https://github.com/mattgemmell/MGSplitViewController/

3 голосов
/ 18 мая 2012

Приведенный выше код не работал для меня, однако, когда я пытался

CGRect selfFrame = self.splitViewController.view.frame; 

это сделал. Так что .... это работает для меня .. (этот код должен быть в вашем контроллере detailview)

-(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];
}
3 голосов
/ 21 января 2011

Попробуйте это:

splitVC.modalPresentationStyle = UIModalPresentationFullScreen;
[splitVC presentModalViewController:[[splitVC viewControllers] objectAtIndex:1] animated:NO];

у меня работает на 4.2!

Вот еще один удивительный трюк, который работает. ссылка на видео здесь.

0 голосов
/ 11 марта 2012

Это работает:

Прикрепите метод «скрыть» к вашей кнопке, например:

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

0 голосов
/ 13 января 2011

Не знаю, если это то, что вы ищете. Например, чтобы скрыть главный вид в ландшафтном режиме при нажатии кнопки, вы можете сделать следующее (в методе выбора)

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
0 голосов
/ 27 мая 2010

Хотя он не будет иметь хороших переходов (извините), вы можете сделать это, установив корневой вид на представление контроллера подробного вида, а затем поменяйте местами представления с UISplitView и переместите подробный вид в UISplitView. (На самом деле вы можете анимировать обмен представлениями (push / flip / и т.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...