Обновление родительского UIScrollView contentSize после drawRect подпредставления - PullRequest
2 голосов
/ 19 апреля 2011

У меня есть UIScrollView с UIView в нем.

Я не знаю размер подпредставления, пока в нем не будет отображено все, что должно быть отображено, и это может измениться на более поздних чертежах.(Он содержит таблицы, текст и т. Д., Которые добавляются по крупицам).Итак, мне нужно обновить размер содержимого представления прокрутки в момент завершения drawRect подпредставления.

Есть ли хороший способ вызвать требуемые [myScrollView setContentSize] & [mySubView setNeedsDisplay] (это вызывает drawRect, поэтому яБудете ли вы предпринимать шаги, чтобы избежать бесконечных циклов) после drawRect или любого другого решения, которое на самом деле работает в этой ситуации?

Кажется, нужно вызвать setNeedsDisplay для подпредставления, прежде чем будет произведено изменение размера контента.Все, что мне нужно сделать, это установить setContentSize из drawRect вложенного представления, затем я нажимаю кнопку, которая запускает setNeedsDisplay, затем contentSize обновляется нормально.Так что я мог бы просто установить таймер и ждать следующего цикла выполнения, чтобы сделать setNeedsDisplay?Но это ужасный хак.Кроме того, я предполагаю, что изменение размера содержимого в коде, вызываемом из drawRect подпредставления, - нет-нет, если UIKit полагается на постоянную иерархию представления, в то время как это находится в середине рисования иерархии представления.

Ответы [ 2 ]

2 голосов
/ 20 апреля 2011

Вы можете использовать NSNotification.

В конце кода рисования опубликуйте уведомление.

        [[NSNotificationCenter defaultCenter] 
                      postNotificationName:@"drawingLoopDone_Notification"
                                    object:nil];

Добавьте соответствующий контроллер вида в качестве NSObserver уведомления.

  [[NSNotificationCenter defaultCenter] 
          addObserver:self 
             selector:@selector(setNeedsDisplay)
                 name:@"drawingLoopDone_Notification" 
               object:nil];

После получения уведомления (или в вашем viewDidUnload) очистите прослушиватель уведомлений следующим образом:

    [[NSNotificationCenter defaultCenter] 
                removeObserver:self name:@"drawingLoopDone_Notification" object:nil];
0 голосов
/ 20 апреля 2011

Я только что пошел с ...

[theView performSelector:@selector(someSelector) withObject:nil afterDelay:0.0];

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

Я все еще хотел бы услышать, есть ли более стандартный способ обновить размер содержимого представления прокрутки, когдане знаю размер его подпредставления, пока оно не будет нарисовано.

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