私はUICollectionView
を持っています。通常、そのセルはあります。UICollectionView isUserInteractionEnabledはセルのやりとりをブロックします
各セルには、それぞれUICollectionViewController
が含まれています。私は、セルをタップすると
が、私はそれがウィンドウ画面に合わせて拡大し、私はここにいくつかの問題が発生しました:
私は拡大し、細胞内でスクロールすると、画面全体がスクロールし、
スーパービューコレクションビューのタップとスクロールをブロックするために何をしようとしていますか。そうするためには
は、所望のフレームに合わせて選択したセルを展開した後、私はcollectionView.isScrollEnabled = false
とcollectionView.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(:_)
任意のヒント? はありがとうございます。
この男のようにセルの背後にサブビューを追加することができます。https://stackoverflow.com/a/5404921/8374624 –
@JakobMygindはい、いいアプローチです。私がちょうど思い出したことは、 'hasCellExpanded = false'のようなものを追加することでした。セルが展開されたときにtrueに設定し、' hasCellExpanded == true'の場合は 'didSelectItemAtIndexPath(_ :)'を返します。 –