2012-08-06 37 views
17

我有一个UIViewController调用HomeViewController它有一个包含数据数组的模型。 HomeViewController也有一个按钮,当按下时会显示一个UITableViewController显示模型的数据数组。在哪里设置弹出大小?

我的问题是,什么是标准/最好的方式来设置popover的大小?我只希望popover的高度足以显示数据,但不会更高。什么是常规做法?我认为我需要在某个时候设置contentSizeForViewInPopover,但我不确定在哪里...在popover类的viewDidLoad方法中?在prepareForSegue方法?

这里是我到目前为止的代码:(注意DataPresentingViewController是我酥料饼的视图控制器class`)

//In HomeViewController 
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if([segue.destinationViewController isKindOfClass:[DataPresentingViewController class]]) 
    { 
     DataPresentingViewController *dest = (DataPresentingViewController *) segue.destinationViewController; 
     dest.mySavedData = self.myModel.mySavedData; 
    } 
} 

我知道我可以只设置contentSizeForViewInPopover在这里prepareForSegue方法;然而,这看起来像popover类应该处理的东西。

+0

在下面添加了一个解决方案,该解决方案提供了将弹出窗口大小调整为任意tableView大小的通用方法。 – memmons 2013-04-07 18:12:13

回答

21

设置contentSizeForViewInPopoverViewDidLoad方法HomeViewController

+13

-contentSizeForViewInPopover:在iOS 7中已被弃用。请改用-setPopoverContentSize:animated:。 – auco 2013-10-03 16:30:44

+18

我相信替换的调用是setPreferredContentSize: – 2013-12-13 16:20:46

1

它看起来像你想以编程方式执行它,但在故事板中,在将视图控制器连接到segue之前,在属性检查器下有一个“弹出窗口,使用显式大小选项”。也许你可以设置最适合你的应用程序的大小,而不用担心使用代码的大小。希望这有助于,让我们知道它是如何发展的。

+0

问题是,每次运行应用程序时,我的模型都会有不同的大小,因此我无法确定明确的大小 – Nosrettap 2012-08-07 00:13:14

+0

@Nosrettap,是的,如果它发生变化,根本无法工作。那么,我认为我至少会尝试。让我们贴出你的所作所为,我很想知道。 – Douglas 2012-08-07 01:00:34

3

今天偶然发现你的问题。你解决了吗?

你试过:

setPopoverContentSize:<#(CGSize)#> animated:<#(BOOL)#> 
在赛格瑞逻辑块

。如果您希望弹出窗口的大小根据数据集或查看位置或其他因素而变化,那么这很有用。

很好。

1

试试下面的代码:

- (IBAction)setData:(id)sender 
{ 
    UIViewController *popoverContent=[[UIViewController alloc] init]; 
    UITableView *tableView=[[UITableView alloc] initWithFrame:CGRectMake(265, 680, 0, 0) style:UITableViewStylePlain]; 

    UIView *popoverView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)]; 

    popoverView.backgroundColor=[UIColor whiteColor]; 

    popoverContent.view=popoverView; 
    popoverContent.contentSizeForViewInPopover=CGSizeMake(200, 420);//setting the size 
    popoverContent.view=tableView; 
    tableView.delegate=self; 
    tableView.dataSource=self; 

    self.popoverController=[[UIPopoverController alloc] initWithContentViewController:popoverContent]; 
    [self.popoverController presentPopoverFromRect:CGRectMake(400, 675, 0, 0) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES]; 
} 
1

一个鲜为人知的技巧,调整您的UIPopoverViewController,以配合您UITableView的高度是使用的tableView的rectForSection方法给你高度。请使用您的viewController的contentSizeForViewInPopover高度是这样的:

- (CGSize)contentSizeForViewInPopover { 
    // Currently no way to obtain the width dynamically before viewWillAppear. 
    CGFloat width = 200.0; 
    CGRect rect = [self.tableView rectForSection:[self.tableView numberOfSections] - 1]; 
    CGFloat height = CGRectGetMaxY(rect); 
    return (CGSize){width, height}; 
} 
56

由于iOS7 contentSizeForViewInPopover已经被淘汰。您应该使用UIViewControllerpreferredContentSize属性。

希望这会有所帮助!

+1

这似乎并不工作,如果你有一个弹出窗口呈现UINavigationController。我的第二个视图控制器重置此值,但它不会调整。由于某种原因,它仅取得根视图控制器的值。 – LightningStryk 2014-05-01 15:17:36

+2

这个值也可以在IB中设置:** ViewController的属性检查器**'>>'内容大小'>>'**使用首选显式大小** – Besi 2016-03-25 18:40:58

+0

这个答案应该被接受。 – tomas789 2017-01-08 09:49:31

6

contentSizeForViewInPopover已被弃用在IOS 7
的属性:UIPopoverController的popoverContentSize表示由在UIPopoverController的contentViewController属性视图控制器管理的内容视图的大小。
Reference

的优点是它可在iOS 3.2或更高版本,所以你不需要检查设备版本每次,只需更换contentSizeForViewInPopover方法与UIPopOverController对象实例。

2

// self.contentSizeForViewInPopover = CGSizeMake(320.0,600.0); //在ios7中已弃用

self.preferredContentSize = CGSizeMake(320.0,600.0); //用来代替