Как принудительно перерисовать (drawRect) подпредставления при изменении его размеров?
-
10-07-2019 - |
Вопрос
У меня есть UIView, который содержит ряд подклассов UIView
.Подкласс переопределил drawRect
:и установил contentMode = UIViewContentModeRedraw
.
Когда пользователь сжимает и растягивает родительский контейнер, child views
сжимать и растягивать.Когда происходит изменение формы, я хотел бы иметь drawRect
неоднократно вызывался для изменения содержимого child views
.Пока что мне это не удалось.Как правильно это сделать?
Ваше здоровье,
Дуг
Решение
В Cocoa вы редко (если вообще когда-либо) вызываете drawRect — вы просто отмечаете регион или представление как требующее обновления, и оно будет запланировано для перерисовки.Это позволяет сворачивать перерисовки для нескольких недействительных данных.
Для Cocoa Touch вам нужно либо [просмотреть setNeedsDisplay], или setNeedsDisplayinRect:(CGRect)
Другие советы
Вам нужно вызвать [view setNeedsLayout], это должно привести к тому, что подпредставления получат drawRect:звоните, если изменится планировка.Однако я это не проверял.
Это решение немного безумное, но оно имеет логический смысл и дает отличный визуальный результат.Я работаю с NSLayoutManager
и пара NSTextContainer
s, располагая текст в две колонки.Поскольку я использую несколько текстовых контейнеров (и не уверен, что мне нужно несколько UITextView
), я переопределяю draw(rect: CGRect)
метод MyDrawingView: UIView
.
Проблема в том, что использование self.contentMode = .redraw
по-прежнему приводит к небольшому растяжению при вращении, достаточно значительному, чтобы нарушить условия сделки.
Я заметил эту настройку contentMode = .left
, или даже contentMode = .scaleAspectFit
было близко к тому, что я хотел, с точки зрения идеального вращения по пикселям.Но, очевидно, я не получил нужного мне вызова.
Итак, я преодолел layoutSubviews()
, переключил contentMode
к .scaleAspectFit
, называется super.layoutSubviews()
, а затем переключил его обратно.:П
override func layoutSubviews() {
self.contentMode = .scaleAspectFit
super.layoutSubviews()
self.contentMode = .redraw
}
Это замечательно.