核心图 - 使图形全屏显示的选项 - 出现模态问题后的 addSubview

Posted

技术标签:

【中文标题】核心图 - 使图形全屏显示的选项 - 出现模态问题后的 addSubview【英文标题】:Core Plot - Options on making the graph full screen - addSubview after presenting modal problems 【发布时间】:2013-03-06 01:32:35 【问题描述】:

这是一个多方面的问题,可以帮助那些使用 Core Plot 的人,或者那些在以模态方式呈现 UIViewController 时遇到问题的人,然后尝试将其作为子视图添加到较小的 UIView。

我已将核心绘图图 (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 上注册,这就是我使用长按的原因)?

【问题讨论】:

听起来 VC 并非设计为这样做(即使是这样,您也应该在以模态方式呈现之前将其作为 VC 的子级删除,然后将其添加为子级;您可能还想检查自动调整大小的掩码)。将其呈现为新的控制器。 我尝试了许多不同的方法来呈现一个新的 VC 或将 corePlotView 分配给 corePlotViewCopy 类型的实例,或者在 IB 中创建一个新的 VC,删除 corePlotView.view 并将其添加到呈现的 IB VC ,然后将其删除并重新添加...但是一旦 iPad 旋转,即使 shouldAutorotate = YES 并且supportedInterfaceOrientations 返回 UIInterfaceOrientationMaskAll,Core Plot VC 也会保留模态框... 我应该补充一点,一旦读取了 VC,autoresizingMask = UIViewAutoresizingNone 确实是我想要的,因为父 UIView 和子核心绘图 VC 的大小需要保持 500x300,但它不起作用...然而,最重要的事情似乎是当我在旋转后加载一个全新的实例时应用程序崩溃(例如,用户单击 rootViewController 中的一个单元格以查看完全不同的图形),这可能会给你们一个线索我做错了什么。 【参考方案1】:

ios 宿主视图使用捏合手势来允许绘图空间的捏合缩放。如果您希望有不同的行为,请将托管视图的 allowPinchScaling 属性设置为 NO 以删除默认手势识别器。

【讨论】:

我希望能得到@Eric Skroch 的帮助!尽管这对我的最后一个问题有帮助,但它对将具有数百个与之关联的属性的核心绘图 UIViewController 实例呈现为全屏可旋转图形的主要问题没有帮助。您将如何全屏呈现一个完全加载的核心绘图实例? Core Plot 托管视图是UIView 的子类,因此您可以像任何其他视图一样显示它。 UIView 不接收旋转消息,所以如果它添加到父视图或窗口,它不会旋转,这就是为什么将它呈现为 VC 非常有用。不过我已经取得了突破……我现在使用 ipadDelegate.splitViewController 而不是 ipadDelegate.detailViewController 来展示它,它正在工作……但是……Core Plot 是否有任何理由会覆盖 removeFromSuperview?奇怪的事情正在发生,removeFromSuperview 在关闭核心情节 VC 后没有被调用。似乎不是核心情节问题... 你觉得我的回答怎么样?您是否发现以我描述的方式呈现核心绘图有任何问题?【参考方案2】:

在“足够”使用 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,appDelegate.splitViewController.view 来自 UISplitViewController。它使用 UIPopoverController 消除了在 iOS 6 中旋转时视图层次结构和崩溃的大量问题。

注意:小心使用 iPhone 代码。我发现,如果您有一个不旋转的应用程序,除了 corePlotVC,您可能会看到导航栏出现在状态栏后面。我现在正在解决这个问题,但是这段代码可以为很多人节省一些时间,所以就这样吧。

【讨论】:

以上是关于核心图 - 使图形全屏显示的选项 - 出现模态问题后的 addSubview的主要内容,如果未能解决你的问题,请参考以下文章

统计图钻取的明细报表在非模态窗口中显示

统计图钻取的明细报表在非模态窗口中显示

如何使用标签栏以全屏模式打开 UIView?

模态 UIViewController 总是在 iPad 上全屏显示。为啥?

在 iOS 6 中呈现模态视图

在不覆盖全屏的 UIViewController 中模态显示 UIViewController