簡體   English   中英

iOS8:不顯示UIPopoverController,但iOS7正常

[英]iOS8: Not show UIPopoverController but iOS7 is OK

自iOS8起,蘋果似乎改變了UIPopoverController的態度。

請查看下面的代碼。 我想在addSubview之后顯示UIPopoverController。 iOS6和iOS7沒問題,但不會在iOS8上顯示。

您能提出任何可能的原因嗎? 任何幫助將不勝感激。

- (IBAction)tapButton:(id)sender {

    SampleView *sampleView = [[SampleView alloc] initWithFrame:CGRectMake(0.0f, 0.0f,
                                                                          [UIScreen mainScreen].bounds.size.width,
                                                                          [UIScreen mainScreen].bounds.size.height)];
    sampleView.backgroundColor = [UIColor blueColor];
    sampleView.alpha = 0.5;

    sampleView.label = [[UILabel alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width / 2,
                                                                 [UIScreen mainScreen].bounds.size.height / 2,
                                                                 200.0f, 20.0f)];
    sampleView.label.text = @"SAMPLE TEXT";
    sampleView.label.textColor = [UIColor redColor];
    [sampleView addSubview:sampleView.label];

    [self.view.window addSubview:sampleView];

    if (!self.popover) {
        UIViewController *vc = [[UIViewController alloc] init];
        vc.view.backgroundColor = [UIColor redColor];
        vc.preferredContentSize = CGSizeMake(200, 300);
        self.popover = [[UIPopoverController alloc] initWithContentViewController:vc];
    }

    // On iOS7 is OK but not show on iOS8
    [self.popover presentPopoverFromRect:CGRectMake(200, 100, 0, 0)
                                  inView:sampleView.label
                permittedArrowDirections:UIPopoverArrowDirectionUp
                                animated:YES];
}

在此處輸入圖片說明

在此處輸入圖片說明

更新1:

我跟着這個問題的答案。

在iOS8中:UIPopoverController presentPopoverFromRect不再適用於keyWindow

這是更新的代碼。

[self.popover presentPopoverFromRect:CGRectMake(200, 100, 0, 0)
                                  inView:self.view
                permittedArrowDirections:UIPopoverArrowDirectionUp
                                animated:YES];

在此處輸入圖片說明

據我檢查,keyWindos和self.view.window似乎相同。

NSLog(@"%@", [UIApplication sharedApplication].keyWindow);
NSLog(@"%@", self.view.window);

但是,對於我的情況,這不是完整的解決方案。 我想控制添加的子視圖上的視圖。

更新2:

我想我需要在iOS8上使用UIPopoverPresentationController。

- (IBAction)tapButton:(id)sender {

    // View
    SampleView *sampleView = [[SampleView alloc] initWithFrame:CGRectMake(0.0f, 0.0f,
                                                                          [UIScreen mainScreen].bounds.size.width,
                                                                          [UIScreen mainScreen].bounds.size.height)];
    sampleView.backgroundColor = [UIColor blueColor];
    sampleView.alpha = 0.5;

    // Label
    sampleView.label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200.0f, 20.0f)];
    sampleView.label.text = @"SAMPLE TEXT";
    sampleView.label.textColor = [UIColor redColor];
    [sampleView addSubview:sampleView.label];

    // View Controller
    UIViewController *viewController = [[UIViewController alloc] init];
    viewController.modalPresentationStyle = UIModalPresentationPopover;
    viewController.view = sampleView;

    // UIPopoverPresentationController
    UIPopoverPresentationController *presentationController = viewController.popoverPresentationController;
    [presentationController setDelegate:self];
    presentationController.permittedArrowDirections = 0;
    presentationController.sourceView = [[UIApplication sharedApplication] keyWindow];
    presentationController.sourceRect = [[UIApplication sharedApplication] keyWindow].bounds;

    [viewController setPreferredContentSize:CGSizeMake(320, 480)];
    [self presentViewController:viewController animated:YES completion:nil];

    if (!self.popover) {
        UIViewController *vc = [[UIViewController alloc] init];
        vc.view.backgroundColor = [UIColor redColor];
        vc.preferredContentSize = CGSizeMake(200, 300);
        vc.modalPresentationStyle = UIModalPresentationPopover;
        self.popover = [[UIPopoverController alloc] initWithContentViewController:vc];
        self.popover.delegate = self;
    }

    [self.popover presentPopoverFromRect:CGRectMake(300, 300, 0, 0)
                                  inView:viewController.view
                permittedArrowDirections:UIPopoverArrowDirectionUp
                                animated:YES];
}

在此處輸入圖片說明

Update3我使用dispatch_async,但是沒有用。 有人說在這種情況下dispatch_async是有效的。 dispatch_async是非常簡單的解決方案。 我更喜歡使用它。 如果您可以使用dispatch_async解決我的問題,不勝感激您可以附加代碼。

- (IBAction)tapButton:(id)sender {

    SampleView *sampleView = [[SampleView alloc] initWithFrame:CGRectMake(0.0f, 0.0f,
                                                                          [UIScreen mainScreen].bounds.size.width,
                                                                          [UIScreen mainScreen].bounds.size.height)];
    sampleView.backgroundColor = [UIColor blueColor];
    sampleView.alpha = 0.5;

    sampleView.label = [[UILabel alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width / 2,
                                                                 [UIScreen mainScreen].bounds.size.height / 2,
                                                                 200.0f, 20.0f)];
    sampleView.label.text = @"SAMPLE TEXT";
    sampleView.label.textColor = [UIColor redColor];
    [sampleView addSubview:sampleView.label];

    [self.view.window addSubview:sampleView];

    if (!self.popover) {
        UIViewController *vc = [[UIViewController alloc] init];
        vc.view.backgroundColor = [UIColor redColor];
        vc.preferredContentSize = CGSizeMake(200, 300);
        self.popover = [[UIPopoverController alloc] initWithContentViewController:vc];
    }

    // I tried this but not worked.
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.popover presentPopoverFromRect:CGRectMake(200, 100, 0, 0)
                                      inView:sampleView.label
                    permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
    });
}

嘗試對iOS 8執行以下操作

dispatch_async( dispatch_get_main_queue(), ^{
    [self.popover presentPopoverFromRect:CGRectMake(200, 100, 0, 0) inView:sampleView.label permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
});

編輯

這是我的代碼,無論是否使用dispatch_async,它都可以工作。

self.popover = [[UIPopoverController alloc] initWithContentViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"second"]];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.popover presentPopoverFromRect:self.button.frame inView:self.button permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM