设置 UIPopOverController 大小

Posted

技术标签:

【中文标题】设置 UIPopOverController 大小【英文标题】:Set UIPopOverController size 【发布时间】:2011-07-21 03:38:10 【问题描述】:

我有一个view,在UIScrollView 中有一堆按钮。当用户按下按钮时,我希望 UIPopOverController 显示指向所选按钮。它有点工作,但弹出框的大小错误并指向视图中的随机点。这是我的代码。

-(void)detail:(id)sender
    UIButton *button = sender;
    NSLog(@"tag = %i", button.tag);

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    self.popover = [[UIPopoverController alloc] initWithContentViewController:navController];
    self.popover.delegate = self;
    [self.popover presentPopoverFromRect:button.bounds inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

比popover大小的问题: 在弹出框内的视图中,我有:

self.contentSizeForViewInPopover = scroll.contentSize;
NSLog(@"%f, %f", scroll.contentSize.height, scroll.contentSize.width);
NSLog(@"showing: %f, %f",  self.contentSizeForViewInPopover.height,  self.contentSizeForViewInPopover.width);

两个日志都匹配。所以我认为一切都应该正常工作。但事实并非如此。这是一个屏幕截图。如果您需要更多我的代码,请告诉我。提前致谢。

【问题讨论】:

【参考方案1】:

我注意到的第一件事是您应该为 from 矩形使用 button.frame 而不是 button.bounds。这些UIView属性的区别:

视图的几何结构由其框架、边界和中心定义 特性。 frame 属性定义了原点和尺寸 视图在其父视图的坐标系中,通常是 在布局期间用于调整视图的大小或位置。

bounds 属性定义视图的内部尺寸,因为它 看到它们并且几乎只在自定义绘图代码中使用。

您可以使用setPopoverContentSize 消息设置popover 控制器的高度:

// so something like this ...
[self.popover setPopoverContentSize:CGSizeMake(320, 460)];
// and to bind the popover to your button 
[self.popover presentPopoverFromRect:button.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

【讨论】:

presentPopoverFromRect 更改为frame 让它变得更好一些。但我认为部分问题是由于按钮位于UIScrollView 中,因此原始按钮框架不再是出现弹出框时的框架。另外,我不能像那样设置弹出框,因为我想根据弹出框内文本的大小进行更改 @JaspreetSingh 我的荣幸 :)【参考方案2】:

仅关于弹出框的大小:我设法使用可变高度的 UILabel 来做到这一点:

UILabel *hinweis;
hinweis.text = @"...";
hinweis.frame = CGRectMake(x,y,width,800);
[hinweis sizeToFit];

对于箭头:您是否尝试过不同的 inView 参数,例如 self.parentViewController.view?

【讨论】:

在此期间我学会了将 contentOffset 用于 tableView,它应该与 scrollView 类似。 ` CGRect f = [tableView rectForRowAtIndexPath:indexPath]; CGPoint yOffset = [tableView contentOffset]; CGRect frame = CGRectMake(f.origin.x, f.origin.y + 45 - yOffset.y, 200, 40); [self.poc presentPopoverFromRect:frame ...` 另外,你需要初始化那个 UILabel。

以上是关于设置 UIPopOverController 大小的主要内容,如果未能解决你的问题,请参考以下文章

自动布局和 UIPopoverController

UIPopovercontroller 在将新的视图控制器推送到 navccontroller 后调整大小

UIPopoverController w/MonoTouch.Dialog 会导致不需要的弹出框大小调整

UIPopoverController 内的移动框架

iPad 控件UIPopoverController使用

UIPopoverController 内容视图大小