带有嵌入式导航控制器的Popover不考虑后导航的大小

我有一个托管UINavigationController的UIPopoverController,其中包含一个小的层次的视图控制器。


我遵循了文档,并为每个视图控制器设置了视图的popover-context大小,如下所示:


[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];

(每个控制器的大小不同)


当我在层次结构中向前导航时,这可以按预期工作-弹出窗口会自动为尺寸更改设置动画效果,以与推送的控制器相对应。


但是,当我通过导航栏的“后退”按钮在视图堆栈中导航“后退”时,弹出窗口不会改变大小,它的大小与到达的最深视图一样大。这对我来说似乎很糟;我希望弹出窗口在通过视图堆栈弹出时会尊重设置的大小。


我想念什么吗?


莫回无
浏览 542回答 3
3回答

猛跑小猪

这是我为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&nbsp;{&nbsp; &nbsp; [super viewDidAppear:animated];&nbsp; &nbsp; [self setPopOverViewContentSize];}Category.h:#import <UIKit/UIKit.h>@interface UITableViewController (PreferredContentSize)- (void) setPopOverViewContentSize;@endCategory.m:#import "Category.h"@implementation UITableViewController (PreferredContentSize)- (void) setPopOverViewContentSize{&nbsp; &nbsp; [self.tableView layoutIfNeeded];&nbsp; &nbsp; int heightOfTable = [self.tableView contentSize].height;&nbsp; &nbsp; if (heightOfTable > 600)&nbsp; &nbsp; &nbsp; &nbsp; heightOfTable = 600;&nbsp; &nbsp; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {&nbsp; &nbsp; &nbsp; &nbsp; if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.preferredContentSize=CGSizeMake(320, heightOfTable);&nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.presentingViewController.presentedViewController.preferredContentSize = CGSizeMake(320, heightOfTable);&nbsp; &nbsp; }}@end

SMILET

这是对krasnyk答案的改进。您的解决方案很棒,但动画效果不佳。进行一些改进可以使动画效果更好:删除- (void) forcePopoverSize方法中的最后一行:- (void) forcePopoverSize {&nbsp; &nbsp; CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;&nbsp; &nbsp; CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, currentSetSizeForPopover.height - 1.0f);&nbsp; &nbsp; self.contentSizeForViewInPopover = fakeMomentarySize;}将[self forcePopoverSize]放在- (void)viewWillAppear:(BOOL)animated方法中:- (void)viewWillAppear:(BOOL)animated{&nbsp; &nbsp; [super viewWillAppear:animated];&nbsp; &nbsp; [self forcePopoverSize];}最后-在- (void)viewDidAppear:(BOOL)animated方法中设置所需的大小:- (void)viewDidAppear:(BOOL)animated{&nbsp; &nbsp; [super viewDidAppear:animated];&nbsp; &nbsp; CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;&nbsp; &nbsp; self.contentSizeForViewInPopover = currentSetSizeForPopover;}分享编辑
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS