Swift 调整视图大小时textview会抖动

Swift 调整视图大小时textview会抖动,swift,uitextview,Swift,Uitextview,我正在调整textview所属视图的大小,当视图变大或变小时,文本会抖动 上述文本视图的声明: lazy var textview: UITextView = { let textView = UITextView() textView.text = "" textView.font = .systemFont(ofSize: 12, weight: UIFontWeightMedium) textView.isScrollEnab

我正在调整textview所属视图的大小,当视图变大或变小时,文本会抖动

上述文本视图的声明:

lazy var textview: UITextView = {
        let textView = UITextView()
        textView.text = ""
        textView.font = .systemFont(ofSize: 12, weight: UIFontWeightMedium)
        textView.isScrollEnabled = false
        textView.isEditable = false
        textView.isSelectable = true
        textView.isUserInteractionEnabled = true
        textView.translatesAutoresizingMaskIntoConstraints = false
        textView.textAlignment = .center
        textView.textColor = .lightGray
        textView.dataDetectorTypes = .link
        return textView
    }()
我正在调整它所在的视图的大小,以适应像这样的全屏幕

if let window = UIApplication.shared.keyWindow  {
    let statusBarHeight = UIApplication.shared.statusBarFrame.size.height

    UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveLinear, animations: {

        self.frame = CGRect(x: 0, y: statusBarHeight, width: window.frame.width, height: window.frame.height - statusBarHeight)

        self.layer.cornerRadius = 0

        self.layoutIfNeeded()

    }, completion: nil)
}
执行此操作后,视图会完美展开,但textviews文本会产生反弹效果,使动画看起来非常不专业。。。有什么建议吗


编辑:当我删除“居中文本对齐”选项时,它似乎可以正常工作。如何使其与文本中心对齐?

编辑:我重新审视了这一点,并尝试使用基于中的技术

这里有一个最小的工作示例,其中文本视图以文本为中心对齐,这对我很有用

我建议将动画管理为全部基于约束或全部基于帧。我尝试了一个版本,其中动画是通过更新容器视图帧来驱动的,但在这种基于约束的方法中,将其保留太长时间

希望这为您指明了正确的方向:)


这不是问题的原因,但请注意,您的代码毫无意义。为什么要更改帧并调用
layoutifneed
?@matt删除layoutifneed会使动画变得松散平滑。。我不知道为什么。Thanks@matt如果要删除TextView约束,请设置帧动画。。然后读它们?所有的动画都很好,只是文本视图文本产生了一种奇怪的反弹效果,在离开
self时更改动画。layoutIfNeeded()
不会更改任何内容。然后,删除self.layoutifneed()不会使textview反弹,但整个动画看起来很笨重。。更糟的是。。。一点也不顺利。还有其他想法吗?谢谢@Mathews我正在更新的框架属于一个视图,其中有一个文本视图和许多其他视图。。。我不知道如何不改变视图的大小,只有文本视图才能解决这个问题。我正在更新一个视图以占据整个框架,其中的文本视图也随之调整大小。。。它只是有一个反弹效果。。。我不想产生反弹效果,只想调整最外层视图的大小,并让内部视图根据其约束条件调整大小。请使用其他代码更新您的问题,以提供更多有关所发生情况的上下文,目前,这还不是一个足够完整的示例,无法理解Gi提供的所有相关代码。我的视野占了一些空间。它有一个文本视图,图像视图。。。里面有一些钮扣。当我调整视图的大小时。。。就像上面的代码一样。。。除了文本视图中的文本反弹外,所有内容都是平滑的。。当它调整大小时。。。我不确定除了整个项目之外,还有哪些代码可以提供潜在的帮助
import UIKit

class ViewController: UIViewController {

    lazy var textView: UITextView = {
        let textView = UITextView()
        textView.text = "testing text view"
        textView.textAlignment = .center
        textView.translatesAutoresizingMaskIntoConstraints = false
        return textView
    }()

    lazy var containerView: UIView = {
        let view = UIView()
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    var widthConstraint: NSLayoutConstraint!
    var topAnchor: NSLayoutConstraint!

    override func viewDidLoad() {

        view.backgroundColor = .groupTableViewBackground

        // add container view and constraints
        view.addSubview(containerView)
        containerView.frame = view.bounds.insetBy(dx: 100, dy: 200)
        containerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        containerView.heightAnchor.constraint(equalToConstant: 100).isActive = true

        // keep reference to topAnchor and width as properties to animate
        topAnchor = containerView.topAnchor.constraint(lessThanOrEqualTo: view.topAnchor, constant: 100)
        widthConstraint = containerView.widthAnchor.constraint(equalToConstant: 300)
        topAnchor.isActive = true
        widthConstraint.isActive = true

        // add text view to container view and set constraints
        containerView.addSubview(textView)
        textView.leftAnchor.constraint(equalTo: containerView.leftAnchor).isActive = true
        textView.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true
        textView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
        textView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true
    }

    @IBAction func toggleResize(_ sender: UIButton) {

        sender.isSelected = !sender.isSelected

        view.layoutIfNeeded()
        widthConstraint.constant = sender.isSelected ? view.bounds.width : 300
        topAnchor.constant = sender.isSelected ? 20 : 100

        // caculate the textView content offset for starting position based on
        // expected end position at end of the animation
        let xOffset = (textView.bounds.width - widthConstraint.constant) / 2
        textView.contentOffset = CGPoint(x: -xOffset, y: textView.contentOffset.y)

        UIView.animate(withDuration: 1) {
            self.view.layoutIfNeeded()
        }
    }
}