suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Objective-C – iOS-Gleitproblem bezüglich Tableview oder ScrollView

Da der Titel
so lautet
Der Effekt, den ich erzielen möchte, ist
beim Herunterscrollen, wie im Bild unten

Dies wird mit der Tabellenansicht erstellt. Wenn Sie es hierher schieben, wird es nicht verschoben, wenn die blaue Farbe nicht die Hälfte des Bildschirms erreicht (ungefähr diese Position wird funktionieren). die erste Reihe, die nur die rote ist, ist in Ordnung, wenn sie größer ist, wie unten gezeigt

Es wird automatisch in die blaue Zeile verschoben, um die direkte Attributsteuerung zu ermöglichen. Bitte antworten Sie

PHP中文网PHP中文网2739 Tage vor860

Antworte allen(1)Ich werde antworten

  • 欧阳克

    欧阳克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;
    }

    Antwort
    0
  • StornierenAntwort