[英]iOS Swipe views with partially visible next and previous views
我正在嘗試為iPhone要求實現閃存卡之類的東西。 文本內容位於卡的中心和左側(前一張卡),右側(下一張卡)部分可見。
到目前為止,我嘗試使用github上的nicklockwood / SwipeView 。 但我未能滿足左/右側卡部分能見度要求。
有沒有變通方法/庫? 請在這里告訴我。
我只想使用UICollectionView。
捕捉行為: 帶分頁的UICollectionView - 設置頁面寬度
布局:
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
,但我認為這種方式更清楚地解釋了邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.