ios 带有多行标题的UITextView

5kgi1eie  于 2022-12-15  发布在  iOS
关注(0)|答案(1)|浏览(168)

我面临着以下的挑战。我想做一个像标题一样的文本视图的第一行。它应该是多行的,直到用户点击返回按钮。这是苹果笔记视图的确切行为。

我已经走过了很多主题在这里,文章和库,并没有找到任何合适的。
你能不能给我提供一些如何实现类似行为的想法,或者推荐一个图书馆作为替代方案。

fae0ux8s

fae0ux8s1#

我只对它做了非常快速的测试,它的工作原理并不像苹果笔记,但它可能足以满足你的需要。

class FirstLineFormatVC: UIViewController, UITextViewDelegate {
    
    let tv = UITextView()
    
    let firstLineAttributes: [NSAttributedString.Key : Any] = [
        .font: UIFont.systemFont(ofSize: 20.0, weight: .bold),
    ]

    let normalAttributes: [NSAttributedString.Key : Any] = [
        .font: UIFont.systemFont(ofSize: 16.0, weight: .regular),
    ]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tv.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(tv)

        let g = view.safeAreaLayoutGuide
        NSLayoutConstraint.activate([
            
            tv.topAnchor.constraint(equalTo: g.topAnchor, constant: 20.0),
            tv.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 20.0),
            tv.trailingAnchor.constraint(equalTo: g.trailingAnchor, constant: -20.0),
            tv.heightAnchor.constraint(equalToConstant: 300.0),

        ])
    
        tv.delegate = self
        
        // give it a background color so we can see it
        tv.backgroundColor = .yellow
        
    }

    func textViewDidChange(_ textView: UITextView) {
        //formatTextInTextView(textView: textView)

        textView.isScrollEnabled = false
        let selectedRange = textView.selectedRange
        let text = textView.text ?? ""
        
        // set full string to normalAttributes
        let attributedString = NSMutableAttributedString(string: text, attributes: normalAttributes)
        
        // get the first line
        let range = text.lineRange(for: ..<text.startIndex)
        let nsRange = NSRange(range, in: text)
        
        // set first line to firstLineAttributes
        attributedString.addAttributes(firstLineAttributes, range: nsRange)
        
        // update the attributedText
        textView.attributedText = attributedString
        textView.selectedRange = selectedRange
        textView.isScrollEnabled = true

    }

}

希望这至少是个起点。

相关问题