Анимация изменений макета внутри UICollectionViewCell и его подпредставлений, имеющих ограничения AutoLayout

Я увеличиваю / уменьшаю размер ячейки представления коллекции при выборе. В ячейке есть подвиды, включая зеленую полосу, метку «vs» и два числовых текстовых поля. Как показано на гифке / ссылке ниже. Задача состоит в том, чтобы анимировать масштаб, а также анимировать масштаб подпредставлений, содержащихся в ячейке, и сохранить заданные ограничения макета. Что происходит, как показано на видео, заключается в том, что целевой макет переходит в конечный пункт назначения без анимации изменений. При первом нажатии ячейка «5vs0» хорошо масштабируется, но текстовое поле «0» перескакивает в крайнее правое положение без какой-либо анимации. При втором щелчке мышью, чтобы минимизировать масштаб, зеленая полоса слева немедленно изменяет размер до значения, равного текстовым полям 5 и 0. Это означает, что ограничения автоматической компоновки хорошо работают с представлением контейнера (ячейкой представления коллекции), когда оно масштабируется! Единственная проблема заключается в том, что ограничения макета не анимируются вместе с недействительным макетом представления коллекции.

Видео, показывающее масштаб ячеек представления коллекции, но непреднамеренные резкие изменения подпредставления

Я установил файл xib без предупреждений или ошибок автоматического макета. Макет представления коллекции становится недействительным при щелчке по ячейке и вызове setCollectionViewLayout с анимацией, установленной на true. NB, после чего я вызываю центральную отправку в основную очередь, чтобы вызвать layoutIfNeeded для ячейки представления коллекции, которую нужно изменить. Похоже, это не влияет на анимацию макета в подпредставлениях. Что касается структуры, как написано в приведенном ниже коде, я веду словарь макетов, к которому я переключаюсь между выбором элемента ячейки.

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

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){
    var cell = collectionView.cellForItemAtIndexPath(indexPath) as! MatchEntryCell

    if (collectionView.collectionViewLayout.isEqual(self.layouts[.Standard]!)){
        collectionView.setCollectionViewLayout(self.layouts[.Edit]!, animated: true)
        cell.homeScore!.userInteractionEnabled = true
        cell.homeScore!.becomeFirstResponder()
        picker.selectRow(cell.homeScore!.text.toInt()! , inComponent: 0, animated: true)
        picker.selectRow(cell.awayScore!.text.toInt()! , inComponent: 1, animated: true)

    } else if (collectionView.collectionViewLayout.isEqual(self.layouts[.Edit]!)) {
        collectionView.setCollectionViewLayout(self.layouts[.Standard]!, animated: true)
        cell.homeScore!.resignFirstResponder()
        cell.homeScore!.userInteractionEnabled = false
    }
    dispatch_async(dispatch_get_main_queue()) {
        UIView.animateWithDuration(0.5, animations: { () -> Void in
            cell.layoutIfNeeded()
        })
    }
}

Я добавил маски автоизменения размеров с шириной и высотой, а также ниже для подвидов в моем подклассе UICollectionViewCell. Но без радости! Этот пост связан с этим решением, но я не испытываю радости!

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.layer.borderWidth = 1
    self.layer.cornerRadius = 10
    self.layer.borderColor = UIColor.clearColor().CGColor

    self.homeBar?.autoresizingMask = .FlexibleWidth | .FlexibleHeight
    self.homeScore?.autoresizingMask = .FlexibleWidth | .FlexibleHeight
    self.awayBar?.autoresizingMask = .FlexibleWidth | .FlexibleHeight
    self.awayScore?.autoresizingMask = .FlexibleWidth | .FlexibleHeight
    self.autoresizingMask = .FlexibleWidth | .FlexibleHeight
}

У кого-нибудь есть идеи или предложения? Ваше здоровье!


person Edgardo Agno    schedule 11.06.2015    source источник


Ответы (1)


Я решил эту проблему, используя старые пружины и стойки. Прямоугольники выравнивания не интерполируют изменение itemSize ячейки представления коллекции при использовании автоматического макета, но пружины и распорки делают.

person Edgardo Agno    schedule 17.06.2015
comment
Как вы ее решили? Пример кода? У меня та же проблема. - person fabrizioM; 05.08.2015