Oto jak rozwiązałem to na iOS 7 i 8:
W systemie iOS 8 system iOS dyskretnie zawija żądany widok w wyskakującym okienku do presentViewController kontrolera widoku PresentViewController. Jest wideo WWDC z 2014 roku wyjaśniające, co nowego w kontrolerze popover, w którym dotykają tego.
W każdym razie w przypadku kontrolerów widoku prezentowanych na stosie kontrolerów nawigacji, które wszystkie chcą mieć własny rozmiar, te kontrolery widoku muszą (w systemie iOS 8) wywołać ten kod w celu dynamicznego ustawienia preferowanego rozmiaru:
self.presentingViewController.presentedViewController.preferredContentSize = CGSizeMake(320, heightOfTable)
Zastąp heightOfTable obliczoną tabelą lub wysokością widoku.
Aby uniknąć dużej ilości duplikatów kodu i stworzyć wspólne rozwiązanie dla iOS 7 i iOS 8, utworzyłem kategorię na UITableViewController, aby wykonać tę pracę, gdy viewDidAppear jest wywoływany w moich tableviews:
- (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
viewWillAppear:
)?