gpt4 book ai didi

ios - 使用 Autoshrink 调整 UILabel 文本

转载 作者:行者123 更新时间:2023-11-30 13:17:23 27 4
gpt4 key购买 nike

背景

我正在创建一个应用程序,其中有一个动画,当键盘出现时,它会重新定位 UILabelUITextField 。设置如下:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(raiseTextField), name: UIKeyboardWillShowNotification, object: nil)

这是函数:

func raiseTextField(sender: NSNotification){
UIView.animateWithDuration(0.25, animations: { () -> Void in
self.userInputTextFieldBottomContstraint.constant = sender.userInfo![UIKeyboardFrameEndUserInfoKey]!.CGRectValue().size.height
self.view.layoutIfNeeded()
})
}

我的 Storyboard如下所示: Storyboard

我设置了约束,以便 friendInputView 具有正确的大小,并且它具有自动收缩功能,因此字体会相应调整。

问题

当我调用 raiseTextField() 时,一切正常,除了 friendInputView 的字体大小需要很长时间才能更改。它不是在动画发生时更新,而是在动画发生后更新。

它最终确实会调整,只是不是以首选速度。

我尝试在 animateWithDuration() 内部添加 self.friendInputLabel.adjustsFontSizeToFitWidth = true,但它似乎没有改变任何内容。

示例

抬起键盘之前:

(文字调整正确)

Before

抬起键盘后立即:

(文字大小太大)

Middle

抬起键盘后一秒钟左右:

(文字调整正确)

After

底线

有没有办法让 UILabel 以编程方式调整其文本大小,而不是仅仅等待它自行更新?与layoutIfNeeded()重新调整约束类似,是否有类似的函数可以重新调整Autoshrink?

编辑 1

我最终根据我得到的答案让它工作,该答案说使用 UITextFieldDelegate 而不是 NSNotificationCenter。我用以下代码替换了 raiseTextField() 函数:

func textFieldShouldBeginEditing(textField: UITextField) -> Bool {

self.userInputTextFieldBottomContstraint.constant = 250
self.view.setNeedsUpdateConstraints()
UIView.animateWithDuration(0.25, animations: { () -> Void in

self.view.layoutIfNeeded()
})

return true
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()

self.userInputTextFieldBottomContstraint.constant = 10
self.view.setNeedsUpdateConstraints()

UIView.animateWithDuration(0.25, animations: { () -> Void in
self.view.layoutIfNeeded()
})

return true
}

但是,现在我有一个新问题:如何让它使用真实的键盘尺寸?假设键盘尺寸始终为 250 并没有多大帮助。

我尝试通过创建这个变量来做到这一点:

var keyboardHeight: CGFloat?

将其放入viewDidLoad()中:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(setTheKeyboardHeight), name: UIKeyboardWillShowNotification, object: nil)

并创建这个函数:

func setTheKeyboardHeight(sender: NSNotification){
keyboardHeight = sender.userInfo![UIKeyboardFrameEndUserInfoKey]?.CGRectValue().height
}

然后我将其添加到 textFieldShouldBeginEditing() 中,如下所示:

self.userInputTextFieldBottomContstraint.constant = keyboardHeight!

self.view.setNeedsUpdateConstraints()

UIView.animateWithDuration(0.25, animations: { () -> Void in
self.view.layoutIfNeeded()
})

return true

但是,它最终只是给出了错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

我认为发生这种情况是因为 keyboardHeight 在调用 textFieldShouldBeginEditing() 后设置了 ,但我不知道如何修复它.

有什么方法可以在使用 textFieldShouldBeginEditing() 时访问键盘高度,还是必须使用 NSNotificationCenter

最佳答案

我已经做了与您所做的相同的演示,并且观察到 UIKeyboardNotification 的一些奇怪的行为,我不确定它是奇怪的还是只是这样,

我观察到的是,当您更改 UIKeyboardNotification 中的任何约束时,它会更改动画的约束常量(或帧),即使您没有使用 UIViewAnimationWithDuration block 。所以我认为这个延迟可能是由于 KeyboardNotification 添加的动画效果造成的,

func raiseTextField(sender: NSNotification){

self.bottomConstraintTextField.constant = 250//sender.userInfo![UIKeyboardFrameEndUserInfoKey]!.CGRectValue().size.height
self.view.setNeedsUpdateConstraints()

//As you can see i have commented the animation block, still it changes the constraint with animation.
//UIView.animateWithDuration(0.25, animations: { () -> Void in

self.view.layoutIfNeeded()
//})
}

因此,在您的场景中,我在 textFields 委托(delegate)中添加了动画代码,并且它按预期工作,

func textFieldShouldBeginEditing(textField: UITextField) -> Bool {

self.bottomConstraintTextField.constant = 250//sender.userInfo![UIKeyboardFrameEndUserInfoKey]!.CGRectValue().size.height
self.view.setNeedsUpdateConstraints()
UIView.animateWithDuration(0.25, animations: { () -> Void in

self.view.layoutIfNeeded()
})

return true
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()

self.bottomConstraintTextField.constant = 10
self.view.setNeedsUpdateConstraints()

UIView.animateWithDuration(0.25, animations: { () -> Void in
self.view.layoutIfNeeded()
})

return true
}

这是结果,

enter image description here

希望对您有帮助。

更新:

我已经解决了这个问题并找到了一种解决方法,因此您可以按如下方式执行此操作,而不是使用变量来保持键盘高度,

func raiseTextField(sender: NSNotification){

self.bottomConstraintTextField.constant = sender.userInfo![UIKeyboardFrameEndUserInfoKey]!.CGRectValue().size.height
self.view.setNeedsUpdateConstraints()

self.view.layoutIfNeeded()
}


func textFieldShouldBeginEditing(textField: UITextField) -> Bool {

self.bottomConstraintTextField.constant = 200
self.view.setNeedsUpdateConstraints()

UIView.animateWithDuration(0.25, animations: { () -> Void in

self.view.layoutIfNeeded()
})

return true
}

因此,同时拥有 textField 委托(delegate)和 KeyboardNotification 并更改 textField 委托(delegate)中的底部约束,它将在键盘通知之前被调用,通过这样做,您将不会观察到收缩标签文本的延迟。

查看下面更新后的效果,

enter image description here

关于ios - 使用 Autoshrink 调整 UILabel 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38089229/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com