it-swarm.com.ru

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

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

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

Ура,

Doug

23
dugla

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

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

58
Adam Wright

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

3
Pascal

Это решение немного сумасшедшее, но оно логично и имеет отличный визуальный результат. Я работаю с NSLayoutManager и парой NSTextContainers, выкладывая текст в два столбца. Поскольку я использую несколько текстовых контейнеров (и я не уверен, что мне нужно несколько 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
}

Это замечательно.

0
Stan