Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

       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];
            }
        }