Cửa sổ bật lên với bộ điều khiển điều hướng được nhúng không tôn trọng kích thước trên điều hướng sau


89

Tôi có một UIPopoverController lưu trữ một UINavigationController, chứa một hệ thống phân cấp nhỏ của bộ điều khiển chế độ xem.

Tôi đã làm theo các tài liệu và đối với mỗi bộ điều khiển chế độ xem, tôi đặt kích thước ngữ cảnh cửa sổ bật lên của chế độ xem như sau:

[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];

(kích thước khác nhau cho mỗi bộ điều khiển)

Điều này hoạt động như mong đợi khi tôi điều hướng về phía trước trong hệ thống phân cấp - cửa sổ bật lên tự động chuyển động các thay đổi kích thước để tương ứng với bộ điều khiển được đẩy.

Tuy nhiên, khi tôi điều hướng "Quay lại" qua ngăn xếp chế độ xem thông qua nút Quay lại của thanh điều hướng, cửa sổ bật lên không thay đổi kích thước - nó vẫn lớn bằng với chế độ xem sâu nhất đạt được. Điều này dường như bị phá vỡ đối với tôi; Tôi hy vọng cửa sổ bật lên sẽ tôn trọng các kích thước được thiết lập khi nó bật qua ngăn xếp chế độ xem.

Tui bỏ lỡ điều gì vậy?

Cảm ơn.


Bạn đang đặt kích thước cửa sổ bật lên ở đâu? Bạn có đang đặt lại nó mỗi khi bộ điều khiển chế độ xem được hiển thị (ví dụ: trong viewWillAppear:) không?
Ole Begemann

Bạn đã làm theo tài liệu nào?
Tom Hamming

Câu trả lời:


94

Được rồi, tôi đang đấu tranh với cùng một vấn đề. Không có giải pháp nào ở trên phù hợp với tôi, đó là lý do tại sao tôi quyết định thực hiện một cuộc điều tra nhỏ và tìm hiểu xem cách này hoạt động như thế nào. Đây là những gì tôi phát hiện ra: - Khi bạn đặtcontentSizeForViewInPopovertrong bộ điều khiển chế độ xem của bạn, nó sẽ không bị thay đổi bởi chính cửa sổ bật lên - mặc dù kích thước cửa sổ bật lên có thể thay đổi trong khi điều hướng đến bộ điều khiển khác. - Khi kích thước của cửa sổ bật lên sẽ thay đổi trong khi điều hướng đến bộ điều khiển khác, trong khi quay lại, kích thước của cửa sổ bật lên không khôi phục - Việc thay đổi kích thước của cửa sổ bật lên trong viewWillAppear tạo ra hoạt ảnh rất lạ (giả sử bạn popController bên trong cửa sổ bật lên) - Tôi không khuyên bạn nên dùng nó - Đối với tôi việc đặt kích thước mã cứng bên trong bộ điều khiển sẽ không hoạt động chút nào - bộ điều khiển của tôi phải đôi khi lớn đôi khi nhỏ - bộ điều khiển sẽ trình bày cho họ ý tưởng về kích thước

Một giải pháp cho tất cả những khó khăn đó như sau: Bạn phải đặt lại kích thước của currentSetSizeForPopovertrong viewDidAppear. Nhưng bạn phải cẩn thận, khi bạn đặt cùng kích thước như đã được đặt trong trường currentSetSizeForPopoverthì cửa sổ bật lên sẽ không thay đổi kích thước. Để điều này xảy ra, trước tiên bạn có thể đặt kích thước giả (sẽ khác với kích thước đã được đặt trước đó) sau đó đặt kích thước thích hợp. Giải pháp này sẽ hoạt động ngay cả khi bộ điều khiển của bạn được lồng bên trong bộ điều khiển điều hướng và cửa sổ bật lên sẽ thay đổi kích thước của nó tương ứng khi bạn điều hướng trở lại giữa các bộ điều khiển.

Bạn có thể dễ dàng tạo danh mục trên UIViewController bằng phương thức trợ giúp sau đây sẽ thực hiện thủ thuật với việc đặt kích thước:


- (void) forcePopoverSize {
    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, currentSetSizeForPopover.height - 1.0f);
    self.contentSizeForViewInPopover = fakeMomentarySize;
    self.contentSizeForViewInPopover = currentSetSizeForPopover;
}

Sau đó, chỉ cần gọi nó trong -viewDidAppearbộ điều khiển mong muốn.


1
Danh mục trên là cách duy nhất (lành mạnh) tôi có thể làm cho nó hoạt động. Cảm ơn.
RickiG

Những công việc này. Tôi cần tìm ra cách để giữ cho chế độ xem bảng không trở thành "đen" trong khu vực hợp đồng khi cửa sổ bật lên thu nhỏ, nhưng giải pháp này (cuối cùng!) Thực sự cho phép cửa sổ bật lên di chuyển đến kích thước chính xác cho mỗi cấp ngăn xếp. Cảm ơn!
Ben Zotto

2
Tôi đã gói nó trong [UIView beginAnimations: nil context: nil]; và [UIView commitAnimations]; - làm cho nó ít chói tai hơn.
Dustin

2
Đối với tôi, sử dụng self.contentSizeForViewInPopover = CGSizeZero; đã lưu một dòng và có tác dụng tương tự. Cảm ơn nhiều!
rob5408

Tôi chỉ có thể làm cho giải pháp này hoạt động nếu tôi thêm self.contentSizeForPopover = CGSizeZero; trong phương thức viewWillDisappear của VC mà tôi đã xuất hiện.
LightningStryk

18

Đây là cách tôi giải quyết nó cho iOS 7 và 8:

Trong iOS 8, iOS đang âm thầm gói chế độ xem mà bạn muốn trong cửa sổ bật lên vào PresentViewController của bộ điều khiển chế độ xem PresentViewController. Có một video WWDC 2014 giải thích những gì mới với bộ điều khiển bật lên nơi họ chạm vào điều này.

Dù sao, đối với các bộ điều khiển chế độ xem được trình bày trên ngăn xếp bộ điều khiển điều hướng mà tất cả đều muốn định kích thước riêng, các bộ điều khiển chế độ xem này cần (trong iOS 8) gọi mã này để đặt động kích thướcContentSize:

self.presentingViewController.presentedViewController.preferredContentSize = CGSizeMake(320, heightOfTable);

Thay thế heightOfTable bằng bảng được tính toán của bạn hoặc chiều cao chế độ xem.

Để tránh nhiều mã trùng lặp và để tạo giải pháp chung cho iOS 7 và iOS 8, tôi đã tạo một danh mục trên UITableViewController để thực hiện công việc này khi viewDidAppear được gọi trong tableviews của tôi:

- (void)viewDidAppear:(BOOL)animated 
{
    [super viewDidAppear:animated];
    [self setPopOverViewContentSize];
}

Category.h:

#import <UIKit/UIKit.h>

@interface UITableViewController (PreferredContentSize)

- (void) setPopOverViewContentSize;

@end

Category.m:

#import "Category.h"

@implementation UITableViewController (PreferredContentSize)

- (void) setPopOverViewContentSize
{
    [self.tableView layoutIfNeeded];
    int heightOfTable = [self.tableView contentSize].height;

    if (heightOfTable > 600)
        heightOfTable = 600;

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0)
            self.preferredContentSize=CGSizeMake(320, heightOfTable);
        else
            self.presentingViewController.presentedViewController.preferredContentSize = CGSizeMake(320, heightOfTable);
    }
}

@end

Mẹo của bạn với presentingViewControllercác công trình. Nếu tôi đặt preferredContentSizetrong viewDidLoadđó là một hành vi kỳ lạ: Duyệt lại từ một bộ điều khiển xem trong tiềm popover đến một sự thay đổi kích thước popover sai. Có vẻ như kích thước cửa sổ bật lên bằng 0 đã được đặt, nhưng kích thước là chính xác. Trong trường hợp này, cửa sổ bật lên sẽ chiếm toàn bộ chiều cao của màn hình. Bạn có biết tại sao lại như vậy không? Tôi không có hạn chế với 600 điểm được triển khai bởi vì theo kinh nghiệm của tôi, hệ điều hành không cho phép bạn chỉ định kích thước cao hơn kích thước màn hình.
thử nghiệm

Hãy thử viewDidAppear thay vì viewDidLoad để mã thực thi khi bạn điều hướng sao lưu ngăn xếp.
Wesley Filleman

Đó là cách tôi đã làm. Nhưng tôi không hiểu tại sao nó sẽ không làm việc nếu bạn thiết lập trong này viewDidLoad...
kiểm tra

1
Thật không may, đó không phải là cách Apple viết ngăn xếp chế độ xem. Các giá trị contentSize này không thực sự tồn tại khi viewController bị ẩn khỏi chế độ xem. Đó là lý do tại sao bạn phải "nhắc nhở" cửa sổ bật lên mỗi khi một chế độ xem xuất hiện ở tiền cảnh bằng cách đẩy hoặc bật lên. Khuyến nghị của tôi là gửi báo cáo lỗi cho Apple nếu bạn cho rằng cửa sổ bật lên sẽ giữ lại thông tin này.
Wesley Filleman

12

Đây là một cải tiến về câu trả lời của krasnyk .
Giải pháp của bạn rất tuyệt, nhưng nó không hoạt hình trơn tru.
Một chút cải tiến mang lại hoạt ảnh đẹp:

Xóa dòng cuối cùng trong - (void) forcePopoverSizephương pháp:

- (void) forcePopoverSize {
    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, currentSetSizeForPopover.height - 1.0f);
    self.contentSizeForViewInPopover = fakeMomentarySize;
}

Đặt [self forcePopoverSize] trong - (void)viewWillAppear:(BOOL)animatedphương thức:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self forcePopoverSize];
}

Và cuối cùng - đặt kích thước mong muốn trong - (void)viewDidAppear:(BOOL)animatedphương pháp:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    self.contentSizeForViewInPopover = currentSetSizeForPopover;
}

8

Bạn cần đặt lại kích thước nội dung trong viewWillAppear. Bằng cách gọi phương thức delagate mà bạn đặt kích thước của popovercontroller. Tôi cũng đã có cùng một vấn đề. Nhưng khi tôi thêm điều này, vấn đề đã được giải quyết.

Một điều nữa: nếu bạn đang sử dụng phiên bản beta nhỏ hơn 5. Thì các cửa sổ bật lên sẽ khó quản lý hơn. Chúng có vẻ thân thiện hơn từ phiên bản beta 5. Thật tốt khi phiên bản cuối cùng đã ra mắt. ;)

Hi vọng điêu nay co ich.


Tôi cũng ghét điều này. Nó cũng bắt tôi. Apple: Tại sao chúng ta không thể khóa cửa sổ bật lên bằng navcontroller ở một kích thước được chỉ định ?!
Jann

2
Đặt kích thước nội dung trong viewWillAppearkhông phù hợp với tôi. Đặt kích thước của cửa sổ bật lên rõ ràng đã hoạt động, nhưng đó là khu ổ chuột.
Ben Zotto

@quixoto Tôi không biết vấn đề của bạn là gì nhưng tôi vẫn sử dụng cùng một thứ và nó hoạt động hoàn hảo.
Madhup Singh Yadav

5

Trong -(void)viewDidLoadtất cả các bộ điều khiển chế độ xem bạn đang sử dụng trong bộ điều khiển điều hướng, hãy thêm:

[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];

3

Tôi đặt lại kích thước trong phương thức hoạt hình viewWillDisappear: (BOOL) của bộ điều khiển chế độ xem đang được điều hướng trở lại từ:

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    CGSize contentSize = [self contentSizeForViewInPopover];
    contentSize.height = 0.0;
    self.contentSizeForViewInPopover = contentSize;
}

Sau đó, khi chế độ xem được điều hướng trở lại xuất hiện, tôi đặt lại kích thước phù hợp:

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    CGSize contentSize;
    contentSize.width = self.contentSizeForViewInPopover.width;
    contentSize.height = [[self.fetchedResultsController fetchedObjects] count] *  self.tableView.rowHeight;
    self.contentSizeForViewInPopover = contentSize;
}

Hmm .. không cần đặt lại. Tôi đặt self.contentSizeForViewInPopover = self.view.frame.size trong tất cả viewWillAppear của tất cả bộ điều khiển chế độ xem.
alones

Tôi sẽ đặt gì cho fetchedResultsController fetchedObjects? Không thể làm cho điều này hoạt động
Jules

2

Đối với iOS 8, các hoạt động sau:

- (void) forcePopoverSize {
    CGSize currentSetSizeForPopover = self.preferredContentSize;
    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, currentSetSizeForPopover.height - 1.0f);
    self.preferredContentSize = fakeMomentarySize;
    self.navigationController.preferredContentSize = fakeMomentarySize;
    self.preferredContentSize = currentSetSizeForPopover;
    self.navigationController.preferredContentSize = currentSetSizeForPopover;
}

BTW Tôi nghĩ, điều này sẽ tương thích với các phiên bản iOS trước ...


Tôi đã gặp sự cố với một ứng dụng trong iOS8 được biên dịch với iOS7 sdk. Điều này đã làm việc, cảm ơn.
Leo núi

Để khắc phục kích thước khi thay đổi xoay, hãy gọi phương thức này trong willTransitionToTraitCollection, trong animateAlongsideTransitionkhối hoàn thành.
Geva

2
Well i worked out. Have a look.


Made a ViewController in StoryBoard. Associated with PopOverViewController class.


import UIKit

class PopOverViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        self.preferredContentSize = CGSizeMake(200, 200)

        self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: "dismiss:")

    }

    func dismiss(sender: AnyObject) {
        self.dismissViewControllerAnimated(true, completion: nil)
    }
}




See ViewController:


//
//  ViewController.swift
//  iOS8-PopOver
//
//  Created by Alvin George on 13.08.15.
//  Copyright (c) 2015 Fingent Technologies. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate
{
    func showPopover(base: UIView)
    {
        if let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("popover") as? PopOverViewController {


            let navController = UINavigationController(rootViewController: viewController)
            navController.modalPresentationStyle = .Popover

            if let pctrl = navController.popoverPresentationController {
                pctrl.delegate = self

                pctrl.sourceView = base
                pctrl.sourceRect = base.bounds

                self.presentViewController(navController, animated: true, completion: nil)
            }
        }
    }

    override func viewDidLoad(){
        super.viewDidLoad()
    }

    @IBAction func onShow(sender: UIButton)
    {
        self.showPopover(sender)
    }

    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
        return .None
    }
}


Note: The func showPopover(base: UIView) method should be placed before ViewDidLoad. Hope it helps !

1

Đối với tôi giải pháp này hoạt động. Đây là một phương pháp từ bộ điều khiển chế độ xem của tôi mở rộng UITableViewController và là bộ điều khiển gốc cho UINavigationController.

-(void)viewDidAppear:(BOOL)animated {
     [super viewDidAppear:animated];
     self.contentSizeForViewInPopover = self.tableView.bounds.size;
}

Và đừng quên đặt kích thước nội dung cho bộ điều khiển chế độ xem mà bạn sẽ đẩy vào ngăn xếp điều hướng

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
    dc = [[DetailsController alloc] initWithBookmark:[[bookmarksArray objectAtIndex:indexPath.row] retain] bookmarkIsNew:NO];
    dc.detailsDelegate = self;
    dc.contentSizeForViewInPopover = self.contentSizeForViewInPopover;
    [self.navigationController pushViewController:dc animated:YES]; 
 }

1

nếu bạn có thể tưởng tượng ra kẻ lừa đảo, tôi nghĩ điều này tốt hơn một chút:

- (void) forcePopoverSize {
    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    self.contentSizeForViewInPopover = CGSizeMake (0, 0);
    self.contentSizeForViewInPopover = currentSetSizeForPopover;
}

2
thậm chí tốt hơn sẽ được sử dụng CGSizeZerothay vì làm nó một mìnhCGSizeMake(0,0)
Julian Krol

1

Các câu trả lời được chấp nhận là không làm việc tốt với iOS 8. Những gì tôi đã làm được tạo lớp con riêng của tôi về UINavigationControllerđể sử dụng trong popover đó và ghi đè phương pháp preferredContentSizetheo cách này:

- (CGSize)preferredContentSize {
    return [[self.viewControllers lastObject] preferredContentSize];
}

Hơn nữa, thay vì gọi forcePopoverSize(phương thức được triển khai bởi @krasnyk) trong viewDidAppeartôi đã quyết định đặt viewController (hiển thị cửa sổ bật lên) làm đại biểu cho điều hướng đã đề cập trước đó (trong cửa sổ bật lên) và thực hiện (phương thức lực nào) trong:

-(void)navigationController:(UINavigationController *)navigationController
      didShowViewController:(UIViewController *)viewController 
                   animated:(BOOL)animated  

phương thức ủy quyền cho một được thông qua viewController. Một điều quan trọng, thực hiện forcePopoverSizetrong một UINavigationControllerDelegatephương pháp là tốt nếu bạn không cần hoạt ảnh đó trở nên mượt mà nếu vậy thì hãy để nguyên viewDidAppear.


tại sao lại bỏ phiếu? có thể một số thông tin phản hồi khác nhau hơn là chỉ bất đồng :)
Julian Krol

xin chào @ JulianKról, bạn có thể xem qua stackoverflow.com/questions/28112617/… này không , tôi cũng gặp sự cố tương tự.
Ranjit

Cảm ơn, điều này đã giúp tôi. Có thể muốn nói rõ ở đầu nhận xét của bạn rằng vấn đề là bạn cần cập nhật điều hướngController favouriteContentSize cũng như VisidContentSize. Vì vậy, thiết lập cả hai đều hoạt động trực tiếp.
Michael Kernahan,

0

Tôi đã gặp phải vấn đề tương tự, nhưng bạn không muốn đặt kích thước nội dung trong phương thức viewWillAppear hoặc viewWillDisappear.

AirPrintController *airPrintController = [[AirPrintController alloc] initWithNibName:@"AirPrintController" bundle:nil];
airPrintController.view.frame = [self.view frame];
airPrintController.contentSizeForViewInPopover = self.contentSizeForViewInPopover;
[self.navigationController pushViewController:airPrintController animated:YES];
[airPrintController release];

đặt thuộc tính contentSizeForViewInPopover cho bộ điều khiển đó trước khi đẩy bộ điều khiển đó vào điều hướngController


0

Tôi đã gặp may khi đưa những thứ sau vào viewdidappear:

[self.popoverController setPopoverContentSize:self.contentSizeForViewInPopover animated:NO];

Mặc dù điều này có thể không tạo hoạt ảnh tốt trong trường hợp bạn đang đẩy / bật các cửa sổ bật lên có kích thước khác nhau. Nhưng trong trường hợp của tôi, hoạt động hoàn hảo!


0

Tất cả những gì bạn phải làm là:

-Trong phương thức viewWillAppear của popOvers contentView, hãy thêm đoạn mã được cung cấp bên dưới. Bạn sẽ phải chỉ định kích thước của popOver lần đầu tiên khi nó được tải.

CGSize size = CGSizeMake(width,height);
self.contentSizeForViewInPopover = size;

0

Tôi đã gặp sự cố này với bộ điều khiển bật lên có popoverContentSize = CGSizeMake (320, 600) khi bắt đầu, nhưng sẽ lớn hơn khi điều hướng qua ContentViewController của nó (một UINavigationController).

Bộ điều khiển nav chỉ đẩy và bật UITableViewControllers tùy chỉnh, vì vậy trong viewDidLoad của lớp điều khiển chế độ xem bảng tùy chỉnh của tôi, tôi đã đặt self.contentSizeForViewInPopover = CGSizeMake (320, 556)

44 pixel ít hơn là tài khoản cho thanh điều hướng của bộ điều khiển Nav và bây giờ tôi không gặp bất kỳ vấn đề nào nữa.


0

Đặt cái này vào tất cả các bộ điều khiển chế độ xem mà bạn đang đẩy vào bên trong cửa sổ bật lên

CGSize currentSetSizeForPopover = CGSizeMake(260, 390);
CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f,
                                      currentSetSizeForPopover.height - 1.0f);
self.contentSizeForViewInPopover = fakeMomentarySize;
self.contentSizeForViewInPopover = currentSetSizeForPopover;

trong viewwillAppear method.and currentSetSizeForPopover đặt kích thước mong muốn của bạn.
alok

0

Đối mặt với vấn đề tương tự và đã khắc phục nó bằng cách đặt kích thước chế độ xem nội dung thành bộ điều khiển điều hướng và bộ điều khiển chế độ xem trước khi thiết bị của UIPopoverController được đặt.

     CGSize size = CGSizeMake(320.0, _options.count * 44.0);
    [self setContentSizeForViewInPopover:size];
    [self.view setFrame:CGRectMake(0.0, 0.0, size.width, size.height)];
    [navi setContentSizeForViewInPopover:size];

    _popoverController = [[UIPopoverController alloc] initWithContentViewController:navi];

0

Tôi chỉ muốn đưa ra một giải pháp khác, vì không có giải pháp nào trong số này phù hợp với tôi ...

Tôi thực sự đang sử dụng nó với cái này https://github.com/nicolaschengdev/WYPopoverController

Khi bạn lần đầu tiên gọi cửa sổ bật lên của mình, hãy sử dụng cái này.

if ([sortTVC respondsToSelector:@selector(setPreferredContentSize:)]) {
   sortTVC.preferredContentSize = CGSizeMake(popoverContentSortWidth,
        popoverContentSortHeight);
}
else 
{
   sortTVC.contentSizeForViewInPopover = CGSizeMake(popoverContentSortWidth, 
        popoverContentSortHeight);
}

Sau đó, trong cửa sổ bật lên đó sử dụng cái này.

-(void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:YES];

  if ([self respondsToSelector:@selector(setPreferredContentSize:)]) {
    self.preferredContentSize = CGSizeMake(popoverContentMainWidth, 
        popoverContentMainheight);
  }
  else 
  {
    self.contentSizeForViewInPopover = CGSizeMake(popoverContentMainWidth, 
        popoverContentMainheight);
  }
}

-(void)viewDidDisappear:(BOOL)animated {
 [super viewDidDisappear:YES];

self.contentSizeForViewInPopover = CGSizeZero;

}

Sau đó lặp lại cho các chế độ xem con ...


0

Đây là cách chính xác trong iOS7 để thực hiện việc này, Đặt kích thước nội dung ưa thích trong viewDidLoad trong mỗi bộ điều khiển chế độ xem trong ngăn xếp điều hướng (chỉ thực hiện một lần). Sau đó, trong viewWillAppear, nhận tham chiếu đến bộ điều khiển bật lên và cập nhật contentSize ở đó.

-(void)viewDidLoad:(BOOL)animated
{
    ...

    self.popoverSize = CGSizeMake(420, height);
    [self setPreferredContentSize:self.popoverSize];
}

-(void)viewWillAppear:(BOOL)animated
{
    ...

    UIPopoverController *popoverControllerReference = ***GET REFERENCE TO IT FROM SOMEWHERE***;
    [popoverControllerReference setPopoverContentSize:self.popoverSize];
}

0

Giải pháp @krasnyk hoạt động tốt trong các phiên bản iOS trước nhưng không hoạt động trong iOS8. Giải pháp sau đây đã làm việc cho tôi.

    - (void) forcePopoverSize {
        CGSize currentSetSizeForPopover = self.preferredContentSize;
       //Yes, there are coupling. We need to access the popovercontroller. In my case, the popover controller is a weak property in the app's rootVC.
        id mainVC = [MyAppDelegate appDelegate].myRootVC;
        if ([mainVC valueForKey:@"_myPopoverController"]) {
            UIPopoverController *popover = [mainVC valueForKey:@"_myPopoverController"];
            [popover setPopoverContentSize:currentSetSizeForPopover animated:YES];
        }
    }

Nó không phải là giải pháp tốt nhất, nhưng nó hoạt động.

UIPopoverPresentationController mới cũng có vấn đề thay đổi kích thước :(.


1
có lẽ thay vì đạt điều khiển xem từ tài sản appdelegate xem xét giải pháp của tôi (có vẻ là sạch)
Julian Krol

Có, đây là giải pháp nhanh nhất mà không cần sửa đổi bất kỳ cơ sở mã hiện có nào của tôi. Btw VL thử giải pháp ur
Clement Prem

0

Bạn cần đặt thuộc preferredContentSizetính của NavigationController trong viewWillAppear:

-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.navigationController.preferredContentSize = CGSizeMake(320, 500);}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.