如何临时隐藏UIScrollView中的非活动页面

时间:2016-12-14 03:26:59

标签: ios uiview uiscrollview

我有一个UIScrollView,其中10页以上的方式配置,一次只有3页的内容会出现在屏幕上(截图如下)。

enter image description here

对于某项功能,我需要暂时禁用屏幕上的非活动页面,我想知道是否有办法隐藏所有非活动页面,只保持活动页面可见。

或者,如果这不可行,是否可以提取活动页面中的所有视图?

谢谢!

2 个答案:

答案 0 :(得分: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 :(得分:1)

将所有视图添加到scrollView对性能不利。管理此类视图的最佳解决方案是将UICollectionView与自定义UICollectionViewCell一起使用。集合视图将执行您需要的所有操作 - 重用您的视图并根据可见的rect正确放置它们。如果您无法使用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