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

StackOverflow https://stackoverflow.com/questions/1441760

Вопрос

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

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

Ваше здоровье,

Дуг

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top