0

私はUICollectionViewを持っています。通常、そのセルはあります。UICollectionView isUserInteractionEnabledはセルのやりとりをブロックします

各セルには、それぞれUICollectionViewControllerが含まれています。私は、セルをタップすると

が、私はそれがウィンドウ画面に合わせて拡大し、私はここにいくつかの問題が発生しました:

私は拡大し、細胞内でスクロールすると、画面全体がスクロールし、

スーパービューコレクションビューのタップとスクロールをブロックするために何をしようとしていますか。そうするためには

は、所望のフレームに合わせて選択したセルを展開した後、私はcollectionView.isScrollEnabled = falsecollectionView.isUserInteractionEnabled = falseを設定し、これで、私は別の問題に出くわした:拡張され、細胞は任意のタッチと相互作用しません。

どうすればこの問題を解決できますか?セルを展開してスクロールビューのスクロールをブロックし、スクロールビューのインタラクションをブロックしますが、セルのインタラクションを有効にします(スクロールタップなど)。

は、ここでは、コードの一部です:

主供給コントローラ

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    guard let cell = collectionView.cellForItem(at: indexPath) as? FeedCell else { return } 
    let theAttributes:UICollectionViewLayoutAttributes! = collectionView.layoutAttributesForItem(at: indexPath) 
    let cellFrameInSuperview:CGRect = collectionView.convert(theAttributes.frame, to: collectionView) 

    cell.superview?.bringSubview(toFront: cell) 
    cell.backupFrame = cellFrameInSuperview 

    let newFrame = CGRect(x: 0, y: collectionView.contentOffset.y, width: view.frame.width, height: view.frame.height) 
    UIView.animate(withDuration: 0.2, animations: { 
     cell.transform = CGAffineTransform(scaleX: 0.95, y: 0.95) 
    }) { (_) in 
     UIView.animate(withDuration: 0.1, animations: { 
      cell.transform = CGAffineTransform(scaleX: 1, y: 1) 
     }, completion: { (_) in 
      UIView.animate(withDuration: 0.8, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.7, options: .curveEaseInOut, animations: { 
       cell.frame = newFrame     
      },completion: {(_) in 
       cell.presentDismissButton() 
       self.collectionView.isScrollEnabled = false 
       self.collectionView.isUserInteractionEnabled = false 
      }) 
     })      
    } 
} 

拡張セル私はスーパーの相互作用を設定することができ却下プロパティでは、ボタンのプロパティ

@objc func dismiss() { 
    UIView.animate(withDuration: 0.8, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 1, options: .allowAnimatedContent, animations: { 
     self.frame = self.backupFrame! 
     self.sendSubview(toBack: self) 
     self.dismissButton.alpha = 0 
    },completion: nil) 
} 

解任再び有効になったが、フレームが拡張されているので私はできないそれとct。

メインフィードのコレクションビューのインタラクションを無効にしないと、ここで問題になるのは、拡大したセルの任意の場所をタップすると、別のセルが展開されます(拡張されたセルの後ろにありますdidSelectItem(:_)

任意のヒント? はありがとうございます。

+0

この男のようにセルの背後にサブビューを追加することができます。https://stackoverflow.com/a/5404921/8374624 –

+0

@JakobMygindはい、いいアプローチです。私がちょうど思い出したことは、 'hasCellExpanded = false'のようなものを追加することでした。セルが展開されたときにtrueに設定し、' hasCellExpanded == true'の場合は 'didSelectItemAtIndexPath(_ :)'を返します。 –

答えて

0

あなたがuserInteractionEnabled = falseを設定した場合、あなたはサブビューと対話することはできません。それは十分ではないだけで、スクロール?

を例えばself.collectionView.isUserInteractionEnabled = falseを削除してみてください無効にすることです完了ブロックの?

+0

私はそれを試みましたが、それは別の問題を引き起こします。フレームに合わせてセルを拡大すると、他のセルの上に表示され、拡大されたセルの中央をクリックすると、別の 'didSelectItem'がスーパービューから発射されます –

+0

Ohh ...私はちょうど思い出しました展開されている場合は、任意のセルタッチで返されるプロパティを作成できます。 –

関連する問題