我打开UIPopoverController
弹出框,UITableViewController
因为它是内容视图控制器。
弹出框的大小合适,乍一看它的内容视图调整正确,但如果我尝试在弹出框内滚动,它会滚动,尽管它不应该滚动。似乎在 -(void)viewDidAppear (图 1、2)之后,内容视图会高出约 20 px。我该怎么做才能检查尺寸:
- (void)viewDidAppear:(BOOL)animated
{
NSLog(@"%@", self.view);
}
输出是
Popovers[3016:c07] <UITableView: 0x10b80600; frame = (0 0; 200 66); autoresize = W+H; gestureRecognizers = <NSArray: 0x1004cc20>; layer = <CALayer: 0x1004c4a0>; contentOffset: {0, 0}>
此时大小正确,等于popover的大小。打开弹出框后,它的无边距内部尺寸为 66 像素(在 Ruler 应用程序的帮助下测量)。因此,它似乎应该完全适合内容视图的大小。但是以某种方式出现了意想不到的垂直滚动。
比,如果我在弹出框的高度上添加 20 像素,
[mOptionPopoverController setPopoverContentSize:(CGSize){200, 86}];
那么它的内容视图也会按预期增加并适合,没有任何滚动条。唯一的问题是我不需要在弹出框底部空 20 像素(图 3)。
我做了一个小测试项目来重现我的问题。这是重要的代码:
@implementation ViewController
- (IBAction)buttonPressed:(id)sender
{
TableViewController *popoverViewController = [[TableViewController alloc] initWithStyle:UITableViewStyleGrouped];
UIPopoverController* mOptionPopoverController = [[UIPopoverController alloc] initWithContentViewController:popoverViewController];
[mOptionPopoverController setPopoverContentSize:(CGSize){200, 66}];
CGRect popoverRect = [self.view convertRect:[sender frame] fromView:[sender superview]];
[mOptionPopoverController presentPopoverFromRect:popoverRect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}
@end
@implementation TableViewController
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
self.tableView.bounces = NO;
}
return self;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
return cell;
}
- (void)viewDidAppear:(BOOL)animated
{
NSLog(@"%@", self.view);
}
@end
图1
图2
图3
这是我所期望的:
UPD。
我做了进一步的调查。我使用 KVO 来跟踪帧的变化。我期待它会帮助找到有用的东西。我发现了一些东西,但这并没有让事情变得更清楚。
所以,我[self.view addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
在- (id)initWithStyle:(UITableViewStyle)style
TableViewController的方法中添加了,观察方法是
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@", [object valueForKeyPath:keyPath]);
}
这是输出:
2013-05-27 15:52:12.755 Popovers[1547:c07] NSRect: {{0, 0}, {200, 84}}
2013-05-27 15:52:12.756 Popovers[1547:c07] NSRect: {{0, 0}, {200, 84}}
2013-05-27 15:52:12.756 Popovers[1547:c07] NSRect: {{0, 0}, {200, 66}}
2013-05-27 15:52:12.759 Popovers[1547:c07] <UITableView: 0x9337600; frame = (0 0; 200 66); autoresize = W+H; gestureRecognizers = <NSArray: 0x8949760>; layer = <CALayer: 0x8944690>; contentOffset: {0, 0}>
(最后一个来自- (void)viewDidAppear:(BOOL)animated
)。
为什么是84?它是84-66=18
,这些不是我要找的 20 像素。此外,观察者方法的所有三个调用都发生在调用 tableView 数据源方法之前。在构建 tableView 之前如何知道框架?
(我目前使用@robmayoff tableView.scrollEnabled = NO; 建议的问题太多,以抑制不必要的弹出窗口。)
UPD。 甚至 Apple 系统打印弹出框在打印机选择列表中也有 20 像素和不必要的滚动条。