搜尋

首頁  >  問答  >  主體

objective-c - ios 有關tableview或scrollView的滑動問題

如題
是這樣的
我想達到的效果是
往下滑的過程中,例如下圖

##這個是用tableview做的現在滑到這裡它是不會動的我想達到效果是比如藍色沒到屏幕的一半(大約那個位置也行)的時候自動退回到第一行也就是只有紅色那行,如果超過了,如下圖


則自動滑到藍色那行,這個改如何實現比較方便,tableview或scrollview有直接的屬性控制嗎 求解答 謝謝

PHP中文网PHP中文网2703 天前832

全部回覆(1)我來回復

  • 欧阳克

    欧阳克2017-06-20 10:08:07

    你說的是卡片佈局吧, 用UICollectionView和自訂UICollectionViewFlowLayout就可以實現, Demo地址

    // 修改cell滑动时大小
    - (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
    {
        
        NSArray *attrs = [[NSArray alloc] initWithArray:[super layoutAttributesForElementsInRect:self.collectionView.bounds] copyItems:YES];
        CGFloat scale;
        CGFloat offset;
        for (UICollectionViewLayoutAttributes *attr in attrs) {
            // 设置collection在滑动时, cell的大小
            if (self.scrollDirection == UICollectionViewScrollDirectionHorizontal) {
                offset = fabs(attr.center.x - self.collectionView.contentOffset.x - self.collectionView.bounds.size.width * 0.5);
                scale = 1 - offset / (self.collectionView.bounds.size.width * 0.5) * 0.25;
                attr.transform = CGAffineTransformMakeScale(scale, scale);
            } else {
                offset = fabs(attr.center.y - self.collectionView.contentOffset.y - self.collectionView.bounds.size.height * 0.5);
                scale = 1 - offset / (self.collectionView.bounds.size.height * 0.5) * 0.25;
                
            }
            attr.transform = CGAffineTransformMakeScale(scale, scale);
        }
        
        return attrs;
    }
    
    // 返回collection滑动手指松开后, collection最终的contentOffset
    - (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity
    {
        if (self.scrollDirection == UICollectionViewScrollDirectionHorizontal) {
            // cell 宽度
            CGFloat itemW = self.itemSize.width;
            // cell边框距离(未设置collection的contentInset, 默认为0)
            CGFloat margin = self.collectionView.contentInset.left;
            // collection在手指松开后,collection滑动到停止时, collectioncontentOffset
            CGFloat index = roundf((proposedContentOffset.x + margin) / itemW);
            // 修改collection最终的contentOffset, 使collection滑动到cell中间
            proposedContentOffset.x = index * self.collectionView.bounds.size.width - (index + 1) * margin;
        } else {
            CGFloat itemH = self.itemSize.height;
            CGFloat margin = self.collectionView.contentInset.top;
            CGFloat index = roundf((proposedContentOffset.y + margin) / itemH);
            proposedContentOffset.y = index * self.collectionView.bounds.size.height - (index+1) * margin;
        }
        return proposedContentOffset;
    }

    回覆
    0
  • 取消回覆