2016-08-06 7 views
21

पर हटाने के लिए स्वाइप करें मैं मेल तालिकादृश्य में फ़ंक्शन को हटाने के लिए स्वाइप को दोहराने की कोशिश कर रहा हूं। केवल इस बार मुझे इसे संग्रहदृश्य पर बनाने की ज़रूरत है, लेकिन मुझे थोड़ा कठिन समय मिल रहा है। यह एक क्षैतिज स्क्रॉलिंग सूची है जिसे हटाने के लिए स्वाइप करें। मुझे पहले से ही काम करना स्वाइप हो गया है लेकिन कार्यक्षमता को हटाने या अनदेखा करने के लिए मुझे हटाने/टैप करने के लिए स्वाइप सेट करने की आवश्यकता के बारे में एक कठिन समय लग रहा है।संग्रह दृश्य

यह ऐसा दिखाई देता है: Delete Image

तो मैं निम्नलिखित collectionview उपयोग कर रहा हूँ:

func buildCollectionView() { 
    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() 
    layout.scrollDirection = .horizontal 
    layout.minimumInteritemSpacing = 0; 
    layout.minimumLineSpacing = 4; 

    collectionView = UICollectionView(frame: CGRect(x: 0, y: screenSize.midY - 120, width: screenSize.width, height: 180), collectionViewLayout: layout) 

    collectionView.dataSource = self 
    collectionView.delegate = self 
    collectionView.register(VideoCell.self, forCellWithReuseIdentifier: "videoCell") 
    collectionView.showsHorizontalScrollIndicator = false 
    collectionView.showsVerticalScrollIndicator = false 
    collectionView.contentInset = UIEdgeInsetsMake(0, 20, 0, 30) 
    collectionView.backgroundColor = UIColor.white() 
    collectionView.alpha = 0.0 


    //can swipe cells outside collectionview region 
    collectionView.layer.masksToBounds = false 


    swipeUpRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.deleteCell)) 
    swipeUpRecognizer.delegate = self 

    collectionView.addGestureRecognizer(swipeUpRecognizer) 
    collectionView.isUserInteractionEnabled = true 
} 

मेरे कस्टम videocell एक छवि है और नीचे हटाएँ बटन नहीं है। तो अगर आप छवि को स्वाइप करते हैं तो डिलीट बटन पॉप अप हो जाता है। सुनिश्चित नहीं हैं कि अगर यह कैसे करना है पर सही तरीका है:

class VideoCell : UICollectionViewCell { 
var deleteView: UIButton! 
var imageView: UIImageView! 

override init(frame: CGRect) { 
    super.init(frame: frame) 

    deleteView = UIButton(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)) 
    deleteView.contentMode = UIViewContentMode.scaleAspectFit 
    contentView.addSubview(deleteView) 

    imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)) 
    imageView.contentMode = UIViewContentMode.scaleAspectFit 
    contentView.addSubview(imageView) 


} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 
} 

और मैं निम्नलिखित तर्क का उपयोग कर रहा:

func deleteCell(sender: UIPanGestureRecognizer) { 
    let tapLocation = sender.location(in: self.collectionView) 
    let indexPath = self.collectionView.indexPathForItem(at: tapLocation) 

    if velocity.y < 0 { 
     //detect if there is a swipe up and detect it's distance. If the distance is far enough we snap the cells Imageview to the top otherwise we drop it back down. This works fine already. 
    } 
} 

लेकिन समस्या यह है वहाँ शुरू होता है। जैसे ही मेरा सेल संग्रहदृश्य सीमाओं के बाहर है, मैं अब और इसका उपयोग नहीं कर सकता। मैं अभी भी इसे हटाने के लिए इसे और स्वाइप करना चाहता हूं। मैं केवल डिलीट बटन पर स्वाइप करके ऐसा कर सकता हूं, लेकिन मैं इसके ऊपर छविदृश्य को स्वाइप करने योग्य भी चाहता हूं। या यदि मैं संग्रहदृश्य के बाहर की छवि को टैप करता हूं तो उसे लाइन में वापस स्लाइड करना चाहिए और इसे हटा नहीं देना चाहिए।

यदि मैं संग्रहदृश्य सीमाओं को बढ़ाता हूं तो मैं इस समस्या को रोक सकता हूं लेकिन मैं सेल की दृश्य ऊंचाई के बाहर निकालने के लिए भी स्वाइप कर सकता हूं। यह टैपलाक्शन के कारण होता है जो संग्रहदृश्य के अंदर होता है और इंडेक्सपाथ का पता लगाता है। कुछ जो मैं नहीं चाहता। मैं केवल संग्रह दृश्य के सेल पर काम करने के लिए स्वाइप करना चाहता हूं।

इसके अलावा बटन और छवि एक दूसरे के साथ हस्तक्षेप करती है क्योंकि मैं उन्हें अलग नहीं कर सकता। वे दोनों एक ही सेल में हैं इसलिए मैं सोच रहा हूं कि मेरे पास सेल में डिलीट बटन होना चाहिए या नहीं। या मुझे इसे अन्यथा कहां रखना चाहिए? मैं इसके बाहर दो बटन भी बना सकता हूं और राज्य के आधार पर उपयोगकर्ता इंटरैक्शन को अक्षम कर सकता हूं, लेकिन यह सुनिश्चित नहीं करता कि यह कैसे समाप्त होगा।

उत्तर

3

अपनी जिज्ञासा के लिए मैंने जो कुछ करने की कोशिश कर रहा है उसकी प्रतिलिपि बनाने की कोशिश की, और इसे किसी भी तरह से अच्छा काम करने के लिए मिला। मैंने स्वाइप जेश्चर सेट अप करने के तरीके से अलग किया है क्योंकि मैंने पैन का उपयोग नहीं किया था, लेकिन आपने कहा था कि आपके पास पहले से ही वह हिस्सा था, और इस पर बहुत अधिक समय नहीं लगाया है।पैन स्पष्ट रूप से इसे इंटरैक्टिव बनाने के लिए अधिक ठोस समाधान है, लेकिन इसकी गणना करने में थोड़ा समय लगता है, लेकिन इसका प्रभाव और प्रबंधन, मेरे उदाहरण से बहुत अलग नहीं होना चाहिए।

समस्या को हल करने सेल मैं जाँच करने का फैसला किया है, तो बिंदु Swiped रेक्ट, दो बार इस तरह गैर Swiped रेक्ट की ऊंचाई है, जिसमें था बाहर की ओर स्वाइप कर नहीं किया जा रहा:

  let cellFrame = activeCell.frame 
      let rect = CGRectMake(cellFrame.origin.x, cellFrame.origin.y - cellFrame.height, cellFrame.width, cellFrame.height*2) 
      if CGRectContainsPoint(rect, point) { 
       // If swipe point is in the cell delete it 

       let indexPath = myView.indexPathForCell(activeCell) 
       cats.removeAtIndex(indexPath!.row) 
       myView.deleteItemsAtIndexPaths([indexPath!]) 

      } 

मैंने टिप्पणियों के साथ एक प्रदर्शन बनाया: https://github.com/imbue11235/swipeToDeleteCell

मुझे आशा है कि यह आपको वैसे भी मदद करेगी!

+0

मुझे निश्चित रूप से आपके समाधान में रूचि है। क्या आप एक अद्यतन संस्करण को जिथब में धक्का दे सकते हैं क्योंकि मुझे वर्तमान में केवल एक खाली परियोजना मिलती है! – Wouter125

+0

ओह हाँ यकीन है, यह एक गलती है, शर्मनाक है। यह अब अपडेट किया गया है! – Imbue

+0

एक आकर्षण की तरह काम करता है। वही था जो मैं खोज रहा था। पहले से ही मेरे पेंगुइनर के लिए इसे फिर से लिखना है, लेकिन वास्तव में मैं सेल क्षेत्र को बढ़ाने के तरीके पर देख रहा था :) – Wouter125

8

तो, यदि आप अपने संग्रह दृश्य के बाहर होने पर रिकॉर्डिंग आंदोलन जारी रखने के लिए स्वाइप जेश्चर पहचानकर्ता चाहते हैं, तो आपको इसे संग्रह दृश्य के अभिभावक से जोड़ना होगा, इसलिए यह उस पूर्ण क्षेत्र से घिरा हुआ है जहां उपयोगकर्ता उपयोगकर्ता कर सकता है कड़ी चोट।

इसका मतलब यह है कि आप संग्रह दृश्य के बाहर चीजों के लिए स्वाइप प्राप्त करेंगे, लेकिन आप किसी भी तकनीक का उपयोग करके उन लोगों को आसानी से अनदेखा कर सकते हैं। मैं एक साथ छवि और बटन के साथ सेल रखने तुम्हारे पास है के रूप में होता है, बटन

पर:

बटन नल हटाना रजिस्टर करने के लिए, आप addTarget कॉल करने के लिए की आवश्यकता होगी: कार्रवाई: forControlEvents। इसे प्रबंधित करना बहुत आसान होगा, और वे एक साथ हैं।

छवि को ऊपर और नीचे ले जाने के प्रबंधन के लिए, मैं एक ट्रांसफॉर्म, या NSLayoutConstraint का उपयोग करने के लिए देखता हूं। फिर आपको उपयोगकर्ता स्वाइप के साथ सिंक में ऊपर और नीचे जाने के लिए केवल एक मान समायोजित करना होगा। फ्रेम के साथ कोई गड़बड़ नहीं है।

+0

मुझे प्रत्येक एलिनिया चलाने दो। यदि मैं इसे मूल दृश्य में संलग्न करता हूं, जैसा कि आपने कहा था, तो मैं हर जगह स्वाइप प्राप्त करूंगा। समस्या तब होती है जब मेरा सेल मेरे संग्रहदृश्य के बाहर हो जाता है, मेरा इंडेक्सपाथ डिलीटसेल फ़ंक्शन में शून्य हो जाएगा और मैं अब सेल को खींच नहीं सकता। मेरे संग्रहदृश्य आकार को बढ़ाने से यह संभव हो जाएगा, लेकिन यह उपयोगकर्ताओं को छवियों को छूने पर भी कोशिकाओं को खींचने में सक्षम बनाएगा। हटाएं कार्रवाई आसानी से तय की जा सकती है। केवल समस्या यह है कि छविदृश्य में हटाए गए बटन की तुलना में एक अलग कार्रवाई है। जब वे दोनों दिखाई देते हैं तो उन दो कार्यों को कैसे संयोजित करें? – Wouter125

+0

मुझे यकीन नहीं है, मैं कल्पना करूंगा कि संग्रह दृश्य क्लिप को सीमाओं को अक्षम करने से आप माता-पिता के बाहर छवि दृश्य को बदल सकते हैं। 'myCollectionView.clipsToBounds = false' – Michael

+0

नहीं, यह चाल नहीं चल रहा है क्योंकि एक दृश्य केवल उपखंडों (संग्रहदृश्य के अंदर कक्ष) में" स्पर्श करें "ईवेंट को अग्रेषित करेगा यदि वे इसकी सीमाओं के भीतर हैं। इसलिए सीमाएं बढ़ाना काम करेगा लेकिन यह वही नहीं है जो मैं चाहता हूं। कोई अन्य सुझाव? मैं पॉइंट इनसाइड विधि को ओवरराइड कर सकता हूं लेकिन ऐसा कुछ है जो मुझे नहीं चाहिए क्योंकि मुझे लगता है कि यह मेरे इंडेक्सपाथ को वापस नहीं करेगा। – Wouter125

संबंधित मुद्दे