Просмотр Peek/Pop игнорирует радиус угла ячейки в представлении коллекции

Я добавил функциональность 3D Touch 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
}

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

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

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

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

1 ответ

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

Правильный Неправильный

Проблема в том, что вы регистрируете уведомление на весь вид. Что-то вроде этого: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

PS Конечно, не забудьте удалить registerForPreviewingWithDelegate на ваш взгляд:)

Другие вопросы по тегам