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