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:
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.
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.
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;
}
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ß.
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
-> SubMenuViewController
xN.
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;
}
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;
}
Das sollte den Trick tun
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)}
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;
}