以编程方式调整 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 等时的图形错误