以编程方式调整 UITextField 的大小会自动恢复为旧大小

Posted

技术标签:

【中文标题】以编程方式调整 UITextField 的大小会自动恢复为旧大小【英文标题】:Resizing a UITextField programmatically automatically reverts back to old size 【发布时间】:2014-05-19 21:08:24 【问题描述】:

在某个用户操作后,我希望调整 UITextField 的大小并将其向右移动:例如

CGRect oldFrame = self.sampleTextField.frame;
CGRect newFrame = CGRectMake(oldFrame.origin.x + 100,
                             oldFrame.origin.y, 
                             oldFrame.size.width - 100, 
                             oldFrame.size.height);
[self.sampleTextField setFrame:newFrame];

这会持续大约半秒,然后UITextField 会快速恢复到它原来的、未经编辑的帧中。

UITextField 位于情节提要中,但我已从中删除所有自动布局约束。

是自动布局将UITextField 返回到原来的帧吗?

有没有办法通过我当前的设置实现这一点,还是我必须将 UITextField 从情节提要中取出并以编程方式将其添加到视图中?

【问题讨论】:

如果您使用 AutoLayout,您应该调整约束而不是调整框架。 向我们展示您操纵sampleTextField的任何地方。 @Jonathan 我考虑过这一点,但我发现以编程方式调整约束非常棘手,因此我按照我提出的方式提出了这个问题! @CrimsonChris 这就是我在sampleTextField上所做的所有操作 @messinga,您所要做的就是调整常数值。除非您绝对需要删除约束并重新添加它们。例如,您将 100 添加到 X 轴,因此您可以将前导(左)约束的常量设置为 += 100。您还从宽度中减去 100,因此您需要做的就是将宽度约束的常量设置为 -= 100. 然后,您可以根据需要为更改设置动画。当然,这一切都取决于您当前的限制条件。 【参考方案1】:

如果您在不向元素添加任何约束的情况下构建和运行,您会发现 Interface Builder 固定元素的宽度和高度,并固定其相对于元素的位置超级视图的左上角。

要使您的界面对大小或方向的变化做出正确反应,您需要开始添加约束。您还可以在设置框架并将translatesAutoresizingMaskIntoConstraints 设置为NO 之前以编程方式删除自动添加的约束。

【讨论】:

这回答了我的第一个问题,即 Interface Builder 对自动布局做了什么……很高兴知道。不幸的是,setTranslatesAutoresizingMaskIntoConstraints:NO 似乎确实解决了确切的问题,但它会对视图的其余部分造成进一步的问题。 根据您对translatesAutoresizingMaskIntoConstraints 的建议...我将UITextField 包装在UIView 中,然后在包装UIView 上设置setTranslatesAutoresizingMaskIntoConstraints:NO。它似乎已经成功了。不是一个非常优雅的解决方案,但它有效。在标记正确答案之前,我会等待看看是否有人有更好的解决方案。【参考方案2】:

完成您想要的最简单的方法是在 IB 中添加适当的约束(左边缘、顶部或底部边缘和宽度),并将 IBOutlets 设置为左​​侧约束和宽度约束(我将它们称为 leftCon和宽度Con)。然后在代码中调整这些约束的常量值,

self.leftCon.constant += 100;
self.widthCon.constant -= 100;

如果你想对其进行动画处理,则将它们放入(或就在上面,无论哪种方式都可以)一个动画块中,

- (void)adjustTextField 
    self.leftCon.constant += 100;
    self.widthCon.constant -= 100;
    [UIView animateWithDuration:1 animations:^
        [self.view layoutIfNeeded];
    ];

【讨论】:

以上是关于以编程方式调整 UITextField 的大小会自动恢复为旧大小的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建 UILabel、UITextField 等时的图形错误

如何以编程方式设置 UIView 的自动调整大小掩码?

如何以编程方式调整自定义视图的大小?

调整大小后使用自动布局以编程方式居中 UIImageVIew

以编程方式调整布局大小(作为动画)

如何以编程方式调整按钮动画的大小