0

オーバーレイコントローラーを読み込んでいるアプリがあります(スキャンできるようにカメラを表示します)。それはiPhoneでうまく機能し、もう一度電話した後はiPadでもうまく機能します。説明させてください。

ビューコントローラをモーダルにロードするUIButtonBarItemがあります。コントローラにはいくつかのコントロールがあり、ほとんどのボタン(ペン先を使用して定義)があります。(UIButtonBarItemアクションに応答して)コントローラーをiPhoneにロードすると、コントローラーがロードされ、すべてのボタンが毎回正常に機能します。

しかし...UIPopoverControllerを使用して同じViewControllerをロードすると、最初にロードしたときにどのボタンも応答しません。そこで、コントローラーの外側のどこかで画面をタッチして、コントローラーを閉じます。次に、同じアクションボタンをもう一度タッチします。コントローラーが読み込まれると、ViewControllerのすべてのコントロールが正常に機能します。本当に奇妙です!

【ヒント】初めてロードしたとき、ボタンがいたるところに奇妙な位置に配置されていました。その後の各呼び出しでは、適切な場所にボタンが表示されていました。ペン先の「サブビューの自動サイズ変更」を無効にすることで、これを機能させることができました。これでボタンは適切な場所に配置されましたが、このポップオーバーを初めてロードしたときにボタンが応答しません。

UIButtonBarItemに応答するために使用しているコードは次のとおりです。

 -(void)launchOverlayController:(id)sender
 {
if([pickerControllerPopover isPopoverVisible])
{
    [pickerControllerPopover dismissPopoverAnimated:YES];
    pickerControllerPopover = nil;
    return;
}

// Deselect any selected cell
[self.tableView deselectRowAtIndexPath:self.tableView.indexPathForSelectedRow animated:NO];


// Working code that shows the overlay (camera on) but the overlay takes the whole screen
SRSScanVINViewController *scanVINViewController = [[SRSScanVINViewController alloc] init];
[pickerController setOverlay:scanVINViewController];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:scanVINViewController];
[navController setModalPresentationStyle:UIModalPresentationFormSheet];
[navController setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
[[UIApplication sharedApplication] setStatusBarHidden:YES];
if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
{
    pickerControllerPopover = [[UIPopoverController alloc] initWithContentViewController:pickerController];
    [pickerControllerPopover setDelegate:self];
    [pickerControllerPopover setPopoverContentSize:CGSizeMake(320.0f, 460.0f)];
    [pickerControllerPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
else
{
    [self presentViewController:pickerController animated:YES completion:nil];
}

 }

私は完全にアイデアがありません。初めて呼び出す場合を除いて、overlaycontroller内のコントロールが呼び出すたびに正常に機能する理由がわかりません。

事前に助けてくれてありがとう。

4

1 に答える 1

2

だから答えは、スーパークラスがあなたの見方をいじくり回しているということです。サブクラス化するようには設計されていないと思いますが、確実に知る方法はありません。'view ..'メソッドの1つで行うことは、self.viewを独自のビューでオーバーライドし、ビューをそのビューのサブビューにすることです。初めてそれを囲むと、ビューのフレームの寸法がゼロになります。次回それが以前のようにそれを残すとき-多分いくつかの永続的なフラグ。また、サブビューのさまざまな場所にビューを挿入します。これは奇妙に思えますが、コードがある場合は、おそらくその理由がわかります。

Soooo-問題の解決策は、ビューのサブビューをsuperView(サブクラスのビュー)に移動してから、ビューのフレームをnullフレームに設定することです。

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];  // StackOverflow says to add this TCL?

    // Set the initial scan orientation
    [self setLayoutOrientation:self.parentPicker.orientation];

    if ([self.parentPicker hasFlash])
    {
        [flashButton setEnabled:YES];
        [flashButton setStyle:UIBarButtonItemStyleBordered];
        [self.parentPicker turnFlash:NO];
    } else
    {
        [flashButton setEnabled:NO];
    }

    textCue.text = @"";
    viewHasAppeared = NO;

    // move the subviews    
    while([self.view.subviews count]) [self.view.superview addSubview:[self.view.subviews objectAtIndex:0]];
    self.view.frame = CGRectMake(0,0,0,0);
}

PS:ここでsuperView呼び出しが欠落していることに注意してください。ただし、それほど重要ではないようです(複雑なスーパークラスがどのメソッドを必要とするかわからないため、インターセプトするすべてのものを必ず送信します。

于 2012-09-12T19:05:34.127 に答える