Динамически настраивайте UIScrollView contentSize в зависимости от общего размера UIView и UITextView - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть проект, в котором есть viewController, и внутри него есть представление Scroll, в котором UILabel и UITextView являются подпредставлениями. Каждый раз, открывая приложение, я извлекаю данные из базы данных Google Firestore и, следовательно, обновляет UILabel как заголовок, а UITextView - как текстовое тело. Я установил ограничения, и все работает отлично. Однако я не знаю, как рассчитать высоту contentView UIScrollView, если размер textView превышает границы представления UIViewController, так что вы можете прокрутить вниз, чтобы прочитать остальную часть текста. У меня также есть вкладка внизу, которая означает, что представление прокрутки должно быть остановлено выше этого.

Вот мой код.

    import UIKit

class StoryViewController: UIViewController {

    var storyTitle = String()
    var storyBody = ""


    let titleLabel: UILabel = {
        let label = UILabel()
        label.textAlignment = .center
        label.numberOfLines = 0
        label.font = UIFont(name: "Arial-BoldMT", size: 28)
        label.textColor = UIColor.black
        label.translatesAutoresizingMaskIntoConstraints = false

        return label
    }()

    let textView: UITextView = {
        let textView = UITextView()
        textView.textAlignment = .left
        textView.isEditable = false
        textView.isSelectable = false
        textView.font = UIFont(name: "ArialMT", size: 19)
        textView.isScrollEnabled = false
        textView.translatesAutoresizingMaskIntoConstraints = false

        return textView
    }()

    let scrollView: UIScrollView = {
        let scrollingView = UIScrollView()
        scrollingView.translatesAutoresizingMaskIntoConstraints = false
        return scrollingView
    }()


    override func viewDidLoad() {
        super.viewDidLoad()

        self.navigationController?.navigationBar.shadowImage = UIImage()
        self.view.backgroundColor = UIColor.white


        titleLabel.text = storyTitle
        textView.text = storyBody.replacingOccurrences(of: "NL", with: "\n\n")
        textView.sizeToFit()

        scrollView.contentSize = CGSize(width: self.view.frame.width, height: textView.contentSize.height)

        view.addSubview(scrollView)

        scrollView.addSubview(titleLabel)
        scrollView.addSubview(textView)

        NSLayoutConstraint.activate([

        scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
        scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),


        titleLabel.leadingAnchor.constraint(equalTo: scrollView.readableContentGuide.leadingAnchor),
        titleLabel.trailingAnchor.constraint(equalTo: scrollView.readableContentGuide.trailingAnchor),
        titleLabel.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 16),
        titleLabel.bottomAnchor.constraint(equalTo: textView.topAnchor, constant: -16),
        titleLabel.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),


        textView.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 16),
        textView.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),
        textView.leadingAnchor.constraint(equalTo: scrollView.readableContentGuide.leadingAnchor),
        textView.trailingAnchor.constraint(equalTo: scrollView.readableContentGuide.trailingAnchor),


        ])

Я пробовал много вещей, но, похоже, ничего не работает .

Спасибо всем за ваше время и ответы заранее.

1 Ответ

0 голосов
/ 08 апреля 2020

Вы близки ... но вам не нужно беспокоиться о настройке .contentSize вида прокрутки. Позвольте автоматическому макету обработать это для вас.

Ключевым моментом, который вы пропустили, было ограничение bottom для подпредставлений вашего представления прокрутки.

Вот ваш класс (с примером заголовок и основной текст), только слегка изменены, чтобы работать. Комментарии, которые я добавил, должны прояснить:

class StoryViewController: UIViewController {

    var storyTitle = String()
    var storyBody = ""

    let titleLabel: UILabel = {
        let label = UILabel()
        label.textAlignment = .center
        label.numberOfLines = 0
        label.font = UIFont(name: "Arial-BoldMT", size: 28)
        label.textColor = UIColor.black
        label.translatesAutoresizingMaskIntoConstraints = false

        return label
    }()

    let textView: UITextView = {
        let textView = UITextView()
        textView.textAlignment = .left
        textView.isEditable = false
        textView.isSelectable = false
        textView.font = UIFont(name: "ArialMT", size: 19)
        textView.isScrollEnabled = false
        textView.translatesAutoresizingMaskIntoConstraints = false

        return textView
    }()

    let scrollView: UIScrollView = {
        let scrollingView = UIScrollView()
        scrollingView.translatesAutoresizingMaskIntoConstraints = false
        return scrollingView
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.navigationController?.navigationBar.shadowImage = UIImage()
        self.view.backgroundColor = UIColor.white

        // sample Title and Body
        storyTitle = "Example\nTitle Label"

        storyBody = ""
        storyBody += "UITextView:"
        storyBody += "NL"
        storyBody += "When a user taps a text view, a keyboard appears; when a user taps Return in the keyboard, the keyboard disappears and the text view can handle the input in an application-specific way. You can specify attributes, such as font, color, and alignment, that apply to all text in a text view."
        storyBody += "NL"
        storyBody += "UIScrollView:"
        storyBody += "NL"
        storyBody += "UIScrollView provides a mechanism to display content that is larger than the size of the application’s window and enables users to scroll within that content by making swiping gestures."
        storyBody += "NL"
        storyBody += "UILabel:"
        storyBody += "NL"
        storyBody += "A label can contain an arbitrary amount of text, but UILabel may shrink, wrap, or truncate the text, depending on the size of the bounding rectangle and properties you set. You can control the font, text color, alignment, highlighting, and shadowing of the text in the label."
        storyBody += "NL"
        storyBody += "UIButton:"
        storyBody += "NL"
        storyBody += "You can set the title, image, and other appearance properties of a button. In addition, you can specify a different appearance for each button state."

        titleLabel.text = storyTitle
        textView.text = storyBody.replacingOccurrences(of: "NL", with: "\n\n")

        // you do not need either of these two lines
        //textView.sizeToFit()
        //scrollView.contentSize = CGSize(width: self.view.frame.width, height: textView.contentSize.height)

        view.addSubview(scrollView)

        scrollView.addSubview(titleLabel)
        scrollView.addSubview(textView)

        NSLayoutConstraint.activate([

            scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
            scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),

            // don't use .centerXAnchor constraints
            //titleLabel.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),
            //textView.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),

            // don't need to set titleLabel bottom constraint
            //titleLabel.bottomAnchor.constraint(equalTo: textView.topAnchor, constant: -16),

            titleLabel.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 16),
            titleLabel.leadingAnchor.constraint(equalTo: scrollView.readableContentGuide.leadingAnchor),
            titleLabel.trailingAnchor.constraint(equalTo: scrollView.readableContentGuide.trailingAnchor),

            textView.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 16),
            textView.leadingAnchor.constraint(equalTo: scrollView.readableContentGuide.leadingAnchor),
            textView.trailingAnchor.constraint(equalTo: scrollView.readableContentGuide.trailingAnchor),

            // set the textView's bottomAnchor to let auto-layout determine content size
            textView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),

        ])

    }
}
...