Понимание UIScrollView contentSize.height

#ios #uiscrollview

#iOS #uiscrollview

Вопрос:

Я немного смущен этим. У меня очень простая настройка. У меня есть UIScrollView, который ограничен супервизором ViewController с помощью 0,0,0,0. А затем UILabel, который ограничен UIScrollView с помощью 8,8,8,8.

У меня есть расширение строки, чтобы получить высоту метки с определенным шрифтом.

 extension String {
    func heightWithConstrainedWidth(width: CGFloat, font: UIFont) -> CGFloat {
        let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
        let boundingBox = self.boundingRect(with: constraintRect, options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: [NSAttributedString.Key.font: font], context: nil)
        return boundingBox.height
    }
}
  

В viewDidLoad я настроил свой ярлык. (UILabel устанавливается для количества строк равным 0 и переноса слов).

 let text = "some really long text" // actually really long text in my sample
let width = view.frame.width
let font: UIFont! = UIFont(name: "HelveticaNeue-UltraLight", size: 42)
let height = text.heightWithConstrainedWidth(width: width, font: font)
print("height first: (height)") // 1080
  

Затем я установил свой ScrollView.contentSize на этот размер

 scrollView.contentSize = CGSize(width: view.frame.width, height)
print("new height: (scrollView.contentSize.height)") // 1080
  

Но в scrollViewDidScroll, если я распечатаю там высоту

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
    print("scrollView.contentSize.height: (scrollView.contentSize.height)") // 3440
}
  

Мне было интересно, почему в scrollViewDidScroll высота содержимого ScrollView равна 3440, а не 1080. Это 1080 после того, как я ввел текст для метки и настроил размер содержимого.

Я бы подумал, что если размер равен 3440, я бы увидел, что после того, как я установлю contentSize для ScrollView, он не изменится в методе делегирования scrollViewDidScroll. Это потому, что я использую автоматическую компоновку, а автоматическая компоновка не вычисляет размер contentSize, пока вы не начнете прокрутку или что-то в этом роде?

Комментарии:

1. В вашем коде нигде нет автоматической компоновки?

2. @bsod автоматическое описание находится в Interface Builder

3. И почему вы устанавливаете размер содержимого в режиме прокрутки?

4. @bsod, потому что я динамически настраиваю свой текст в viewDidLoad. Это долго, поэтому я подумал, что могу установить его в viewDidLoad. Должен ли я устанавливать свои ограничения в коде после настройки текста, чтобы получить более детерминированное поведение?

5. Когда вы используете чистую автоматическую компоновку с видом прокрутки, вы не касаетесь свойства рамки какого-либо вида (это делают ограничения) и не устанавливаете размер содержимого вида прокрутки (фактически это рассматривается как свойство только для готовности).