在呈现弹出窗口视图时,如何让用户在父集合视图中选择单元格?

时间:2015-04-07 12:09:39

标签: ios swift uicollectionview uipopover

我有一个集合视图,当选择一个单元格时,它会显示一个弹出视图,显示有关该单元格的更多信息。

我想允许用户单击另一个单元格,然后将弹出窗口视图更改为显示该单元格的信息,而无需关闭弹出窗口。如果用户要单击父视图上某个不是单元格的某个位置,则弹出窗口应该关闭。但是,我希望用户仍能够在不关闭弹出框的情况下滚动集合视图。

怎么办呢?

3 个答案:

答案 0 :(得分:11)

根据Apple的说法:

  

当弹出窗口处于活动状态时,通常会禁用与其他视图的交互,直到弹出窗口被取消。为此属性分配视图数组允许弹出框外部的点击由相应的视图处理。

然后您可以通过以下方式使用passthroughViews

  

<强> CollectionViewController

import UIKit

let reuseIdentifier = "Cell"

class CollectionViewController: UICollectionViewController {

   var popoverViewController : PopoverViewController?

   override func viewDidLoad() {
       super.viewDidLoad()         

   }

   override func didReceiveMemoryWarning() {
      super.didReceiveMemoryWarning()
      // Dispose of any resources that can be recreated.
   }   

   override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
      //#warning Incomplete method implementation -- Return the number of sections
      return 1
   }    

   override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
      //#warning Incomplete method implementation -- Return the number of items in the section
      return 15
   }

   override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

      let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! CollectionViewCell
      cell.labelInfo.text = "Cell \(indexPath.row)"        
      return cell
   }

   override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

      println("tapped")

      if let popover = self.popoverViewController {

          var cell = self.collectionView!.cellForItemAtIndexPath(indexPath) as! CollectionViewCell
          popover.labelPop.text = cell.labelInfo.text

      }
      else {

          self.popoverViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PopoverViewController") as? PopoverViewController

          var cell = self.collectionView!.cellForItemAtIndexPath(indexPath) as! CollectionViewCell

          var t = self.popoverViewController!.view
          self.popoverViewController!.labelPop.text = cell.labelInfo.text

          self.popoverViewController!.modalPresentationStyle = .Popover
          var popover = self.popoverViewController!.popoverPresentationController


          popover?.passthroughViews = [self.view]
          popover?.sourceRect = CGRect(x: 250, y: 500, width: 0, height: 0)
          self.popoverViewController!.preferredContentSize = CGSizeMake(250, 419)

          popover!.sourceView = self.view

          self.presentViewController(self.popoverViewController!, animated: true, completion: nil)
      }
   }    
}

以上代码是CollectionViewController来处理UICollectionViewController及其所有代表。

  

<强> CollectionViewCell

class CollectionViewCell: UICollectionViewCell {    
    @IBOutlet weak var labelInfo: UILabel!        
}

内部只有UILabel的自定义单元格。

  

<强> PopoverViewController

class PopoverViewController: UIViewController {

   @IBOutlet var labelPop: UILabel!

   override func viewDidLoad() {
      super.viewDidLoad()

      // Do any additional setup after loading the view.
   }

   override func didReceiveMemoryWarning() {
      super.didReceiveMemoryWarning()
      // Dispose of any resources that can be recreated.
   }   
}

最后PopoverViewController.Popover

的形式显示

我想指出一些观察结果:

  • 我设置了对类PopoverViewController的引用以使其保持整个生命周期,并在数据保持打开时将其传递给它。

  • var t = self.popoverViewController!.view是必要的,因为如果@IBOutlet内的PopoverViewController在呈现之前不是初始化,则可能还有其他行如何做到这一点。

  • 我在屏幕中间显示弹出框以处理多个单元格中的点击并测试滚动,您可以将其显示在您想要的任何位置。

  • 在打开popover时允许的视图中,我设置了self.view,但是这样你就需要为自己解雇它,因为当你点击它时它永远不会被解雇查看,您可以放置​​任何您想要的视图。

您对解决方案的任何麻烦我可以在Github上分享项目。

我希望这可以帮到你

答案 1 :(得分:5)

您正在寻找的是popover的passthroughViews属性。

但是,如果您通过点击单元格打开弹出窗口,我不会看到如何滚动collectionView是有意义的。不要用指向你牢房的箭头打开popover吗?滚动视图将使呈现单元移开......

答案 2 :(得分:3)

您可以使用UIViewController'modalInPopover'的属性来启用弹出边界之外的触摸。只需在您使用弹出控制器呈现的视图控制器中写下下面给出的行。

self.modalInPopover = false;

其中self是一种UIViewController。

我附上了截图。

enter image description here

在swift中,线条将保持不变

self.modalInPopover = false

enter image description here