代码之家  ›  专栏  ›  技术社区  ›  chornbe

在封闭的文本视图中使用动态字体自动调整视图大小

  •  0
  • chornbe  · 技术社区  · 7 年前

    这是一个我在这里找不到匹配的案例。

    我有一个包含uitextview的小uiview,uiview需要围绕textview自动调整大小,以便在另一个视图上显示。基本上,文本视图需要完全填充uiview,并且uiview应该足够大以包含文本视图。

    textView只包含几个句子,这些句子将一直停留在屏幕上,直到发生外部事件,并且某些值发生更改。

    当我使用固定大小的字体时,一切都很好。

    但是嘿…我是个老家伙,我的手机上有一点文字大小。在我的设备上测试它可以显示我在哪里丢失了什么东西。

    在textview属性中使用动态字体样式“title 2”,并在textview属性中打开“自动调整字体”,使文本大于默认值时,似乎在创建时没有正确捕获textview增长的大小(使用较大的文本)。把新的边界矩形扔到框架上。它返回的值看起来很像较小的、默认大小的文本值,而不是增加的文本大小。

    下面是代码,视图的类代码以及调用代码(在这里发布是非常明确的)。我觉得我可能会错过一些愚蠢的事情,比如在字体出现问题后捕捉大小,但即使将此代码移动到一个新的函数中,并在控件完全绘制后显式调用它,似乎也做不到这一点。

    我希望这有道理。

    谢谢大家。

    呼叫代码:

    let noWView:NoWitnessesYetView = (Bundle.main.loadNibNamed("NoWitnessesYetView", owner: nil, options: nil)!.first as! NoWitnessesYetView)
    //if nil != noWView {
    let leftGutter:CGFloat = 20.0
    let bottomGutter:CGFloat = 24.0
    let newWidth = self.view.frame.width - ( leftGutter + leftGutter )
    let newTop = (eventMap.frame.minY + eventMap.frame.height) - ( noWView.frame.height + bottomGutter ) // I suspect here is the issue
    // I suspect that loading without drawing is maybe not allowing 
    // the fonts to properly draw and the 
    // TextView to figure out the size...?
    noWView.frame = CGRect(x: 20, y: newTop, width: newWidth, height: noWView.frame.height)
    self.view.addSubview(noWView)
    //}
    

    类别代码:

    import UIKit
    class NoWitnessesYetView: UIView {
        @IBOutlet weak var textView: EyeneedRoundedTextView!
        override func draw(_ rect: CGRect) {
            let newWidth = self.frame.width
            // form up a dummy size just to get the proper height for the popup
            let workingSize:CGSize = self.textView.sizeThatFits(CGSize(width: newWidth, height: CGFloat(MAXFLOAT)))
            // then build the real newSize value
            let newSize = CGSize(width: newWidth, height: workingSize.height)
            textView.frame.size = newSize
            self.textView.isHidden = false
        }
        override func awakeFromNib() {
            super.awakeFromNib()
            self.backgroundColor = UIColor.clear // .blue
            self.layer.cornerRadius = 10
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   swiftIos    7 年前

    这一完美的方法内容来自: https://www.youtube.com/watch?v=0Jb29c22xu8 .

    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // let's create our text view
            let textView = UITextView()
            textView.frame = CGRect(x: 0, y: 0, width: 200, height: 100)
            textView.backgroundColor = .lightGray
            textView.text = "Here is some default text that we want to show and it might be a couple of lines that are word wrapped"
    
            view.addSubview(textView)
    
            // use auto layout to set my textview frame...kinda
            textView.translatesAutoresizingMaskIntoConstraints = false
            [
                textView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
                textView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
                textView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
                textView.heightAnchor.constraint(equalToConstant: 50)
                ].forEach{ $0.isActive = true }
    
            textView.font = UIFont.preferredFont(forTextStyle: .headline)
    
            textView.delegate = self
            textView.isScrollEnabled = false
    
            textViewDidChange(textView)
        }
    
    }
    
    extension ViewController: UITextViewDelegate {
    
        func textViewDidChange(_ textView: UITextView) {
            print(textView.text)
            let size = CGSize(width: view.frame.width, height: .infinity)
            let estimatedSize = textView.sizeThatFits(size)
    
            textView.constraints.forEach { (constraint) in
                if constraint.firstAttribute == .height {
                    constraint.constant = estimatedSize.height
                }
            }
        }
    
    }