调整大小后调整 UIPopoverController 位置
Posted
技术标签:
【中文标题】调整大小后调整 UIPopoverController 位置【英文标题】:Adjust UIPopoverController position after resize 【发布时间】:2010-09-08 18:52:04 【问题描述】:我有一个UIPopoverController
,其中包含一个UITableView
。弹出框在其视图控制器的-viewDidAppear
函数中调整大小以适应表格的内容。当弹出框正确调整大小时,它的箭头通常不再指向原始的CGRect
。有没有办法强制弹出框在调整大小后重新定位,使其箭头指向其预期目标?
编辑:我无法在-viewDidLoad
中设置弹出框的大小,因为在调用-viewDidAppear
之前表格视图不会加载其数据,因此我不知道在那之前弹出框的大小应该是多少。此外,当单击一个表格视图单元格以显示另一个视图时,我会调整弹出框的大小,这也会导致箭头不再指向其预期目标。
【问题讨论】:
可以在表格加载前设置弹出框的大小。这两件事是完全分开的。您正在做的是设置封装框架的大小;如果UITableView
的实际内容大小更长,您将获得滚动条,就像您在 iPhone 上加载表格视图并且内容高于 480 像素时发生的情况一样。
@Shaggy Frog:我想尽可能避免滚动条。
再一次,你误会了。一般来说,如果UITableView
中的内容高于其框架,它将显示滚动条。那是一个与您所要求的完全不同的主题,即调整弹出视图的框架,我已经解释了如何做。
我的问题实际上是两个主题的组合:我在问如何调整弹出框的框架,使其包含的 UITableView 不会显示滚动条(如果可能),不允许弹出框的箭头重新定位。
没有真正简单的方法可以做到这一点。 popover 控制器的实现需要知道封装框架有多大,因此它知道它将在屏幕上定位的位置,因此它知道将箭头定位在哪里。我能想到的唯一方法是创建一个表视图控制器的实例并让它在屏幕外显示它的视图,然后查询UITableView
的内容大小,然后处理这个隐藏的视图控制器。这很狡猾。也许 ios 4.2 会对 popover 控制器有更多的控制,但现在,你离太阳太近了。
【参考方案1】:
我认为这可能是错误的做法,因为您必须重新执行定位箭头开头的内置行为。
我不会调整 viewDidAppear
中弹出框内容的大小。我在视图控制器的viewDidLoad
方法中设置了contentSizeForViewInPopover
属性,例如:
- (void)viewDidLoad
[super viewDidLoad];
self.contentSizeForViewInPopover = CGSizeMake(320, 155); // sized for a 3-row UITableView
(快速警告:如果您正在开发通用应用程序,此代码将导致运行 3.1.x 及更低版本的设备运行时崩溃。)
您还可以在呈现之前设置弹出框控制器的内容大小,这应该可以解决您的问题。查看popoverContentSize
属性。
【讨论】:
谢谢,但这不适用于我的情况;查看我更新的问题。 @毛茸茸的青蛙 popovercontentsize 是个好主意self.popoverController.popoverContentSize = CGSizeMake(320, 300);
会做大工作。谢谢人
注意 contentSizeForViewInPopover
自 7.0 起已弃用【参考方案2】:
根据this answer,你可以再次在popover上调用presentPopoverFromRect:inView:
,它会重新定位箭头。我自己没有测试过。
【讨论】:
这在技术问答 QA1694 中有记录:developer.apple.com/iphone/library/qa/qa2010/qa1694.html以上是关于调整大小后调整 UIPopoverController 位置的主要内容,如果未能解决你的问题,请参考以下文章