Альтернатива iOS8 MGSplitViewController

В моем приложении используется библиотека MGSplitViewController. До iOS7 он отлично работает, но для iOS8 он не работает должным образом из-за изменения поведения UIPopoverController в iOS8. Приложен скриншот запуска кода MGSplitView на iOS8:

iOS 8 MGSplitView

который показывает неправильное поведение. Он должен быть похож на следующий снимок экрана:  enter image description here

Я где-то читал, что библиотека MGSplitViewController не будет обновлена ​​для исправлений iOS8. Кто-нибудь знает, есть ли у нас другая библиотека, которая отлично работает и для iOS8, и имеет аналогичные функции, такие как MGSplitViewController.

Ответ 1

Я столкнулся с той же проблемой и нашел для нее исправление. Перейдите к MGSplitViewController.m и найдите следующие строки в -splitViewSizeForOrientation: (около строки 261):

width = height;
height = fullScreenRect.size.width;

Убедитесь, что он не запускается на iOS 8, так как iOS 8 будет обрабатывать размеры правильно. Может быть, так.

if (SYSTEM_VERSION_LESS_THAN(@"8.0") && UIInterfaceOrientationIsLandscape(theOrientation)) {
    width = height;
    height = fullScreenRect.size.width;
}

Затем найдите следующую строку в -reconfigureForMasterInPopover: (вокруг строки 614):

[_hiddenPopoverController presentPopoverFromRect:CGRectMake(-2000, -2000, 1, 1) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];

И убедитесь, что он не запускается на iOS 8. Опять же, может быть, так.

if (SYSTEM_VERSION_LESS_THAN(@"8.0")) {
    [_hiddenPopoverController presentPopoverFromRect:CGRectMake(-2000, -2000, 1, 1) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];
}

Ответ 2

Я модифицировал MGSplitViewController для решения проблем в прошлом, так что это может не решить вашу проблему полностью, так как другие исправления в моей копии контроллера могут способствовать решению.

Проблема заключается в том, что UIPopoverViewController (используется для _hiddenPopoverViewController в MGSplitViewController) вызывает [view removeFromSuperview] в masterViewController ПОСЛЕ вызывается willAnimateRotationToInterfaceOrientation. Мое текущее исправление для того, чтобы снова использовать мое приложение, - это изменить [MGSplitViewController didRotateFromInterfaceOrientation:] следующим образом:

 - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
 {
    [self.masterViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    [self.detailViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    if([[[UIDevice currentDevice] systemVersion] hasPrefix:@"8"])        {
        [self layoutSubviewsForInterfaceOrientation:[UIApplication sharedApplication].statusBarOrientation withAnimation:YES];
    }
}

К сожалению, представление masterViewController добавляется в представление MGSplitViewController ПОСЛЕ поворота, поэтому оно выглядит немного "неуклюжим", но, по крайней мере, работает.