Лучший способ обновить / перезагрузить UIScrollView

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

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

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

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

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

6 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

Вот что я сделал, чтобы удалить все подпредставления, кроме полосы прокрутки, я удалил все подпредставления, у которых 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];
    }
}

Вы должны установить эти строки перед запуском метода прокрутки, он просто удалит все данные из 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];
            }
        }

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

Другие вопросы по тегам