Лучший способ обновить / перезагрузить 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 на следующем цикле рисования.