我正在显示弹出窗口,该弹出窗口应显示在所选单元格的下方。
我有两个视图控制器,都包含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)
}
}
此代码有效,但未如我所愿显示正确的视图。
输出:
您可以在上图中看到,添加了我的弹出窗口,但是原点从UICollectionView
的原点而不是cell
的{{1}}的{{1}}开始。 / p>
预期:
答案 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
输出:iPhone SE