【问题标题】:UIView's frame gets overridden by Storyboard on initial loadUIView 的框架在初始加载时被 Storyboard 覆盖
【发布时间】:2013-12-13 05:37:03
【问题描述】:

我需要根据可用的磁盘空间来更改子视图的宽度。所以我有一个在视图控制器的 viewWillLayoutSubviews 上调用的选择器:

CGRect rect = self.usageView.bounds;
rect.size.width = self.someCalculatedwidth;
[self.usageView setFrame:rect];
[self.usageView setNeedsDisplay];

真的,我只是想改变子视图的宽度。如果视图控制器是初始控制器,它就可以工作;但是,如果它是从一个 Push Segue 转换过来的,它就会停止工作。发生的情况是我会暂时看到我想要的宽度,但随后它会根据情节提要上的蓝图更改为原始宽度。

这种行为感觉就像iOS在推送segue动画期间将原始(故事板)视图缓存在一个块中,并在完成后执行上面没有我计算的块;从而覆盖所需的视图。有什么想法吗?

【问题讨论】:

  • 你在使用自动布局吗?
  • @user1459524 是的,我是。目前对这个特定的子视图没有任何限制。我做了实验并“添加了缺失的约束”,但这没有任何区别。我还在 viewDidAppear 中调用了我的“调整大小”选择器,但即使是这种尝试也会被撤销。调整大小选择器的任何后续调用(例如,由于方向更改、点击按钮等);只有在 push segue 之后的第一个有问题。
  • 如果您在上面粘贴的代码中省略了对 setNeedsDisplay 的调用,会发生什么?
  • @user1459524 省略 setNeedsDisplay 没有任何区别,我确实需要它来进行后续调用以刷新视图。

标签: uiview ios7 xcode5


【解决方案1】:

有两种方法。

第一种方法是为了规避这个问题,还有一个很酷的动画效果。由于我不知道 iOS 何时、多少次或究竟如何强制执行自动约束,我只是延迟我的 UIView 修改并用动画平滑它。所以我将视图动画包裹在我的选择器中的代码周围:

[UIView animateWithDuration:.25 animations:^{
    CGRect rect = self.usageView.bounds;
    rect.size.width = self.someCalculatedwidth;
    [self.usageView setFrame:rect];
    [self.usageView setNeedsDisplay];
}];

然后我会在控制器的 viewDidAppear:animated: 中调用我的选择器:

[self performSelector:@selector(resetUsageView) withObject:self afterDelay:0.0];

现在大多数人会说这是一种逃避或凑巧。这很公平。

第二种方法中,我攻击了问题的根源——自动布局/约束。我在情节提要中的 usageView 中添加了一个 Width 约束,并将其 IBOutlet 连接到我的代码。

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *usageViewWidthConstraint;

然后我根据控制器 viewWillAppear:animated: 中计算的宽度修改约束:

[self.usageViewWidthConstraint setConstant:self.someCalculatedWidth];

瞧!一个班轮。

现在如果我想要动画,因为我从第一种方法中尝到了它的味道?好吧,约束变化超出了动画的范围,所以基本上我需要第一种和第二种方法的组合。我更改了 UIView 的动画框架,并修改了约束以“直接设置记录”:

[UIView animateWithDuration:.25 animations:^{
    CGRect rect = self.usageView.bounds;
    rect.size.width = self.someCalculatedwidth;
    [self.usageView setFrame:rect];

    [self.usageViewWidthConstraint setConstant:self.someCalculatedWidth]; // <<<< 

    [self.usageView setNeedsDisplay];
}];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多