在具有约束的 UIView 中移动 UITextField
Move UITextField in UIView that has constraints
我正在制作一个应用程序,用户可以在其中输入他们的汽车信息。我需要 UITextFields 向上移动,这样它们就不会被键盘覆盖。我用这段代码做到了。
func textFieldDidBeginEditing(_ textField: UITextField)
{
if make==textField
{
self.infoContainer.frame = self.infoContainer.frame.offsetBy(dx: 0, dy:-50)
}
if model==textField
{
self.infoContainer.frame = self.infoContainer.frame.offsetBy(dx: 0, dy:-75)
}
if color==textField
{
self.infoContainer.frame = self.infoContainer.frame.offsetBy(dx: 0, dy:-100)
}
}
在我将约束添加到 UIView *infoContainer 之前,效果很好。那么它只会工作一次。就像我点击制作它会向上移动 -50,或者如果我点击颜色它会向上移动 -100。但是在那之后它就不会再移动了。就像我点击 Make 它会向上移动 -50,但是如果我点击 Color 它不会移动到 -100。所以我试着改变约束。
func textFieldDidBeginEditing(_ textField: UITextField)
{
if make==textField
{
infoContainer.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(infoContainer)
let leadingConstraint = infoContainer.leadingAnchor.constraint(equalTo: self.view.leadingAnchor)
let trailingConstraint = infoContainer.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
let topConstraint = infoContainer.topAnchor.constraint(equalTo: self.view.topAnchor, constant: -50)
let bottomConstraint = infoContainer.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -50)
initialConstraints.append(contentsOf: [leadingConstraint,trailingConstraint,topConstraint,bottomConstraint])
NSLayoutConstraint.activate(initialConstraints)
}
if model==textField
{
infoContainer.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(infoContainer)
let leadingConstraint = infoContainer.leadingAnchor.constraint(equalTo: self.view.leadingAnchor)
let trailingConstraint = infoContainer.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
let topConstraint = infoContainer.topAnchor.constraint(equalTo: self.view.topAnchor, constant: -75)
let bottomConstraint = infoContainer.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -75)
initialConstraints.append(contentsOf: [leadingConstraint,trailingConstraint,topConstraint,bottomConstraint])
NSLayoutConstraint.activate(initialConstraints)
}
if color==textField
{
infoContainer.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(infoContainer)
let leadingConstraint = infoContainer.leadingAnchor.constraint(equalTo: self.view.leadingAnchor)
let trailingConstraint = infoContainer.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
let topConstraint = infoContainer.topAnchor.constraint(equalTo: self.view.topAnchor, constant: -100)
let bottomConstraint = infoContainer.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -100)
initialConstraints.append(contentsOf: [leadingConstraint,trailingConstraint,topConstraint,bottomConstraint])
NSLayoutConstraint.activate(initialConstraints)
}
}
这个效果好一点。如果我单击使其向上移动 -50,然后模型向上移动 -75,然后颜色向上移动 -100。但随后它不会向下移动,就像我再次单击 Make 它不会向下移动到 -50 一样。我什至将颜色设置为 +50。当我单击颜色时,它会下降 +50,然后当我单击“制作”时,它会向上移动到 -50,而模型会将它向上移动 -75。但如果我再次单击颜色,它不会回落到 +50。我哪里错了?
问题是你每次移动都添加约束,这随着时间的推移会产生冲突,所以你只需要添加一次约束,并调整你想要移动的约束的常量值,而不是这样做
1- 在 viewDidLoad
中添加此代码片段
var bottomConstraint:NSLayoutConstraint!
//
infoContainer.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(infoContainer)
let leadingConstraint = infoContainer.leadingAnchor.constraint(equalTo: self.view.leadingAnchor)
let trailingConstraint = infoContainer.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
let topConstraint = infoContainer.topAnchor.constraint(equalTo: self.view.topAnchor, constant: -50)
bottomConstraint = infoContainer.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -50)
initialConstraints.append(contentsOf: [leadingConstraint,trailingConstraint,topConstraint,bottomConstraint])
NSLayoutConstraint.activate(initialConstraints)
2-
func textFieldDidBeginEditing(_ textField: UITextField)
{
if make == textField
{
self.bottomConstraint.constant = -50
}
if model == textField
{
self.bottomConstraint.constant = -75
}
if color == textField
{
self.bottomConstraint.constant = -100
}
self.view.layoutIfNeeded()
// you can animate it to
/*
UIView.animate(withDuration:0.5) {
self.view.layoutIfNeeded()
} */
}
如果你想
,你可以对 topConstraint
做同样的事情
我正在制作一个应用程序,用户可以在其中输入他们的汽车信息。我需要 UITextFields 向上移动,这样它们就不会被键盘覆盖。我用这段代码做到了。
func textFieldDidBeginEditing(_ textField: UITextField)
{
if make==textField
{
self.infoContainer.frame = self.infoContainer.frame.offsetBy(dx: 0, dy:-50)
}
if model==textField
{
self.infoContainer.frame = self.infoContainer.frame.offsetBy(dx: 0, dy:-75)
}
if color==textField
{
self.infoContainer.frame = self.infoContainer.frame.offsetBy(dx: 0, dy:-100)
}
}
在我将约束添加到 UIView *infoContainer 之前,效果很好。那么它只会工作一次。就像我点击制作它会向上移动 -50,或者如果我点击颜色它会向上移动 -100。但是在那之后它就不会再移动了。就像我点击 Make 它会向上移动 -50,但是如果我点击 Color 它不会移动到 -100。所以我试着改变约束。
func textFieldDidBeginEditing(_ textField: UITextField)
{
if make==textField
{
infoContainer.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(infoContainer)
let leadingConstraint = infoContainer.leadingAnchor.constraint(equalTo: self.view.leadingAnchor)
let trailingConstraint = infoContainer.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
let topConstraint = infoContainer.topAnchor.constraint(equalTo: self.view.topAnchor, constant: -50)
let bottomConstraint = infoContainer.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -50)
initialConstraints.append(contentsOf: [leadingConstraint,trailingConstraint,topConstraint,bottomConstraint])
NSLayoutConstraint.activate(initialConstraints)
}
if model==textField
{
infoContainer.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(infoContainer)
let leadingConstraint = infoContainer.leadingAnchor.constraint(equalTo: self.view.leadingAnchor)
let trailingConstraint = infoContainer.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
let topConstraint = infoContainer.topAnchor.constraint(equalTo: self.view.topAnchor, constant: -75)
let bottomConstraint = infoContainer.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -75)
initialConstraints.append(contentsOf: [leadingConstraint,trailingConstraint,topConstraint,bottomConstraint])
NSLayoutConstraint.activate(initialConstraints)
}
if color==textField
{
infoContainer.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(infoContainer)
let leadingConstraint = infoContainer.leadingAnchor.constraint(equalTo: self.view.leadingAnchor)
let trailingConstraint = infoContainer.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
let topConstraint = infoContainer.topAnchor.constraint(equalTo: self.view.topAnchor, constant: -100)
let bottomConstraint = infoContainer.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -100)
initialConstraints.append(contentsOf: [leadingConstraint,trailingConstraint,topConstraint,bottomConstraint])
NSLayoutConstraint.activate(initialConstraints)
}
}
这个效果好一点。如果我单击使其向上移动 -50,然后模型向上移动 -75,然后颜色向上移动 -100。但随后它不会向下移动,就像我再次单击 Make 它不会向下移动到 -50 一样。我什至将颜色设置为 +50。当我单击颜色时,它会下降 +50,然后当我单击“制作”时,它会向上移动到 -50,而模型会将它向上移动 -75。但如果我再次单击颜色,它不会回落到 +50。我哪里错了?
问题是你每次移动都添加约束,这随着时间的推移会产生冲突,所以你只需要添加一次约束,并调整你想要移动的约束的常量值,而不是这样做
1- 在 viewDidLoad
var bottomConstraint:NSLayoutConstraint!
//
infoContainer.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(infoContainer)
let leadingConstraint = infoContainer.leadingAnchor.constraint(equalTo: self.view.leadingAnchor)
let trailingConstraint = infoContainer.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
let topConstraint = infoContainer.topAnchor.constraint(equalTo: self.view.topAnchor, constant: -50)
bottomConstraint = infoContainer.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -50)
initialConstraints.append(contentsOf: [leadingConstraint,trailingConstraint,topConstraint,bottomConstraint])
NSLayoutConstraint.activate(initialConstraints)
2-
func textFieldDidBeginEditing(_ textField: UITextField)
{
if make == textField
{
self.bottomConstraint.constant = -50
}
if model == textField
{
self.bottomConstraint.constant = -75
}
if color == textField
{
self.bottomConstraint.constant = -100
}
self.view.layoutIfNeeded()
// you can animate it to
/*
UIView.animate(withDuration:0.5) {
self.view.layoutIfNeeded()
} */
}
如果你想
,你可以对topConstraint
做同样的事情