Core Plot - 使图形全屏显示的选项 - 在呈现模态问题后添加子视图

时间:2013-03-06 01:32:35

标签: ios ipad uiview uiviewcontroller core-plot

这是一个多方面的问题,可以帮助那些使用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上未注册捏合手势,这就是为什么我使用长按)?

2 个答案:

答案 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落后于状态栏。我现在正在努力解决这个问题,但是这段代码可以为很多人节省一些时间,所以有了它。