首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有嵌入式导航控制器的弹出窗口不考虑后导航上的大小

带有嵌入式导航控制器的弹出窗口不考虑后导航上的大小
EN

Stack Overflow用户
提问于 2010-05-02 11:53:12
回答 17查看 45.7K关注 0票数 89

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

我遵循文档,对于每个视图控制器,我像这样设置视图的popover-context大小:

代码语言:javascript
复制
[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];

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

当我在层次结构中向前导航时,它的工作方式与预期的一样-- popover会自动为大小更改设置动画,以与推送的控制器相对应。

但是,当我通过导航栏的Back按钮在视图堆栈中导航"Back“时,弹出窗口的大小没有改变--它仍然与最深的视图一样大。在我看来,这似乎是错误的;我期望弹出窗口在视图堆栈中弹出时会考虑到设置的大小。

我是不是遗漏了什么?

谢谢。

EN

回答 17

Stack Overflow用户

发布于 2014-11-17 10:59:45

下面是我在iOS 7和8中解决这个问题的方法:

在iOS 8中,iOS静默地将弹出窗口中所需的视图包装到presentingViewController视图控制器的presentedViewController中。有一段2014年的WWDC视频解释了explaining控制器的新特性。

无论如何,对于导航控制器堆栈上显示的视图控制器,它们都想要自己的大小,这些视图控制器需要(在iOS 8下)调用此代码来动态设置preferredContentSize:

代码语言:javascript
复制
self.presentingViewController.presentedViewController.preferredContentSize = CGSizeMake(320, heightOfTable);

将heightOfTable替换为您的计算表或视图高度。

为了避免大量重复的代码,并创建一个通用的iOS 7和iOS 8解决方案,我在UITableViewController上创建了一个类别,以便在我的表视图中调用viewDidAppear时执行此工作:

代码语言:javascript
复制
- (void)viewDidAppear:(BOOL)animated 
{
    [super viewDidAppear:animated];
    [self setPopOverViewContentSize];
}

Category.h:

代码语言:javascript
复制
#import <UIKit/UIKit.h>

@interface UITableViewController (PreferredContentSize)

- (void) setPopOverViewContentSize;

@end

类别.m:

代码语言:javascript
复制
#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
票数 19
EN

Stack Overflow用户

发布于 2012-09-11 12:39:17

在导航控制器中使用的所有视图控制器的-(void)viewDidLoad中,添加:

代码语言:javascript
复制
[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];
票数 5
EN

Stack Overflow用户

发布于 2010-06-01 09:46:42

我重置了视图控制器的viewWillDisappear:(BOOL)动画方法中的大小。

代码语言:javascript
复制
-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    CGSize contentSize = [self contentSizeForViewInPopover];
    contentSize.height = 0.0;
    self.contentSizeForViewInPopover = contentSize;
}

然后,当要导航回的视图出现时,我适当地重置了大小:

代码语言:javascript
复制
-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    CGSize contentSize;
    contentSize.width = self.contentSizeForViewInPopover.width;
    contentSize.height = [[self.fetchedResultsController fetchedObjects] count] *  self.tableView.rowHeight;
    self.contentSizeForViewInPopover = contentSize;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2752394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档