iphone - 在 Xcode 中使用 AutoLayout 会禁用我的代码(动态地)工作?

标签 iphone ios uitableview frame autolayout

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

在我的项目中,我有一个正常的方法来检查 bool 值是否为是或否,如果是,界面应在界面中添加一个按钮并将我的 tableView 保持在当前状态。但如果该方法返回否,按钮应该消失并使 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];
}
}

最佳答案

你可以

  1. 关闭自动布局并使用自动调整大小蒙版。非自动版式自动调整大小蒙版让您可以对 3.5"屏幕和 4"屏幕的控件增大或减小其尺寸进行相同的控制。这可能是最简单的解决方案。它还让您与 iOS 5 设备兼容。

  2. 如果您想使用自动布局,那么您应该为适当的约束创建一个 IBOutlet,然后以编程方式更改它。


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

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

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

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

我展示了:

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

我用一个名为 appStoreHeightConstraintIBOutlet 来做到这一点,它链接到该底部控件的高度约束。

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

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

并用

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

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

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

  • TableView 的顶部约束位于父 View 的顶部;
  • 表格 View 的底部约束是应用商店 View 的顶部;
  • table view 应该没有高度限制(因为这是你想要随着其他东西的变化而改变的);
  • 底部的应用商店控件将其顶部约束链接到 TableView ;
  • 应用商店的底部约束链接到父 View 的底部;和
  • 应用商店的高度限制固定为 77.0。

但我发现 IB 总是(真诚地努力确保约束是明确的)试图添加额外的约束(例如 tableview 的高度)。因此,我个人与 IB 进行了较量,以使约束非常正确(通常我最终会降低表格 View 高度的优先级,当我完成其他所有操作后,我可以返回并摆脱表格 View 高度) .

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

关于iphone - 在 Xcode 中使用 AutoLayout 会禁用我的代码(动态地)工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14759061/

相关文章:

ios - 表格 View 中动态单元格高度中的标签未正确显示文本

android - 展开标题时如何更改展开标题颜色?

ios - 在 iOS 6 及更高版本中手动调用状态保存

ios - 使用 AVAssetImageGenerator 为长视频获取视频中的所有帧时应用程序崩溃

ios - 无法通过 Interface Builder 将条形按钮添加到第二页

html - 我的响应式 HTML 电子邮件没有响应

ios - 无法快速将图像加载到单元格

ios - 使用 NSFetchedResultsController 的 UITableView 部分出现意外的标题 View

objective-c - Core-Plot:如何在 CPLayerHostingView 上添加按钮

iphone - 为什么 "numberOrRowsInSection"在 "viewDidLoad"中途被调用?