iOS使用部分可见的下一个和上一个视图滑动视图

问题描述 投票:4回答:4

我正在尝试为iPhone要求实现闪存卡之类的东西。文本内容位于卡的中心和左侧(前一张卡),右侧(下一张卡)部分可见。

到目前为止,我尝试使用nicklockwood/SwipeView from github。但我未能满足左/右侧卡部分能见度要求。

有没有变通方法/库?请在这里告诉我。

ios objective-c ipad ios8
4个回答
3
投票

我只想使用UICollectionView。

对齐行为:UICollectionView with paging - setting page width

布局:

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.itemSize = CGSizeMake(200, 400);
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;

关于这一点很酷的是,当用户点击左侧或右侧部分可见的单元格时,您可以轻松实现居中行为(这对于某些UIScrollView黑客攻击并不容易):

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    [self.collectionView scrollToItemAtIndexPath:indexPath
                                atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally
                                        animated:YES];
}

1
投票

如果你想用可用的UIScrollView分页api实现这一点,那就有一个简单的伎俩。除了将pagingEnabled设置为YES之外,还要确保将clipsToBounds设置为NO

UIScrollView *scrollView = [UIScrollView new];
self.scrollView.pagingEnabled = YES;
self.scrollView.clipsToBounds = NO;

您现在需要将滚动视图的大小设置为页面大小。滚动视图将在其边界外绘制,显示其他页面。

为了能够在滚动视图外部开始拖动,您需要创建一个包含滚动视图的容器视图。然后在此容器视图中覆盖hitTest:,始终返回滚动视图:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    return self.scrollView;
}

如果容器视图将clipToBounds设置为YES,则这将是滚动视图可见的区域。


1
投票

由于我的scrollview非常小(只有100p高),hitTest方法获取整个ViewController,这不是我想要的。此解决方案涵盖任何大小的ScrollView,并使用Swift 4完成:

class ScrollViewContainer: UIView {

@IBOutlet weak var scrollView: UIScrollView!

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {

    guard self.bounds.contains(point) else {
        return super.hitTest(point, with: event)
    }

    guard self.scrollView.frame.contains(point) else {
        return self.scrollView
    }

    return super.hitTest(point, with: event)
   }
}

如果命中超出其边界,则第一个Guard返回默认的UIView hitTest

第二个返回UIScrollView,如果命中是在我的容器内但在ScrollView之外(这正是这个问题的目标)。

如果命中是在ScrollView内部,则不需要做任何不同的事情,只需让UIView使用其默认实现来处理它。

唯一需要处理的是当您的触摸位于容器内部但在滚动视图之外时。

这段代码可以减少到只有一个guard,但我认为这种方式更清楚地解释逻辑。


1
投票

对于我经过几个小时的尝试并尝试使用hitTest而没有获得积极的结果,我发现了这种方式。

class PassThruScrollView: UIScrollView {

    var passThruViewRef: UIView?

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {

        return point.y > passThruViewRef?.frame.height ?? 0        
    }    
}

我只是在组件滚动视图中使用了这个类,我在容器视图中有一切都很好。

像我使用我的班级的形象

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.