Как изменить рамку UICollectionViewCell, чтобы показать скрытую кнопку при нажатии? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть пользовательский UICollectionViewCell, который имеет UIImage и UIButton.

Рамка для расширенной ячейки - 110 x 60. По умолчанию это будет 60x60.

Когда приложение загружается, я бы хотел, чтобы ячейка начиналась с размера 60x60 и показывала только изображение.При нажатии на ячейку ячейка обновится до кадра 110x60 и покажет кнопку UIB, которая находится рядом с изображением.

В настоящее время мое приложение загружается, и ячейки имеют размер 60x60, но из-за моей настройки автоматической компоновкиизображение сжато, и кнопка в натуральную величину.Если я коснусь ячейки, она обновит свой фрейм и выглядит великолепно.

Цель состоит в том, чтобы сначала увидеть только изображение, а затем увидеть кнопку после того, как ячейка обновила свой фрейм.

Я также хотел бы иметь возможность снова нажать на ячейку и изменить ее размер до 60x60, скрывая кнопку и показывая только изображение.

Вот что я сейчас пытаюсь:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    collectionView.performBatchUpdates(nil, completion: nil)
}

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {

    switch collectionView.indexPathsForSelectedItems?.first {
    case .some(indexPath):
        return CGSize(width: 110.0, height: 60.0)
    default:
        return CGSize(width: 60.0, height: 60.0)
    }

}

По запросу мой код класса CollectionViewCell:

class myCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var myImageView: UIImageView!
    @IBOutlet weak var myButton: UIButton!

    var myCellDelegate : myCollectionViewCellDelegate?

    override func awakeFromNib() {
        super.awakeFromNib()

        self.layer.cornerRadius = 30
        self.layer.masksToBounds = true

        myImageView.layer.cornerRadius = myImageView.frame.width / 2
        myImageView.layer.masksToBounds = true
    }

    // MARK: - Actions

    @IBAction func myButtonTapped(_ sender: Any) {
        self.myCellDelegate?.actionClicked(self)
    }
}

Заметим, что там не так много, поэтому не уверен, поможет ли это.Я просто настраиваю cornerRadius для ячейки и моего изображения, а затем создаю делегата для действия с кнопкой.

1 Ответ

0 голосов
/ 21 февраля 2019

Я думаю, многое зависит от ваших ограничений в nib-файле.

Опция 1

Построитель интерфейса> выберите ImageView> Правая панель> Инспектор размеров> Играть с«Приоритет удержания содержимого» и «Сопротивление сжатию содержимого» * ​​1007 *

В частности, сопротивление горизонтальному сжатию imageView должно быть больше, чем сопротивление сжатия кнопки.

Система выбирает представлениерастянуть на основе приоритетов, указанных для этих двух параметров.

Вариант 2


            Top                   
     +-------------+--------+     
     |             |        |     
     |             |        |     
 Left|   (Image)   |(Button)|Right
     |             |        |     
     |             |        |     
     +-------------+--------+     
          Bottom                  

     <------------->              
          Width               

Left, Top, Right, Bottom ---> constraint to the cell contentView
Width ---> set to a fixed 60
(Remember to enable clipsToBounds)

Когда ячейка увеличится, появится ваша кнопка.В конце концов вы можете добавить анимацию.

...