#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. Когда вы используете чистую автоматическую компоновку с видом прокрутки, вы не касаетесь свойства рамки какого-либо вида (это делают ограничения) и не устанавливаете размер содержимого вида прокрутки (фактически это рассматривается как свойство только для готовности).