Лучший способ обновить / перезагрузить UIScrollView - PullRequest
13 голосов
/ 09 февраля 2012

У меня есть метод, который добавляет некоторые подпредставления (изображения / кнопки) в мой ScrollView.

Дело в том, что снаружи ScrollView пользователь может нажать кнопку, которая изменит содержимое ScrollView.

Есть ли какой-нибудь достойный способ "перезагрузить" ScrollView лучше, чем:

for (UIView * view in myScrollView.subViews) {
    [view removeFromSuperview];
}

Обратите внимание, что это решение удаляет полосу, чтобы указать позицию на ScrollView

Ответы [ 6 ]

19 голосов
/ 10 февраля 2012

Вызов setNeedsDisplay просто перерисовывает ваше представление прокрутки, а не фактически удаляет содержимое внутри него.

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

Существует несколько подходов к этому: во-первых, поддерживать отдельный массив, содержащий все представления, которые вы добавили в представление прокрутки.Затем вы можете просто перебрать этот массив.На мой взгляд, это, вероятно, лучший подход.

Другой, немного хакерский способ - это тестировать представления при их итерации:

for (UIView *view in self.contentView.subviews)
{
    if (![view isKindOfClass:[UIImageView class]])
        [view removeFromSuperview];
}

Поскольку полосы прокрутки сами по себе являютсяПодкласс UIImageView это не удалит их.Но опять же, если вы сами используете представления изображений, они также не будут удалены, и нет никакой гарантии, что в будущих версиях iOS они останутся представлениями изображений.

Намного лучше пойти с моим первым подходом ипросто держите массив со всеми добавленными вами представлениями.

3 голосов
/ 13 сентября 2012

Это своего рода старый поток, но немного более простым способом может быть просто добавить тег к представлению, которое вы добавляете в UIScrollView, скажем 15. Тогда

for (UIView * view in _scrollView.subviews) {
    if (view.tag == 15) {
        [view removeFromSuperview];
    }
}

Таким образом, вы можете быть уверены, что только добавленные вами представления будут удалены. Просто мысль.

2 голосов
/ 10 февраля 2012

Обычно я сохраняю отдельный изменяемый массив представлений, который я поместил в представление прокрутки, и перебираю его вместо subviews. Таким образом я вынимаю только то, что вставляю. Но основной подход тот же.

1 голос
/ 29 марта 2013

Вот что я сделал, чтобы удалить все подпредставления, кроме полосы прокрутки, я удалил все подпредставления, у которых frame.size.width больше 10, ширина полосы прокрутки меньше 10, поэтому он не будет удален.Это предполагает, что все представления, которые вы добавляете в UIScollView, имеют ширину больше 10.

for (UIView * view in view.subviews) {
    if(view.frame.size.width > 10){ // removes all component except scrollbar
        [view removeFromSuperview];
    }
}
0 голосов
/ 17 августа 2015

Вы должны установить эти строки перед запуском метода прокрутки, он просто удалит все данные из scrollview и согласно вашему методу scrollview будет сброшен.

       NSArray* subviews = [[NSArray alloc] initWithArray: Main_Scroll.subviews];
        for (UIView* view in subviews)
        {
            if ([view isKindOfClass:[UIView class]])
            {
                [view removeFromSuperview];
            }
            if ([view isKindOfClass:[UIImageView class]])
            {
                [view removeFromSuperview];
            }
            if ([view isKindOfClass:[UIButton class]])
            {
                [view removeFromSuperview];
            }
            if ([view isKindOfClass:[UILabel class]])
            {
                [view removeFromSuperview];
            }
        }
0 голосов
/ 09 февраля 2012

После удаления ненужных видов (которые, я предполагаю, вы не сможете обойти), вызовите [myScrollView setNeedsDisplay];, чтобы обновить UIScrollView в следующем цикле рисования.

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