Core Plot - Опции для создания графика в полноэкранном режиме - addSubview после представления модальных проблем
Это многогранный вопрос, который может помочь тем, кто использует Core Plot, или тем, у кого возникают проблемы с модальным представлением UIViewController, а затем попыткой добавить его в качестве подпредставления к меньшему UIView.
У меня есть график Core Plot (corePlotView), добавленный к 500x350 UIView (myView), и я успешно представляю его "модально" с помощью длинного нажатия:
-(void)press:(UILongPressGestureRecognizer*)gesture {
if(gesture.state == UIGestureRecognizerStateEnded)
{
corePlotView.closeBtn.hidden = NO;
corePlotView.iPadCV = self;
[corePlotView loadFullGraph];
[ipadDelegate.detailViewController presentViewController:corePlotView animated:NO completion:nil];
}
}
Это простой способ отображения полноэкранного графика и изменения его размера при повороте iPad (очень важно). Когда пользователь нажимает "closeBtn", сообщение отправляется dismissModalViewController из corePlotView...
-(IBAction)close:(id)sender {
self.closeBtn.hidden = YES;
ipadDelegate = (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];
[ipadDelegate.detailViewController dismissViewControllerAnimated:NO completion:nil];
[iPadCV reloadOriginalGraph];
}
... затем reloadOriginalGraph поддерживает все графики и данные, которые были у пользователя до представления (важно), а затем изменяет размер представления обратно в его исходный кадр следующим образом:
-(void)reloadOriginalGraph {
[corePlotView.view setFrame:myView.bounds];
[corePlotView loadOriginalGraph];
[myView addSubview:corePlotView.view];
[myView sendSubviewToBack:corePlotView.view];
}
[CorePlotView loadOriginalGraph] и [corePlotView loadFullGraph] являются вызывающими методами, которые переключают все размеры текста и свойства типа заполнения из оригинальных настроек в полноэкранные настройки... не проблема.
Проблема заключается в том, что когда размер графа успешно уменьшен до 500x350, как только iPad поворачивается, corePlotView изменяет размер обратно до фрейма модального вида. Очевидно, что это не то, что я хочу, так как 500x350 необходимо поддерживать или ограничивать каким-либо образом.
Кто-нибудь сталкивался с этой проблемой, когда представлял модал, а затем использовал addSubview? Этот метод сохраняет представление в стеке до того, как ARC сможет его удалить, но кажется, что некоторые атрибуты модального режима остаются постоянными. Есть ли способы убрать эту "модальность" из UIViewController?
Существует ли более простой способ перевести график основной диаграммы в полноэкранный режим и обратно с помощью жестов (кажется, что жесты сжимания не регистрируются в corePlotView, поэтому я использую долгое нажатие)?
2 ответа
После того, как "достаточно" поработал с presentViewController, я решил, что самый лучший и безопасный способ сделать график основного графика полноэкранным:
IPhone
-(void)press:(UILongPressGestureRecognizer*)gesture {
if(gesture.state == UIGestureRecognizerStateEnded)
{
[corePlotVC removeFromParentViewController];
vc = [[UINavigationController alloc] initWithRootViewController:corePlotVC];
vc.navigationBar.hidden = YES;
corePlotVC.closeBtn.hidden = NO;
corePlotVC.view.autoresizingMask = UIInterfaceOrientationMaskAll;
[corePlotVC loadFullGraph];
[details presentViewController:vc animated:NO completion:nil];
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
}
}
IPAD
-(void)press:(UILongPressGestureRecognizer*)gesture {
if(gesture.state == UIGestureRecognizerStateEnded)
{
[corePlotVC removeFromParentViewController];
popover = [[UIPopoverController alloc] initWithContentViewController:corePlotVC];
[popover setPopoverContentSize:CGSizeMake(1024, 1024)];
popover.passthroughViews=[NSArray arrayWithObject:appDelegate.splitViewController.view];
[popover presentPopoverFromRect:CGRectZero
inView:appDelegate.splitViewController.view
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
corePlotVC.closeBtn.hidden = NO;
[corePlotVC loadFullGraph];
}
}
В этом случае, чтобы избежать конфликтных ситуаций, я использовал длинный жест нажатия. Обратите внимание, что для iPad appDelegate.splitViewController.view из UISplitViewController. Он использовал UIPopoverController, который устранил массу проблем с иерархиями представлений и вылетами при повороте в iOS 6.
ПРИМЕЧАНИЕ. Осторожнее с кодом iPhone. Я обнаружил, что если у вас есть приложение, которое не вращается, кроме corePlotVC, вы можете увидеть случаи появления navBars за строкой состояния. Сейчас я работаю над этим, но этот код может сэкономить многим людям какое-то время, поэтому имейте это в виду.
В представлении хостинга iOS используется масштабирующий жест, чтобы обеспечить масштабирование области печати. Если вы предпочитаете другое поведение, установите allowPinchScaling
свойство хостинга NO
удалить распознаватель жестов по умолчанию.