我在简单的iOS应用程序中实现了pick-pop功能。我在MainViewController中有一个CustomView,它又包含在NavigationController中。 这个自定义视图有一个CollectionView,我想在它的项目上实现pick-pop 现在,当我选择并弹出一个项目时,矩形预览错位(见图片)
首先,如果我在我的customView中调用self.frame.origin.x
和self.frame.origin.y
,则结果为0
和0
,因为它位于navigationController中,所以很不方便
传递
中传递的location
参数
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController?
也放错了地方。(偏移量完全等于我的customView的navigationBar高度和左边距)
我将MainController传递给我的CustomView,我的customView是这样的:
class CategoryView: UIView, UICollectionViewDataSource, UICollectionViewDelegate , MFMailComposeViewControllerDelegate , UIViewControllerPreviewingDelegate{
@IBOutlet var contentView: UIView!
@IBOutlet weak var categoryGrid: UICollectionView!
var callback:((Category)->Void)?;
var category:Category?;
var controller:UIViewController?{
didSet{
if(controller?.traitCollection.forceTouchCapability == .available){
controller?.registerForPreviewing(with: self, sourceView: (controller?.view)!)
}
}
};
....
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
guard let indexPath = categoryGrid?.indexPathForItem(at: location) else {
return nil
}
if let cell = categoryGrid?.cellForItem(at: indexPath) as? CategoryViewCell {
if let ret = getNextView(to: cell.category!){
ret.preferredContentSize = CGSize(width: 0.0, height: 0.0)
print(self);
print(self.frame);
previewingContext.sourceRect = cell.frame;
return ret;
}
return nil;
}
UIView.setAnimationsEnabled(true);
return nil
}
}
任何人都可以说错了吗?
答案 0 :(得分:1)
您应该将单元格边界转换为sourceView
的坐标,e。 G:
previewingContext.sourceRect =
previewingContext.sourceView.convert(cell.bounds, from: cell)
你不应该依赖于细胞的框架。将坐标从一个视图转换为另一个视图是一种更清晰的方法。