Вот как я решил это для iOS 7 и 8:
В iOS 8 iOS молча оборачивает представление, которое вы хотите во всплывающем окне, в представленный ViewController контроллера представления представленияingController. Есть видео WWDC 2014, объясняющее, что нового появилось в поповерконтроллере, где они касаются этого.
В любом случае, для контроллеров представления, представленных в стеке навигационных контроллеров, которые хотят иметь свой собственный размер, эти контроллеры представления должны (под iOS 8) вызывать этот код для динамической установки предпочитаемого размера объекта:
self.presentingViewController.presentedViewController.preferredContentSize = CGSizeMake(320, heightOfTable);
Замените heightOfTable на вашу вычисленную таблицу или высоту представления.
Чтобы избежать большого количества дублирующегося кода и создать общее решение для iOS 7 и iOS 8, я создал категорию на UITableViewController для выполнения этой работы, когда viewDidAppear вызывается в моих таблицах:
- (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