在选定的UICollectionViewCell下面显示弹出窗口

时间:2019-04-17 06:14:06

标签: ios swift uicollectionview uicollectionviewcell

我正在显示弹出窗口,该弹出窗口应显示在所选单元格的下方。

我有两个视图控制器,都包含UICollectionView。因此,当我从第一个视图控制器中选择单元格时,我想显示弹出窗口,其中的动画正好位于所选单元格的下方。

我尝试了以下代码来显示它。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    if self.signupFirstStepVC != nil {
        self.signupFirstStepVC?.view.removeFromSuperview()
        self.signupFirstStepVC = nil
    }

    let cell = collectionView.cellForItem(at: indexPath) as! MainCategoryCVC
    collectionView.scrollToItem(at: indexPath, at: .top, animated: true)    
    self.signupFirstStepVC = SignupFirstStepVC.viewController()

    let viewFrame = self.signupFirstStepVC?.view.frame

    self.signupFirstStepVC?.view.frame = CGRect(x: viewFrame!.origin.x, y: cell.lblCategoryName.frame.maxY, width: collectionView.frame.size.width, height: collectionView.frame.size.height - 100)    

    UIView.transition(from: cell, to: self.signupFirstStepVC!.view, duration: 0.5, options: .transitionCrossDissolve) { (success) in
        self.view.addSubview(self.signupFirstStepVC!.view)
    }    
}

此代码有效,但未如我所愿显示正确的视图。

输出:

Add Hobbies

您可以在上图中看到,添加了我的弹出窗口,但是原点从UICollectionView的原点而不是cell的{​​{1}}的{​​{1}}开始。 / p>

预期:

Expected Add Hobbies

3 个答案:

答案 0 :(得分:1)

尝试这样

let viewFrame = cell?.frame           
self.signupFirstStepVC?.view.frame = CGRect(x: viewFrame!.origin.x, y: viewFrame?.maxY ?? 0.0, width: collectionView.frame.size.width, height: collectionView.frame.size.height - 100)

希望这可以解决您的问题。

答案 1 :(得分:1)

您需要根据超级视图转换rect。

let theAttributes = collectionView.layoutAttributesForItem(at: indexPath)
let cellFrameInSuperview = collectionView.convert(theAttributes.frame, to: collectionView.superview)

现在,您可以根据其概览显示框架。

使用cellFrameInSuperview属性设置视图控制器的框架

提示:您应该将视图控制器添加为子视图控制器,然后添加子视图以正确管理视图生命周期。

编辑

请忽略错字

self.signupFirstStepVC?.view.frame = CGRect(x: cellFrameInSuperview!.origin.x, y: cellFrameInSuperview.maxY, width: collectionView.frame.size.width, height: collectionView.frame.size.height - 100)    

答案 2 :(得分:1)

实际上,您需要将self.view.safeAreaInsets.top与maxY相加。

代码工作:

    let topDisplaceHeight =  self.view.safeAreaInsets.top

    let cell = colView.cellForItem(at: indexPath)

    let pWidth : CGFloat = self.view.bounds.width - 40
    let pHeight : CGFloat = 300

    self.viewPopup.frame = CGRect(origin: CGPoint(x: self.view.bounds.width/2 -  pWidth/2,
                                                  y: (cell?.frame.maxY)! + topDisplaceHeight ),
                                  size: CGSize(width: pWidth, height: pHeight))


    self.view.addSubview(self.viewPopup)

输出:iPhone XR

enter image description here

输出:iPhone SE

enter image description here