iOS滑动视图,下一个和上一个视图部分可见

iOS滑动视图,下一个和上一个视图部分可见,ios,objective-c,ipad,ios8,Ios,Objective C,Ipad,Ios8,我正试图实现类似iPhone要求的闪存卡。文本内容将位于卡片中央和左侧(上一张卡片),右侧(下一张卡片)部分可见 到目前为止我试过了但我未能满足左侧/右侧卡的部分可见性要求。 是否有解决方法/库?请在这里告诉我。我只想使用UICollectionView 捕捉行为: 布局: UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; layout.itemSize = CGSizeMake(20

我正试图实现类似iPhone要求的闪存卡。文本内容将位于卡片中央和左侧(上一张卡片),右侧(下一张卡片)部分可见

到目前为止我试过了但我未能满足左侧/右侧卡的部分可见性要求。


是否有解决方法/库?请在这里告诉我。

我只想使用UICollectionView

捕捉行为:

布局:

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.itemSize = CGSizeMake(200, 400);
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
最酷的是,当用户点击左侧或右侧部分可见的单元格时,您可以轻松实现居中行为(对于一些UIScrollView黑客来说,这并不容易):


如果您想通过可用的
UIScrollView
pagination api实现这一点,有一个简单的技巧。除了将
paginEnabled
设置为
YES
之外,还要确保
clipstobunds
设置为
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
,这将是滚动视图可见的区域。

由于我的滚动视图非常小(只有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使用其默认实现来处理它

唯一需要处理的是当您的触摸在容器内部但在scrollview外部时


这段代码可以简化为一个
保护
,但我认为这种方法可以更清楚地解释逻辑

我用hitTest试了好几个小时,但没有得到积极的结果,我发现了这种方法

class PassThruScrollView: UIScrollView {

    var passThruViewRef: UIView?

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

        return point.y > passThruViewRef?.frame.height ?? 0        
    }    
}
我在组件滚动视图中使用了这个类,我在容器视图中使用了这个类,一切都很好

想象一下我用过我的课


我可以证明这一点非常有效。这些类中的大多数只是UIScrollView的子类,因此它们可以通过迭代它们的子视图进行定制,直到您到达UIScrollView。@stefreak-Wow!好主意。我一定要试试这个。谢谢你reply@Rollo
UICollectionView
UIScrollView
的子类,无需迭代它的subviews@jeekOnline呵呵,没问题!我使用UICollectionView处理所有事情,因为它太棒了!正是我需要的!如果有人将UIScrollView作为子容器,并且如果您不触摸它,则希望将事件传递给UIScrollView事件,这就是代码!
class PassThruScrollView: UIScrollView {

    var passThruViewRef: UIView?

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

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