UIView没有重绘,但元素变得错位

时间:2014-10-12 03:07:10

标签: ios objective-c xcode uiview xcode-storyboard

我的应用程序布局有问题,解释起来有点棘手。当应用程序首次启动时,这就是我正在展示的内容:

enter image description here

用户点击“创建个人资料”后,我会设置这些按钮的动画并显示注册表单:

enter image description here

毋庸置疑,按钮现在还处于“自然”状态。但请注意,文本字段是 - 我将它们放在故事板中的位置,但是当视图首次加载时我将它们隐藏起来。动画效果很好,但是当用户将焦点放在文本字段并且键盘隐藏字段时,我需要向上滚动视图。有关如何触发错误的细节有点难以解释,所以我设法将其归结为似乎是重绘事件,除了它不是......让我试着解释一下。

首先,这是键盘即将显示时发生的情况:

- (void)keyboardWillShow:(NSNotification*)notification
{
    CGRect frame = self.view.frame;
    frame.size.height -= 1;
    self.view.frame = frame;
}

请注意,这只是一个测试,可能是我发现仍会触发错误的最小值。它所做的只是调整视图大小。我希望视图与原来完全一样,只需少一个像素,对吗?错误。这是我得到的:

enter image description here

也就是说,所有元素都返回到“自然”位置,完全忽略了之前的位置。我的第一个猜测是,窗口似乎正在重绘,所以我尝试了这个:

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    NSLog(@"View was drawn");
}

但这仅在首次绘制窗口时触发,而不是在发生此奇怪行为时触发。要理解“自然位置”的含义,这就是我在故事板中的内容:

enter image description here

您还可以看到我没有使用约束和视图的基础结构:

enter image description here

整个设置的完整代码非常广泛,因此完全不实用。但是,我如何动画子视图继续像keyboardWillShow中那样更改框架,并将其位置设置为我需要的位置。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

所以你正在使用故事板,并且你已经使用了自动布局"整个故事板设置为false?

在这种情况下,您的应用正在使用" struts和spring"样式放置规则。您将不得不调试这些。

在帖子中的视图控制器中描述所有内容有点困难。在IB中更容易理解它。也许您可以编写一个实用程序函数来记录视图控制器中视图的所有autoresizingMask值,然后查看它们,并在此处发布它们,描述原始帖子中每个视图的autoresizingMask值。