2016-10-31 2 views
1

У меня есть две надписи над моим UICollection, и мне нужно анимировать при прокрутке в виде коллекции. В основном дает пользователю ощущение, что экран является одним большим прокручиваемым представлением.Анимация NSLayoutConstraint при прокрутке UICollectionView

мой взгляд выглядит в интерфейсе строителя:

enter image description here

Я придумал следующий код, чтобы сделать его выглядеть лучше на небольших экранах, но это не дает мне эффект, я хочу:

func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 
    if(velocity.y>0){ 
     if Device.IS_3_5_INCHES() { 
      self.topConstraint.constant = -100 
     } 
     if Device.IS_4_INCHES() { 
      self.topConstraint.constant = -70 
     } 
     if Device.IS_4_7_INCHES() { 
      self.topConstraint.constant = 0 
     } 
     if Device.IS_5_5_INCHES() { 
      self.topConstraint.constant = 0 
     } 
    }else{ 
     self.topConstraint.constant = 50 
    } 
} 

проблема с этим кодом является то, что экран теперь «прыгает» вокруг вместо живой, как будто его там, где часть представления коллекции.

Другая проблема с этим кодом, что он «перескакивает» назад, как только вы начинаете прокрутку в другом направлении. Независимо от того, находитесь ли вы в верхней или нижней части UIScrollView. Установка TopConstraint на 50 будет только счастливой, когда вы на вершине.

+0

Возможно, вы можете использовать заголовки коллекционного просмотра в качестве альтернативы? – Danoram

+0

Почему бы просто не сделать первые 2 ячейки занятыми всей строкой и поместить ярлык внутри каждой ячейки? – JustinM

+0

Я открыт для всего. Разве заголовки исчезают при прокрутке? –

ответ

1

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

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

let insets = collectionView.contentInset 
let collectionViewWidth = collectionView.frame.width - (insets.left + insets.right + 1) 
let collectionViewHeight = collectionView.frame.height - (insets.top + insets.bottom) 

    switch indexPath.row { 
    case 0, 1: 

    return CGSize(width: collectionViewWidth, height: collectionViewHeight/8) 

     default: 
    return CGSize(width: collectionViewWidth/3, height: collectionViewHeight/8) 
    } 
} 

Вы можете изменить, сколько вы разделите высоту, чтобы получить желаемое соотношение. То же самое со значением по умолчанию. Итак, скажите, что вы хотели, чтобы все ячейки после первых 2 были равны 3 в каждой строке, вы разделили бы коллекциюViewWidth/3

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

+0

Он работает, отлично! Спасибо за совет. –

+0

уверен, ваш прием! – JustinM

Смежные вопросы