我正在尝试为iPhone要求实现闪存卡之类的东西。文本内容位于卡的中心和左侧(前一张卡),右侧(下一张卡)部分可见。
到目前为止,我尝试使用nicklockwood/SwipeView from github。但我未能满足左/右侧卡部分能见度要求。
有没有变通方法/库?请在这里告诉我。
我只想使用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];
}
如果你想用可用的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
,则这将是滚动视图可见的区域。
由于我的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
,但我认为这种方式更清楚地解释逻辑。