iOS无效rect用于NavigationController中的视图

时间:2017-08-14 13:03:34

标签: ios swift

我在简单的iOS应用程序中实现了pick-pop功能。我在MainViewController中有一个CustomView,它又包含在NavigationController中。 这个自定义视图有一个CollectionView,我想在它的项目上实现pick-pop 现在,当我选择并弹出一个项目时,矩形预览错位(见图片)

my view misplaced pick and pop 这里有一些问题与pick-pop功能无关

首先,如果我在我的customView中调用self.frame.origin.xself.frame.origin.y,则结果为00,因为它位于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
}


}

任何人都可以说错了吗?

1 个答案:

答案 0 :(得分:1)

您应该将单元格边界转换为sourceView的坐标,e。 G:

previewingContext.sourceRect = 
    previewingContext.sourceView.convert(cell.bounds, from: cell)

你不应该依赖于细胞的框架。将坐标从一个视图转换为另一个视图是一种更清晰的方法。