How to temporarily hide inactive pages in UIScrollView

I have a UIScrollView with 10+ pages configured so that content from 3 pages will be displayed on the screen at the same time (screenshot below).

enter image description here

For this function, I needed to temporarily disable inactive pages on the screen, and I was wondering if there was a way to hide all inactive pages and keep only the active page.

Alternatively, if this is not possible, is it possible to extract all the views that are on the active page?

Thank!

+4
source share
2 answers

Try the function below and configure it according to your situation:

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;
        }
    }
}
+2
source

scrollView . UICollectionView UICollectionViewCell s. 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
+1

Source: https://habr.com/ru/post/1663697/


All Articles