Возможно ли отсоединить только одно подпредставление от границ его суперпредставления? - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть ситуация, когда я хочу, чтобы одно подпредставление не было обрезано до границ суперпредставления, в то время как остальные подпредставления суперпредставления обрезаны до его границ. Есть ли способ исключить определенное значение UIView из пределов его суперпредставления. Точно так же может UIView указать, какие подпредставления он хочет / не хочет обрезать до своих границ?

Что касается кода, я использую Koloda для создания UIView схожие с картами Tinder. У меня есть представление коллекции, чьи ячейки по сути являются представлениями Колоды. Всякий раз, когда карта начинает панорамировать, я устанавливаю для свойства clipsToBounds представления коллекции ее ячейки значение false. Это позволяет перемещать ячейку над панелью навигации без обрезки. Когда панорама заканчивается, свойство clipsToBounds представления коллекции ячеек представления возвращается к true.

import UIKit
import Koloda

class LikedUserCollectionViewCell: UICollectionViewCell {
    @IBOutlet var swipeView: KolodaView!
    var parentVC: MyViewController!
}

extension LikedUserCollectionViewCell: KolodaViewDelegate, KolodaViewDataSource {
    func koloda(_ koloda: KolodaView, viewForCardAt index: Int) -> UIView {
        //return a KolodaView, this code isn't important to the issue
        return KolodaView()
    }

    func kolodaNumberOfCards(_ koloda: KolodaView) -> Int {
        return 1
    }

    func kolodaPanBegan(_ koloda: KolodaView, card: DraggableCardView) {
        self.parentVC.collectionView.bringSubviewToFront(self)
        //Here, instead of unclipping all of the collection view's subviews, I would like to only unclip the one containing the subview that is being panned
        self.parentVC.collectionView.clipsToBounds = false
    }

    func kolodaPanFinished(_ koloda: KolodaView, card: DraggableCardView) {
        //Once the pan is finished, all of the collection view's subviews can be clipped again
        self.parentVC.collectionView.clipsToBounds = true
    }

    func koloda(_ koloda: KolodaView, didSwipeCardAt index: Int, in direction: SwipeResultDirection) {
        //Not relevant to the question
    }
}

Проблема заключается в том, что существуют ячейки, которые частично прокручиваются из представления коллекции, но невсе же удалены из представления коллекции, поскольку они не полностью прокрутили представление представления, теперь они становятся видимыми, так как для clipsToBounds представления сбора теперь установлено значение true. Вот почему я хочу иметь возможность диктовать, какое из подпредставлений представления коллекции обрезается до его границ. Это поведение можно увидеть в следующем gif:

enter image description here

Итак, в итоге, есть способ, вместо того, чтобы отключить все подпредставленияиз границ их суперпредставления через superview.clipsToBounds = false, я мог открепить только одно подпредставление от границ его суперпредставления?

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Простое решение здесь состоит в том, что, поскольку вы хотите сделать исключение для одного представления, не перемещайте ячейку collectionView. возьмите snapshotView и переместите вместо него снимок;это может быть где-нибудь еще в иерархии и не должно быть потомком представления коллекции. Вы можете использовать UIView.convert (from:) для преобразования координат ячеек в координатное пространство соответствующего родительского представления для правильного размещения снимка.

Редактирование из OP:

Я смог решить свою проблему, воспользовавшись советом Джоша и обновив мой код до следующего:

import UIKit
import Koloda

class LikedUserCollectionViewCell: UICollectionViewCell {
    @IBOutlet var swipeView: KolodaView!
    var parentVC: MyViewController!
    //DraggableCardView is a custom Koloda class
    var draggableCardView: DraggableCardView!
}

extension LikedUserCollectionViewCell: KolodaViewDelegate, KolodaViewDataSource {
    func koloda(_ koloda: KolodaView, viewForCardAt index: Int) -> UIView {
        //return a KolodaView, this code isn't important to the issue
        return KolodaView()
    }

    func kolodaNumberOfCards(_ koloda: KolodaView) -> Int {
        return 1
    }

    func kolodaPanBegan(_ koloda: KolodaView, card: DraggableCardView) {
        let snapshotView = self.swipeView.snapshotView(afterScreenUpdates: false)!
        snapshotView.accessibilityIdentifier = "snapshotView"
        self.parentVC.view.addSubview(snapshotView)
        snapshotView.frame.origin = self.parentVC.view.convert(swipeView.viewForCard(at: 0)!.frame.origin, from: swipeView)
        draggableCardView = card
        swipeView.viewForCard(at: 0)?.isHidden = true
    }

    func koloda(_ koloda: KolodaView, draggedCardWithPercentage finishPercentage: CGFloat, in direction: SwipeResultDirection) {
        let snapshotView = self.parentVC.view.subviews.first(where: { $0.accessibilityIdentifier == "snapshotView" })!
        snapshotView.frame.origin = self.parentVC.view.convert(draggableCardView.frame.origin, from: swipeView)
    }

    func kolodaPanFinished(_ koloda: KolodaView, card: DraggableCardView) {
        let snapshotView = self.parentVC.view.subviews.first(where: { $0.accessibilityIdentifier == "snapshotView" })!
        draggableCardView = nil
        snapshotView.removeFromSuperview()
        swipeView.viewForCard(at: 0)?.isHidden = false
    }

    func koloda(_ koloda: KolodaView, didSwipeCardAt index: Int, in direction: SwipeResultDirection) {
        //Not relevant to the question
    }
}

0 голосов
/ 08 ноября 2019

Если посмотреть на ваш интерфейс, почему collectionView находится над (панелью навигации)?

В этой ситуации вам не нужно ничего обрезать, если collectionView находится за панелью навигации.

Либо вызовите sendSubview (toBack: collectionView) , либо установите для collectionView.layer.zPosition более высокое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...