0

これは多面的な質問であり、Core Plotを使用している人、またはUIViewControllerをモーダルに表示するのに問題があり、それをサブビューとして小さなUIViewに追加しようとしている人に役立ちます。

500x350 UIView(myView)にCore Plotグラフ(corePlotView)を追加し、長押しを使用して「モーダル」で正常に表示しています。

-(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];
}

[corePlotViewloadOriginalGraph]と[corePlotViewloadFullGraph]は、すべてのテキストサイズとパディングタイプのプロパティを元の設定からフルスクリーン設定に切り替えるメソッドを呼び出しています...問題ありません。

問題は、グラフのサイズが500x350に正常に縮小された場合、iPadが回転するとすぐに、corePlotViewがモーダルビューのフレームにサイズ変更されることです。明らかに、これは私が望んでいることではありません。500x350を何らかの方法で維持または制約する必要があるためです。

モーダルを提示してからaddSubviewを使用するときに、誰かがこの問題に遭遇しましたか?このメソッドは、ARCがビューを削除する前に、ビューをスタック上でライブに保ちますが、モーダルの一部の属性は永続的であるように見えます。UIViewControllerからこの「モダリティ」を取り除く方法はありますか?

ジェスチャを使用してコアプロットグラフを全画面に設定して元に戻す簡単な方法はありますか(ピンチジェスチャがcorePlotViewに登録されていないようです。そのため、長押しを使用しています)。

4

2 に答える 2

1

iOSホスティングビューは、ピンチジェスチャを使用して、プロットスペースのピンチスケーリングを可能にします。別の動作が必要な場合allowPinchScalingは、ホスティングビューのプロパティをに設定NOして、デフォルトのジェスチャレコグナイザーを削除します。

于 2013-03-07T02:24:44.607 に答える
0

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の場合、UISplitViewControllerからappDelegate.splitViewController.viewに注意してください。それは、iOS 6で回転するときに、ビュー階層とクラッシュに関する多くの問題を排除するUIPopoverControllerを使用していました。

注:iPhoneコードに注意してください。corePlotVCを除いて、回転しないアプリがある場合、ステータスバーの後ろにnavBarが発生する可能性があることがわかりました。私は今それを処理していますが、このコードは多くの人をそのまま節約できるので、それを試してみてください。

于 2013-03-19T16:26:51.517 に答える