弹出其他视图控制器时如何更改弹出视图大小

Posted

技术标签:

【中文标题】弹出其他视图控制器时如何更改弹出视图大小【英文标题】:How to change popoverview size when popping off additional view controllers 【发布时间】:2011-11-29 06:12:23 【问题描述】:

我使用提供的模板创建了一个简单的 Master/Detail iPad 应用程序。它创建了两个视图控制器(Master 和 Detail)。我创建了一个视图附加视图控制器,这些视图控制器弹出在主视图控制器之上(几乎向下钻取表格视图,直到最终点击填充详细视图的单元格。我添加了下面的代码以加载主视图控制器弹出框到指定的尺寸(下面的代码还显示了从主视图控制器表视图中选择选择时):

@implementation MasterViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        self.vehicles = [[NSArray alloc] initWithObjects:@"Cars", @"Trucks", @"Boats", nil];

        self.title = @"Vehicle Type";
        self.clearsSelectionOnViewWillAppear = NO;
        self.contentSizeForViewInPopover = CGSizeMake(320.0, [vehicles count] * 52.0);
    
    return self;


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    if (!self.studySessionViewController)
    
        self.secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    
    [self.navigationController pushViewController:self.secondViewController animated:YES];

当应用程序首次加载时选择弹出框时,一切看起来都很棒。然而,当用户点击返回 MasterViewController 时,弹出框的大小与被压入堆栈的最大视图控制器的大小相同。我四处搜索,并在主视图控制器类中添加了以下代码:

- (void)viewWillAppear:(BOOL)animated

    self.contentSizeForViewInPopover = CGSizeMake(320.0, [vehicles count] * 52.0);
    [super viewWillAppear:animated];


- (void)viewDidAppear:(BOOL)animated

    self.contentSizeForViewInPopover = CGSizeMake(320.0, [vehicles count] * 52.0);
    [super viewDidAppear:animated];

但是,这没有任何效果。同样,一旦弹出框关闭(通过旋转或取消选择 UI 上的弹出框),之前推送到堆栈上的最大 table view 控制器的弹出框大小仍然保留,并完全忽略上述尺寸。我错过了什么?

【问题讨论】:

【参考方案1】:

我无法理解您的整个问题,但我认为您的问题的根本原因是 Popover 的大小不好。

通常,Popover 大小的问题在于 [UIViewController contentSizeForViewInPopover] 只能在创建 UIPopoverController 实例之前设置。这只是弹出框大小的默认值。

当您使用控制器创建 UIPopoverController 实例作为其内容时,contentSizeForViewInPopover 被复制到 [UIPopoverController popoverContentSize] 中并且不再读取。如果您在内容上更改它,则弹出框大小不会更新。

更改已创建 UIPopoverController 实例大小的唯一方法是使用属性 [UIPopoverController popoverContentSize] 或方法 [UIPopoverController setPopoverContentSize:animated:]

【讨论】:

成功了!!!不幸的是,我们可以使用 Master/Detail 模板,弹出框本身被放置在“DetailViewController”中,这可能有点难以访问。我最终在 AppDelegate 中创建了一个 UIPopoverView 属性,以便可以在整个应用程序中引用它。【参考方案2】:

您正在尝试在 MasterViewController 本身中设置弹出框大小。问题就在这里。要使self.contentSizeForViewInPopover = CGSizeMake(320.0, [vehicles count] * 52.0); 工作,您必须在 DetailViewController 中使用它,因为 DetailViewController 是具有弹出框的那个。这里的基本思想是您在父视图控制器中设置大小,而不是控制器本身。

【讨论】:

只是好奇,当你最初设置视图控制器的显示时,它很好,但是你必须使用 DetailViewController 来重置?【参考方案3】:

您必须设置框架。

incomingCallViewController = [[IncomingCallViewController alloc]initWithNibName:@"IncomingCallViewController" bundle:nil];
            [incomingCallViewController.view setFrame:CGRectMake(400, 200, 377, 243)];

            [self.navigationController pushViewController:incomingCallViewController.view]; 

这当然是我的一个项目的示例代码,用你自己的类替换incomingCallViewController并在标题中声明它

【讨论】:

由于这些视图是通过将视图控制器推入堆栈时提供的“后退”按钮从堆栈中弹出的,我将如何反向执行此操作? popViewController?不明白你的意思。抱歉,我之前没有注意到这个回复。

以上是关于弹出其他视图控制器时如何更改弹出视图大小的主要内容,如果未能解决你的问题,请参考以下文章

在其他地方点击时关闭弹出视图控制器

如何在弹出到根视图 Swift 后立即更改选项卡?

调整弹出视图控制器的大小以适应要在 UITableView 中显示的数据

“呈现为弹出框”segues 和视图大小

弹出窗口出现时如何阻止标签栏项目变灰

在拆分视图中更改主视图不会更新纵向弹出框