3 回答
TA贡献1858条经验 获得超8个赞
这是我为iOS 7和8解决的方法:
在iOS 8中,iOS会将您在弹出窗口中所需的视图无提示地包装到presentingViewController视图控制器的presentedViewController中。有一个2014年的WWDC视频,解释了popovercontroller的新功能。
无论如何,对于在导航控制器堆栈上显示的视图控制器,它们都希望自己调整大小,这些视图控制器需要(在iOS 8下)调用此代码来动态设置preferredContentSize:
self.presentingViewController.presentedViewController.preferredContentSize = CGSizeMake(320, heightOfTable);
用您计算出的表或视图高度替换heightOfTable。
为了避免大量重复代码并创建常见的iOS 7和iOS 8解决方案,我在UITableViewController上创建了一个类别,以在tableviews中调用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
TA贡献1796条经验 获得超4个赞
这是对krasnyk答案的改进。
您的解决方案很棒,但动画效果不佳。
进行一些改进可以使动画效果更好:
删除- (void) forcePopoverSize方法中的最后一行:
- (void) forcePopoverSize {
CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, currentSetSizeForPopover.height - 1.0f);
self.contentSizeForViewInPopover = fakeMomentarySize;
}
将[self forcePopoverSize]放在- (void)viewWillAppear:(BOOL)animated方法中:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self forcePopoverSize];
}
最后-在- (void)viewDidAppear:(BOOL)animated方法中设置所需的大小:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
self.contentSizeForViewInPopover = currentSetSizeForPopover;
}
分享编辑
- 3 回答
- 0 关注
- 541 浏览
添加回答
举报