objective-c - ios 有关tableview或者scrollView的滑动问题

【字号: 日期:2023-11-13浏览:51作者:雯心

问题描述

如题是这样的我想达到的效果是往下滑的过程中,比如下图objective-c - ios  有关tableview或者scrollView的滑动问题

这个是用tableview做的 现在滑到这里它是不会动的 我想达到效果是比如蓝色没到屏幕的一半(大约那个位置也行)的时候自动退回到第一行也就是只有红色那行,如果超过了,如下图objective-c - ios  有关tableview或者scrollView的滑动问题

则自动滑到蓝色那行,这个改如何实现比较方便,tableview或者scrollview有直接的属性控制吗 求解答 谢谢

问题解答

回答1:

你说的是卡片布局吧, 用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滑动到停止时, collectioncontentOffsetCGFloat 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;}

相关文章: