Как принудительно перерисовать (drawRect) подпредставления, когда оно изменяет размеры? - PullRequest
23 голосов
/ 18 сентября 2009

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

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

Приветствия

Doug

Ответы [ 3 ]

59 голосов
/ 18 сентября 2009

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

Для Cocoa Touch требуется либо [просмотр setNeedsDisplay] , либо setNeedsDisplayinRect: (CGRect)

3 голосов
/ 12 октября 2009

Вам нужно вызвать [view setNeedsLayout], это должно заставить подпредставления получить вызов drawRect: при изменении макета. Однако я этого не проверял.

0 голосов
/ 08 июля 2017

Это решение немного сумасшедшее, но оно логично и имеет отличный визуальный результат. Я работаю с 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
}

Это ... идеально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...