我有一个集合视图,当选择一个单元格时,它会显示一个弹出视图,显示有关该单元格的更多信息。
我想允许用户单击另一个单元格,然后将弹出窗口视图更改为显示该单元格的信息,而无需关闭弹出窗口。如果用户要单击父视图上某个不是单元格的某个位置,则弹出窗口应该关闭。但是,我希望用户仍能够在不关闭弹出框的情况下滚动集合视图。
怎么办呢?
答案 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。
我附上了截图。
在swift中,线条将保持不变
self.modalInPopover = false