这是一个多方面的问题,可以帮助那些使用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”时,会从corePlotView向dismissModalViewController发送一条消息...
-(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中删除这个“模态”?
是否有更简单的方法将Core Plot图表设置为全屏并使用手势再次返回(似乎在corePlotView上未注册捏合手势,这就是为什么我使用长按)?
答案 0 :(得分:1)
iOS主机视图使用捏合手势来缩放绘图空间。如果您想要有不同的行为,请将托管视图的allowPinchScaling
属性设置为NO
,以删除默认的手势识别器。
答案 1 :(得分:0)
在使用presentViewController“足够”之后,我决定将Core Plot图形全屏显示的最佳外观和最安全的方法是:
<强> 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,来自UISplitViewController的appDelegate.splitViewController.view。它正在使用UIPopoverController,在iOS 6中旋转时消除了大量的视图层次结构和崩溃问题。
注意:小心iPhone代码。我发现如果你有一个不旋转的应用程序,除了corePlotVC,你可能会看到navBars落后于状态栏。我现在正在努力解决这个问题,但是这段代码可以为很多人节省一些时间,所以有了它。