UIView 不重绘,但元素错位

Posted

技术标签:

【中文标题】UIView 不重绘,但元素错位【英文标题】:UIView not redrawing, but elements become misplaced 【发布时间】:2014-10-12 03:07:09 【问题描述】:

我的应用程序布局存在问题,这有点难以解释。当应用程序第一次启动时,这就是我显示的内容:

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

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

首先,当键盘即将显示时会发生以下情况:

- (void)keyboardWillShow:(NSNotification*)notification

    CGRect frame = self.view.frame;
    frame.size.height -= 1;
    self.view.frame = frame;

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

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

- (void)drawRect:(CGRect)rect

    [super drawRect:rect];
    NSLog(@"View was drawn");

但这只会在第一次绘制窗口时触发,而不是在发生这种奇怪行为时触发。为了理解我所说的“自然位置”,这是我在故事板中的内容:

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

整个设置的完整代码非常广泛,因此展示起来根本不实用。但是,我如何为子视图设置动画,就像我在 keyboardWillShow 中所做的那样继续更改它们的框架,并将它们的位置设置为我需要的任何位置。

有什么想法吗?

【问题讨论】:

顺便说一句,如果有人知道如何减少这些图像.. 【参考方案1】:

所以您正在使用情节提要,并且您将整个情节提要的“使用自动布局”设置为 false?

在这种情况下,您的应用使用“struts and springs”样式放置规则。你将不得不调试那些。

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

【讨论】:

将“使用自动布局”设置为 false 解决了问题!但是,我将如何继续使用这种日志记录功能?什么是“支柱和弹簧”? “Struts and springs”是Mac OS老前辈在不使用AutoLayout时所说的布局方法。每个视图都有一个属性 autoresizingMask,它决定了如何调整它的大小。看一下 UIViewAutoresizing 的类型。它是 6 个常量的位掩码。例如,如果设置了 UIViewAutoresizingFlexibleLeftMargin,则视图可以在左边距上移动。如果没有,则将其固定在左边距。您必须编写一个方法来显示每个视图的标志设置的紧凑、可读形式。 我明白了。在这种情况下是否可以使用不使用自动布局?我担心我可能需要在其他情况下使用约束,或者你认为没有它我可以逃脱吗?

以上是关于UIView 不重绘,但元素错位的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 Xcode 故事板中的错位视图警告?

Primefaces数据表冻结列错位

错位排列及有关例题

生成所有错位排列的算法

在模拟器和移动设备中查看时布局错位

input元素相对父级元素错位了?IE7