Отображать всплывающее окно под выбранным UICollectionViewCell - PullRequest
1 голос
/ 17 апреля 2019

Я работаю над отображением всплывающего окна, которое должно отображаться ниже для выбранной ячейки.

У меня два контроллера вида, оба содержат 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)
    }    
}

Этот код работал, но не отображал должным образом, как я ожидал.

Выход:

Add Hobbies

Вы можете видеть на изображении выше, мое всплывающее окно добавлено, но начало координат начинается с UICollectionView, а не cell * lblCategoryName * maxY.

Ожидаемое

Expected Add Hobbies

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

Вам нужно конвертировать прямоугольник в соответствии с суперпредставлением.

let theAttributes = collectionView.layoutAttributesForItem(at: indexPath)
let cellFrameInSuperview = collectionView.convert(theAttributes.frame, to: collectionView.superview)

Теперь у вас есть кадр в соответствии с его суперпредставлением.

установить контроллер кадра, используя cellFrameInSuperview свойство

СОВЕТ: Вы должны добавить контроллер представления в качестве дочернего контроллера представления, а затем добавить подпредставление, чтобы правильно управлять жизненным циклом представления.

EDIT

Пожалуйста, игнорируйте опечатку

self.signupFirstStepVC?.view.frame = CGRect(x: cellFrameInSuperview!.origin.x, y: cellFrameInSuperview.maxY, width: collectionView.frame.size.width, height: collectionView.frame.size.height - 100)    
1 голос
/ 17 апреля 2019

На самом деле вам нужно добавить 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

enter image description here

Выход: iPhone SE

enter image description here

1 голос
/ 17 апреля 2019

Попробуйте, как это

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)

Надеюсь, это решит вашу проблему.

...