2016-12-14 2 views
4

У меня есть UIScrollView с 10 + страницами, настроенными таким образом, что содержимое с 3-х страниц будет отображаться на экране одновременно (снимок экрана ниже).Как временно скрыть неактивные страницы в UIScrollView

enter image description here

Для функции, мне нужно временно отключить неактивные страницы на экране, и мне было интересно, если есть способ, чтобы скрыть все неактивные страницы, и только сохранить активную страницу видимой.

В качестве альтернативы, если это невозможно, можно ли извлечь все виды, находящиеся на активной странице?

Спасибо!

+2

Задумывались ли вы с помощью UICollectionView, ограниченного горизонтальной оси, и сделать страницы в пользовательское UICollectionViewCells? Это сделает весь тяжелый подъем для вас. – Stephen

+0

Великий пункт Стивен. К сожалению, многие существующие функции были созданы с помощью шаблона UIScrollView и не могут быть скорректированы для коллекцииView. – daspianist

+0

Когда вы хотите, чтобы они исчезли? Когда прокрутка заканчивается, а затем появляется, когда начинается прокрутка? Потому что неактивная страница станет активной при прокрутке (так что она должна появиться как-то), так как вы хотите, чтобы она выглядела? – timaktimak

ответ

2

Попробуйте функцию ниже, и настроить его в соответствии с ситуацией:

func disableInactiveView(){ 
    let offset = scrollView.contentOffset; 
    let frame = scrollView.frame; 

    let shownFrame = CGRect(x: offset.x, y: offset.y , width: frame.size.width, height: frame.size.height) 

    for colorView in scrollView.subviews{ 
     if shownFrame.contains(colorView.frame) { 
      colorView.backgroundColor = UIColor.green; 
     }else{ 
      colorView.backgroundColor = UIColor.red; 
     } 
    } 
} 
1

Добавление все виды на Scrollview не хорошо для работы. Лучшим решением для управления таким видом является использование UICollectionView с пользовательскими UICollectionViewCell с. Collection view сделает все, что вам нужно - повторное использование ваших представлений и правильное размещение их в соответствии с видимым прямоугольником. В случае, если вы не можете использовать UICollectionView попробовать что-то вроде этого:

@interface SampleClass : UIViewController <UIScrollViewDelegate> 

@property (nonatomic) UIScrollView *scrollView; 
@property (nonatomic) NSUInteger viewsCount; 
@property (nonatomic) NSDictionary<NSNumber *, UIView *> *visibleViewsByIndexes; 

@end 

@implementation SampleClass 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    [self updateViews]; 
    [self hideInactiveViews]; 
} 

- (void)updateViews 
{ 
    CGPoint offset = self.scrollView.contentOffset; 
    CGRect frame = self.scrollView.bounds; 
    CGRect visibleRect = frame; 
    visibleRect.origin.x += offset.x; 

    // Determine indexes of views which should be displayed. 
    NSMutableArray<NSNumber *> *viewsToDisplay = [NSMutableArray new];; 
    for (NSUInteger index = 0; index < self.viewsCount; index++) { 
     CGRect viewFrame = [self frameForViewAtIndex:index]; 
     if (CGRectIntersectsRect(viewFrame, visibleRect)) { 
      [viewsToDisplay addObject:@(index)]; 
     } 
    } 

    // Remove not visible views. 
    NSDictionary<NSNumber *, UIView *> *oldVisibleViewsByIndexes = self.visibleViewsByIndexes; 
    NSMutableDictionary<NSNumber *, UIView *> *newVisibleViewsByIndexes = [NSMutableDictionary new]; 
    for (NSNumber *indexNumber in oldVisibleViewsByIndexes.allKeys) { 
     if (![viewsToDisplay containsObject:indexNumber]) { 
      UIView *viewToRemove = oldVisibleViewsByIndexes[indexNumber]; 
      [viewToRemove removeFromSuperview]; 
     } else { 
      newVisibleViewsByIndexes[indexNumber] = oldVisibleViewsByIndexes[indexNumber]; 
     } 
    } 

    // Add new views. 
    for (NSNumber *indexNumber in viewsToDisplay) { 
     if (![oldVisibleViewsByIndexes.allKeys containsObject:indexNumber]) { 
      UIView *viewToAdd = [self viewAtIndex:indexNumber.unsignedIntegerValue]; 
      viewToAdd.frame = [self frameForViewAtIndex:indexNumber.unsignedIntegerValue]; 
      [self.scrollView addSubview:viewToAdd]; 
     } 
    } 
    self.visibleViewsByIndexes = newVisibleViewsByIndexes; 
} 

- (CGRect)frameForViewAtIndex:(NSUInteger)index 
{ 
    // Return correct frame for view at index. 
    return CGRectZero; 
} 

- (UIView *)viewAtIndex:(NSUInteger)index 
{ 
    return [UIView new]; 
} 

- (void)hideInactiveViews 
{ 
    CGPoint offset = self.scrollView.contentOffset; 
    CGRect frame = self.scrollView.bounds; 
    CGRect visibleRect = frame; 
    visibleRect.origin.x += offset.x; 

    for (UIView *view in self.visibleViewsByIndexes.allValues) { 
     if (CGRectContainsRect(visibleRect, view.frame)) { 
      // Active view. 
      view.alpha = 1; 
     } else { 
      // Inactive view. 
      view.alpha = 0.2; 
     } 
    } 
} 

@end 
Смежные вопросы