SORU
3 EKİM 2012, ÇARŞAMBA


UİCollectionView etkili sürükle ve bırak

Şu anda UİTableView yeniden davranış kullanarak UİCollectionView kullanmaya çalışıyorum.

ArayalımUİtableView TVve birUİCollectionView CV(aşağıdaki açıklama açıklığa kavuşturmak için)

Temelde TV sürükle ve bırak çoğaltmak için çalışıyorum, ama düzen modunda, hücre anda uzun basın olarak hareket etmeye hazır olduğunu jest tetiklenir kullanıyorum. Prefectly çalışır, hareket CV yöntemi kullanıyorum, bir sorun yok.

Ben kullanıcı bir hücreyi sürüklerken, kaydırma işlemek için CV contentOffset özelliği güncelleştirin. Bir kullanıcı üstünde ve altında belirli bir rect gittiğinde, ben contentOffset güncelleme ve CV ilerleyin. Sorun kullanıcı parmağını hareket durduğunda, hareketi herhangi bir güncelleme göndermez kaydırma durdurun ve tekrar kullanıcı parmağını hareket olarak yapar.

Bu davranış kesinlikle doğal değil, kullanıcı televizyonda olduğu gibi CV bırakana kadar ilerleyin continu tercih ederim. TV sürükle ve bırak deneyimi harika ve gerçekten aynı duygu yeniden istiyorum. Herkes yeniden düzenleme sırasında TV kaydırma nasıl biliyor mu ?

  • Kaydırma eylemi tetiklemek için bir zamanlayıcı kullanarak sürekli hareket pozisyonu doğru yerde olduğu sürece çalıştım, kaydırma berbat ve çok verimli (çok yavaş ve ürkek).
  • Ben de GCD başka bir konuya jest pozisyonu dinlemek için kullanmayı denedim ama sonuç daha kötü olur.

Eğer birisi cevap varsa onunla evlenmek istiyorum ... bu konuda fikir kalmadı,!

Burada longPress yöntemi uygulanması:

- (void)handleLongPress:(UILongPressGestureRecognizer *)sender
{
    ReorganizableCVCLayout *layout = (ReorganizableCVCLayout *)self.collectionView.collectionViewLayout;
    CGPoint gesturePosition = [sender locationInView:self.collectionView];
    NSIndexPath *selectedIndexPath = [self.collectionView indexPathForItemAtPoint:gesturePosition];

    if (sender.state == UIGestureRecognizerStateBegan)
    {
        layout.selectedItem = selectedIndexPath;
        layout.gesturePoint = gesturePosition; // Setting gesturePoint invalidate layout
    }
    else if (sender.state == UIGestureRecognizerStateChanged)
    {
        layout.gesturePoint = gesturePosition; // Setting gesturePoint invalidate layout
        [self swapCellAtPoint:gesturePosition];
        [self manageScrollWithReferencePoint:gesturePosition];
    }
    else
    {
        [self.collectionView performBatchUpdates:^
        {
            layout.selectedItem = nil;
            layout.gesturePoint = CGPointZero; // Setting gesturePoint invalidate layout
        } completion:^(BOOL completion){[self.collectionView reloadData];}];
    }
}

CV kaydırma yapmak için bu yöntemi kullanıyorum:

- (void)manageScrollWithReferencePoint:(CGPoint)gesturePoint
{
    ReorganizableCVCLayout *layout = (ReorganizableCVCLayout *)self.collectionView.collectionViewLayout;
    CGFloat topScrollLimit = self.collectionView.contentOffset.y layout.itemSize.height/2 SCROLL_BORDER;
    CGFloat bottomScrollLimit = self.collectionView.contentOffset.y self.collectionView.frame.size.height-layout.itemSize.height/2-SCROLL_BORDER;
    CGPoint contentOffset = self.collectionView.contentOffset;

    if (gesturePoint.y < topScrollLimit && gesturePoint.y - layout.itemSize.height/2 - SCROLL_BORDER > 0)
        contentOffset.y -= SCROLL_STEP;
    else if (gesturePoint.y > bottomScrollLimit &&
             gesturePoint.y   layout.itemSize.height/2   SCROLL_BORDER < self.collectionView.contentSize.height)
        contentOffset.y  = SCROLL_STEP;

    [self.collectionView setContentOffset:contentOffset];
}

CEVAP
28 Mayıs 2013, Salı


İşte bir alternatif:

https://github.com/lukescott/DraggableCollectionView

DraggableCollectionView ve LXReorderableCollectionViewFlowLayout arasındaki farklar:

  • Veri kaynağı sadece bir kez değiştirilir. Bu kullanıcı bir öğeyi iken, hücreleri yeniden konumlandırılmış veri kaynağını değiştirmeden olduğu anlamına gelir.
  • Mümkün özel düzenleri ile kullanmak için yapar böyle bir şekilde yazılmış.
  • Düzgün kaydırma ve animasyon için CADisplayLink kullanır.
  • Animasyonlar daha az sıklıkta sürüklerken iptal edildi. Daha fazla hissettiriyor"". doğal
  • Protokol yöntemleri UITableViewDataSource benzer UICollectionViewDataSource uzanır.

Devam eden bir çalışma. Birden fazla bölümler desteklenmektedir.

Özel bir düzen ile kullanmak için DraggableCollectionViewFlowLayout. Çoğu mantığı LSCollectionViewLayoutHelper var. Ayrıca WWDC 2012'de Apple'ın CircleLayout örnek bir iş yapmak için nasıl CircleLayoutDemo gösteren bir örnek var.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Paul Schroder

    Paul Schrode

    30 Kasım 2007
  • Paulo Bautista

    Paulo Bautis

    21 Aralık 2008
  • ShayLoss

    ShayLoss

    5 Kasım 2009