簡體   English   中英

iOS使用部分可見的下一個和上一個視圖滑動視圖

[英]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 ,但我認為這種方式更清楚地解釋了邏輯。

對於我經過幾個小時的嘗試並嘗試使用hitTest而沒有獲得積極的結果,我發現了這種方式。

class PassThruScrollView: UIScrollView {

    var passThruViewRef: UIView?

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

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

我只是在組件滾動視圖中使用了這個類,我在容器視圖中有一切都很好。

像我使用我的班級的形象

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM