2

我有一个设计需要在应用程序根以外的某个地方相当于一个 UISplitViewController。由于某些愚蠢的原因这是非法的(感谢Apple),我不得不手动重新编码它的某些方面。

表格在横向模式下正确布局,但是当我将它移动到弹出窗口时,我遇到了一些奇怪的问题。最初,我有足够长的弹出框,以至于它必须缩小以为键盘提供空间,结果是 TableView 太大,并被剪裁了。所以我缩小了弹出框......现在当我重新加载它的数据时,TableView 正在缩小自己(当用户输入搜索键时我必须这样做)。请注意,该错误仅在我 reloadData tableView后显示;而不是剪裁,现在它正在缩小它的顶部和底部的“乐队拳击”。

当我查询帧数据时,tableView 奇怪地似乎保持了它的高度。这意味着什么我不知道。如果我关闭弹出框并表示它,它并不能解决问题(我认为弹出框会变大?),但是当我回想起键盘时它会(弹出框缩小到正确的高度)。(我不想尝试将其作为修复,因为这对于积极打字的用户来说只会很烦人)。

编辑:

如果重要的话,我应用的唯一自动布局是 UITableView;它被赋予了固定的宽度和高度。没有 X 或 Y 数据,这可能是一个错误,除非我在尝试引用超级视图时生成错误 - 可能是因为弹出框在我尝试呈现它之前不会创建超级视图?

编辑:请求的代码(对不起,这是一个又大又丑的块):

-(void)setupViewsAfterRotation
{
    if (UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)) {
        [self.searchTable.view removeFromSuperview];
        self.popover=[[UIPopoverController alloc] initWithContentViewController:self.searchTable];
        self.navigationItem.leftItemsSupplementBackButton=YES;
        self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"Search"
                                                                               style:UIBarButtonItemStylePlain
                                                                              target:self
                                                                              action:@selector(presentPopover)];
        [self setupPortraitConstraints];
        //NSLog(@"Intrinsic size data:  width: %f and height: %f",self.searchTable.view.intrinsicContentSize.width, self.searchTable.view.intrinsicContentSize.height);
        //NSLog(@"Runtime size data:  width: %f and height: %f",self.searchTable.view.frame.size.width, self.searchTable.view.frame.size.height);

    } else {
        [self.popover dismissPopoverAnimated:NO];
        self.popover=nil;
        self.navigationItem.leftBarButtonItem=nil;
        [self.view addSubview:self.searchTable.view];
        [self setupLandscapeConstraints];
    }
}

-(void)setupLandscapeConstraints
{
    if (self.tableViewConstraints) {
        [self.view removeConstraints:self.tableViewConstraints];
        self.tableViewConstraints=nil;
    }
    NSMutableArray *landscapeConstraints=[[NSLayoutConstraint constraintsWithVisualFormat:@"|[tableView(==256)]"
                                                                                  options:0
                                                                                  metrics:nil
                                                                                    views:@{@"tableView": self.searchTable.view}] mutableCopy];

    [landscapeConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topLayoutGuide][tableView]|"
                                                                                      options:0
                                                                                      metrics:nil
                                                                                        views:@{@"tableView": self.searchTable.view,
                                                                                                @"topLayoutGuide":[self topLayoutGuide]
                                                                                                }]];
    self.tableViewConstraints=landscapeConstraints;
    [self.view addConstraints:self.tableViewConstraints];
}

-(void)setupPortraitConstraints
{
    if (self.tableViewConstraints) {
        [self.view removeConstraints:self.tableViewConstraints];
        self.tableViewConstraints=nil;
    }
    NSMutableArray *portraitConstraints;
    if (self.keyboardHeight) {
        NSLog(@"Height set to 612");
        portraitConstraints=[[NSLayoutConstraint constraintsWithVisualFormat:@"V:[tableView(==612)]"
                                                                     options:0
                                                                     metrics:nil
                                                                       views:@{@"tableView": self.searchTable.view}] mutableCopy];
        [self.popover setPopoverContentSize:CGSizeMake(256, 612) animated:YES];
    }
    else{
        NSLog(@"Height set to 768");
        portraitConstraints=[[NSLayoutConstraint constraintsWithVisualFormat:@"V:[tableView(==768)]"
                                                                     options:0
                                                                     metrics:nil
                                                                       views:@{@"tableView": self.searchTable.view}] mutableCopy];
        [self.popover setPopoverContentSize:CGSizeMake(256, 768) animated:YES];
    }

    [portraitConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"[tableView(==256)]"
                                                                                     options:0
                                                                                     metrics:nil
                                                                                       views:@{@"tableView": self.searchTable.view}]];
    self.tableViewConstraints=portraitConstraints;
    [self.searchTable.view addConstraints:self.tableViewConstraints];
}
4

1 回答 1

2

设置弹出框的内容大小以限制弹出框的查看区域。

您可以通过以下方式做到这一点:

  1. 使用方法 setPopoverContentSize: 设置弹出框的内容大小。
  2. 为内容视图控制器设置 contentSizeForViewInPopover。

来自Apple 的文档

弹出框通常从它们呈现的视图控制器中获取它们的大小。但是,您可以通过修改 popoverContentSize 属性中的值或调用 setPopoverContentSize:animated: 方法来更改弹出框的大小。如果您需要对弹出框大小的更改进行动画处理,则后一种方法特别有效。您指定的大小只是弹出框视图的首选大小。实际大小可能会改变,以确保弹出框适合屏幕并且不会与键盘碰撞。

来自Apple关于 popoverContentSize 属性的文档:

更改此属性的值会覆盖当前视图控制器的默认值。覆盖的值一直存在,直到您将新的内容视图控制器分配给接收器。因此,如果您想保留覆盖的值,则必须在更改内容视图控制器后重新分配它。

于 2013-09-18T04:29:39.763 回答