Подтвердить что ты не робот

Как принудительно перерисовать (drawRect) SubView при изменении размеров?

У меня есть UIView, который содержит строку подклассов UIView. Подкласс переопределил drawRect: и установил contentMode = UIViewContentModeRedraw.

Так как пользователь сквозит и растягивает родительский контейнер child views squash и stretch. По мере изменения формы я хотел бы, чтобы drawRect вызывал многократно, чтобы изменить содержимое child views. До сих пор я не увенчалась успехом. Каков правильный способ сделать это?

Приветствия,

Дуга

4b9b3361

Ответ 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
}

Это... отлично.