recherche

Maison  >  Questions et réponses  >  le corps du texte

objective-c - problème de glissement iOS à propos de tableview ou scrollView

Comme le titre
est comme ça
L'effet que je veux obtenir est
en glissant vers le bas, comme l'image ci-dessous

Ceci est réalisé avec tableview. Maintenant, lorsque vous le faites glisser ici, il ne bougera pas. Ce que je veux réaliser, c'est que lorsque la couleur bleue n'atteint pas la moitié de l'écran (environ cette position fonctionnera), elle reviendra automatiquement à la première rangée, qui n'est que la rouge OK, si elle dépasse, comme indiqué ci-dessous

.

Il glissera automatiquement vers la ligne bleue. Comment implémenter ce changement est-il plus pratique ? La tableview ou la scrollview ont-elles un contrôle d'attribut direct ?

PHP中文网PHP中文网2739 Il y a quelques jours861

répondre à tous(1)je répondrai

  • 欧阳克

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

    Vous parlez de disposition de la carte, vous pouvez utiliser UICollectionView et UICollectionViewFlowLayout personnalisé pour y parvenir, adresse de démonstration

    // 修改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;
    }

    répondre
    0
  • Annulerrépondre