0

在我的项目中,我启用了 AutoLayout 以使应用程序在 iPhone 4 和 iPhone 5 中正确缩放。这样做一切正常,但我发现了一个新问题,我不确定如何处理。

在我的项目中,我有一个普通的方法来检查布尔值是或否,如果是,界面应该在界面中添加一个按钮并将我的 tableView 保持在当前状态。但是如果方法返回 no,按钮应该会消失,并使 tableView 的高度更高!按钮的一切工作正常,但由于某种原因,在开始使用 AutoLayout 后,我​​增加 tableView 高度的代码停止工作(以前工作过)。

现在,即使我使用 AutoLayout,我该怎么做才能使我的 tableView 的高度增加?这是我的代码:

- (void)viewWillAppear:(BOOL)animated
{
NSString *bookName = [self getCurrentBookName];

if([self isBlank:bookName])
{
    [self.currentBookLabel setText:NSLocalizedString(@"LabelNoBookChosen", nil)];
}
else
{
    [self.currentBookLabel setText:[self getCurrentBookName]];
}

[super viewWillAppear:animated];

  if([self isAppLicensed] != YES)   <------------------THIS IS WHERE I CHECK THE BOOLEAN METHOD!
{
    [actionAppStore setHidden:TRUE];

    CGRect framez =  [tableView frame]; <------------------ THIS CODE IS NOT WORKING ANY LONGER!
    [tableView setFrame:CGRectMake(framez.origin.x, framez.origin.y, framez.size.width, framez.size.height+77)];
}    
else
{
    [actionAppStore setHidden:FALSE];
}
}
4

2 回答 2

3

你可以

  1. 关闭自动布局并使用自动调整大小的蒙版。非自动布局自动调整大小蒙版让您可以控制增加或减少 3.5 英寸屏幕与 4 英寸屏幕的控件大小。这可能是最简单的解决方案。它还为您提供与 iOS 5 设备的兼容性。

  2. 如果要使用自动布局,则应IBOutlet为适当的约束创建一个,然后以编程方式对其进行更改。


在后一个示例中,考虑一个布局,其中我在应用商店的底部有一个表格视图和一个控件(我从您的变量名中推断出这一点)。有两种方法可以隐藏和显示底部控件。一种是隐藏它(或将其alpha设置为零或removeFromSuperview),删除不必要的约束,并重新创建新的适当约束。

这行得通,但很麻烦。我现在更喜欢将我想要隐藏的高度更改为零,或者,如果它已经在屏幕的边缘,我将它从边缘滑出,这样你就看不到它了。

因此,我可能会在视觉上隐藏应用商店控件,而不是通过玩弄它的hidden属性,而是通过将其高度更改为零(或者,为了显示它,更改为 77)。这样,其他约束将自动调整其他控件的大小。因此,我将其隐藏:

        self.appStoreHeightConstraint.constant = 0.0;
        [self.view layoutIfNeeded];

我展示了:

        self.appStoreHeightConstraint.constant = 77.0;
        [self.view layoutIfNeeded];

我使用与底部控件的高度约束相关联的IBOutlet调用来做到这一点。appStoreHeightConstraint

或者(并且仅当被隐藏的项目位于底部时),我可以将其滑出屏幕底部(这次使用IBOutlet底部约束),使用:

        self.appStoreBottomConstraint.constant = 77.0;
        [self.view layoutIfNeeded];

并用

        self.appStoreBottomConstraint.constant = 0.0;
        [self.view layoutIfNeeded];

为了全面披露,我应该提一下,您必须非常小心地设计约束,以便它们同时 (a) 最低限度地描述您的布局;但是 (b) 充分描述您的布局。您想避免可怕的冲突或不令人满意的约束消息。

仅关注垂直维度,这意味着具有以下约束:

  • 表视图的顶部约束是超级视图的顶部;
  • 表视图的底部约束是应用商店视图的顶部;
  • 表视图应该没有高度限制(因为这是您想要在其他内容发生变化时更改的内容);
  • 底部的应用商店控件将其顶部约束链接到 tableview;
  • 应用商店的底部约束链接到超级视图的底部;和
  • 应用商店的高度限制固定为 77.0。

但我发现 IB 总是(真诚地努力确保约束是明确的)正在尝试添加额外的约束(例如 tableview 的高度)。因此,我个人与 IB 搏斗以使约束完全正确(通常我最终会降低 table view 高度的优先级,当我完成其他所有事情时,我可以回去摆脱 table view 高度) .

也许我在编辑约束时太麻烦了,但我提到它是因为如果你没有完全正确地得到它们,通过改变一个约束来影响 UI 更改的努力将不会产生你想要的结果。一旦你掌握了它的窍门,就很容易看到一切都相应地调整(尤其是在复杂的场景中),这是一件很美的事情。但是前几次可能会很麻烦。

于 2013-02-07T19:17:18.043 回答
1

您可能需要告诉视图使用layoutIfNeeded.

看到我刚刚解决的问题这个问题也相关

于 2013-02-07T19:15:47.533 回答