webentwicklung-frage-antwort-db.com.de

Wie kann man die contentSize von UIPopoverController dynamisch ändern?

Ich habe eine UIViewController, die eine UITableView..__ enthält. Diese UIViewController wird in einer UIPopoverController angezeigt.

Die Sache ist nun, dass die Anzahl der Elemente in tableView nicht konstant ist, und ich möchte, dass die Größe des Popovers (d. H. - popoverContentSize) entsprechend der Anzahl der Elemente in tableView angepasst wird

Naiv dachte ich, wenn ich contentSizeForViewInPopover in viewDidLoad setze, nachdem ich die tableView mit allen Gegenständen geladen habe, wird es das tun.

Hat es nicht getan.

Um es kurz zu machen, meine Frage ist: Wie kann ich popoverContentSize direkt von contentViewController aus ändern, nachdem es präsentiert wurde?

Blinddarm:enter image description here

26
Avraham Shukron

Ich kann sehr spät antworten, aber für neue Benutzer von iOS 7. Verwenden Sie bitte die folgende Zeile in Ihrem UIViewController i, e contentViewController Ihres UIPopOverViewConotroller

-(void) viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    self.preferredContentSize=myTableView.contentSize;
}

Ich hoffe, das hilft iOS 7-Anwendern.

47
Avinash

Am Ende habe ich etwas getan, bei dem ich nicht sicher bin, ob es richtig ist, aber es funktioniert.

Ich habe in meinem contentViewController einen Verweis auf den popoverController hinzugefügt:

@property (nonatomic , assign) UIPopoverController *popoverControllerContainer;

Dann habe ich den Änderungscode zu viewWillAppear und viewDidAppear hinzugefügt:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.tableView reloadData];
}

-(void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.contentSizeForViewInPopover = self.tableView.contentSize;
}

-(void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self.popoverControllerContainer setPopoverContentSize:self.contentSizeForViewInPopover animated:YES];
}

Einen Bezug zum Popover zu halten ist also eine Art Hacking, also bin ich offen für bessere Ideen. 

9
Avraham Shukron

Für iOS 7 oder höher.

- (CGSize)preferredContentSize {
    return CGSizeMake(320, 550);
}

Wenn Sie einem Container untergeordnet sind, richten Sie die Inhaltsgröße an sich selbst weiter. Z.B. In einer UINavigationController-Unterklasse:

- (CGSize)preferredContentSize {
    return self.topViewController.preferredContentSize;
}
7
Robert

Eine UIViewController -Klasse verfügt über die Eigenschaft 

self.contentSizeForViewInPopover

dadurch wird die Größe des Pop-Ups geändert, ohne dass ein Verweis hinzugefügt werden muss.

Um eine Lösung zu erweitern, habe ich die Methode rectForSection: verwendet, um die Größe des Abschnitts zu ermitteln (meines hat nur einen Abschnitt, also einfach zu bekommen), und dann die Höhe der Navigationsleiste hinzugefügt (scheint zu sein) 20 sein. So kann ich den Popover in der Größe der fertigen Tabellenansicht erstellen:

CGRect sectionRect = [view.tableView rectForSection:0];

if (sectionRect.size.height + 20 < POPOVER_SIZE.height)
    view.contentSizeForViewInPopover = CGSizeMake(POPOVER_SIZE.width, sectionRect.size.height + 20);
else
    view.contentSizeForViewInPopover = POPOVER_SIZE;

mit mehreren Abschnitten könnte es schwieriger werden, ich habe es nicht probiert. sollte nur in der Lage sein, die Abschnittshöhen zusammenzufassen, aber es gibt möglicherweise einige Probleme mit dem Abstand, über die ich nicht weiß.

7
Padin215

Meine App verfügt über ein Menü mit Untermenüs, die aus einem Popover stammen und in einen Navigationscontroller eingebettet sind, z. B. UINavigationController -> TopMenuViewController -> SubMenuViewControllerxN.

Keine der oben genannten Lösungen funktionierte für mich.

Meine Lösung: Fügen Sie in meiner Hauptmenüansicht-Controller-Klasse, von der alle anderen Menüansicht-Controller erben, den folgenden Code hinzu:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.preferredContentSize  = CGSizeMake(450.0f, 0.0f);// increase standard width (320.0)
}


- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.navigationController.preferredContentSize = self.tableView.contentSize;
}
1
Mojo66

Ich hatte das gleiche Problem und keine der Antworten, die ich fand, funktionierte. Ich habe zusammengeschustert, dass ich denke, dass es gut funktioniert.

Ich habe in meinem initWithCoder ein Array, das meine Werte enthält. Ich führe einfach diesen Code aus:

- (id)initWithCoder:(NSCoder *)aDecoder
{
//Popover Choices

_importantChoices = [NSMutableArray array];
[_importantChoices addObject:@"Bakery"];
[_importantChoices addObject:@"Beverage Dry Mix"];
[_importantChoices addObject:@"Beverage RTD"];
[_importantChoices addObject:@"Crisps"];
[_importantChoices addObject:@"Meat"];
[_importantChoices addObject:@"Supplements"];


//Calculate size of Popover
self.clearsSelectionOnViewWillAppear = NO;
NSInteger rowsCount = [_importantChoices count];
NSInteger singleRowHeight = [self.tableView.delegate tableView:self.tableView
                                       heightForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
NSInteger totalRowsHeight = rowsCount * singleRowHeight;
CGFloat largestLabelWidth = 0;
for (NSString *tmp in _importantChoices) {
    CGSize labelSize = [tmp sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20.0f]}];
    if (labelSize.width > largestLabelWidth) {
        largestLabelWidth = labelSize.width;
    }
}
CGFloat popoverWidth = largestLabelWidth + 100;     //Add a little padding to the width
self.preferredContentSize = CGSizeMake(popoverWidth, totalRowsHeight);
return self;
}
0

Das sollte den Trick tun

override func viewWillLayoutSubviews() {
  super.viewWillLayoutSubviews()

  self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)}
0
user431791

iOS8/9-Lösung - Überschreiben Sie einfach preferredContentSize und erzwingen Sie, dass die Tabellenansicht Layout erstellt, bevor Sie contentSize zurückgeben.

- (CGSize)preferredContentSize {
    [self.tableView layoutIfNeeded];
    return self.tableView.contentSize;
}
0
capikaw