2016-05-28 26 views
2

Я добавил функцию 3D Touch Peek/Pop в свои ячейки просмотра коллекции, и она отлично работает, однако я заметил, что рамка предварительного просмотра не учитывает угловой радиус клетки.Предварительный просмотр Peek/Pop игнорирует радиус ячейки в виде коллекции

Вот моя предпросмотр функция:

func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { 
    let viewController = storyboard?.instantiateViewControllerWithIdentifier("scholarDetailViewController") as? ScholarDetailViewController 
    let cellPosition = self.scholarsCollectionView.convertPoint(location, fromView: self.view) 
    let cellIndex = self.scholarsCollectionView.indexPathForItemAtPoint(cellPosition) 

    guard let previewViewController = viewController, indexPath = cellIndex, cell = self.scholarsCollectionView.cellForItemAtIndexPath(indexPath) else { 
     return nil 
    } 

    let scholar = self.searchBarActive ? self.searchResults[indexPath.item] as! Scholar : self.currentScholars[indexPath.item] 
    previewViewController.setScholar(scholar.id) 
    previewViewController.delegate = self 
    previewViewController.preferredContentSize = CGSize.zero 
    previewingContext.sourceRect = self.view.convertRect(cell.frame, fromView: self.scholarsCollectionView) 

    return previewViewController 
} 

Я попытался установить угловой радиус previewingContext SourceView и играя с masksToBounds на клетку, но ничего я пытался до сих пор не помог.

Вот установка ячейки:

override func awakeFromNib() { 
    self.layer.cornerRadius = 7 
} 

Кто-нибудь есть какие-либо предложения?

+0

Привет, вы могли где-нибудь загрузить тестовый проект? Спасибо –

ответ

7

Как я вас правильно понял вы хотите иметь что-то вроде первого, а второй:

Right oneWrong one

Проблема заключается в том, что вы регистрируетесь уведомление по всей точки зрения. Что-то вроде этого: registerForPreviewingWithDelegate(self, sourceView: self.view), поэтому ваша затронутая область ничего не знает о клеточном слое.

Что вы должны сделать - зарегистрировать каждую клетку лично:

func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) { 

    let previwingController = registerForPreviewingWithDelegate(self, sourceView: cell) 
    previwingControllers[cell] = previwingController 
} 

func collectionView(collectionView: UICollectionView, didEndDisplayingCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) { 

    if let previwingController = previwingControllers[cell] { 
     unregisterForPreviewingWithContext(previwingController) 
    } 
} 

И просто изменить previewingContext.sourceRect = self.view.convertRect(cell.frame, fromView: self.scholarsCollectionView) к previewingContext.sourceRect = cell.bounds

P.S. Конечно, не забудьте удалить registerForPreviewingWithDelegate на ваше мнение :)

+0

Не могли бы вы объяснить, что такое previwingControllers? – Viper

+1

@Viper привет! Это объект класса, возвращаемый 'registerForPreviewingWithDelegate (: sourceView:)', потому что метод unregister ('unregisterForPreviewingWithContext (:)') принимает его как параметр, поэтому вы должны где-то их хранить. –