2016-11-25 3 views
0

Возможно ли, что при прокрутке останется видимым на экране UITableViewCell (например, при прокрутке вниз ячейка должна оставаться видимой в верхней части экрана). Я неявно спрашиваю, могу ли я сделать это с помощью ячейки, поэтому не беспокойтесь, предлагая мне использовать заголовок или нижний колонтитул таблицы, потому что мне сказали, что на этом сайте невозможно анимировать представления внутри нижнего колонтитула или заголовка, я ДЕЙСТВИТЕЛЬНО НУЖДАЕТСЯ возможность анимации подзонов внутри представления таблицы (что, по-видимому, может быть сделано только в ячейке).Сохранять видимый UITableViewCell при прокрутке? (Swift 3)

Итак, чтобы перефразировать: можно ли в любой момент держать ячейку внутри вида стола видимой во время прокрутки вверх или вниз? Если нет, есть ли «трюк» для анимации представлений внутри нижнего колонтитула или заголовка? потому что, как я уже сказал, мне сказали, что нет «законного» способа сделать это.

Исправьте меня, если это не так. Благодаря!

UPDATE: Чтобы исправить себя на некоторые замечания, которые я сделал раньше: кажется, что это можно оживить подвидов внутри вид колонтитула, но он не работает так же, как анимировать ячейку внутри представления таблицы, поэтому, если кто-нибудь знает, как совершить анимацию в нижнем колонтитуле, не стесняйтесь отбросить некоторые предложения. Вызов reloadData() Метод представления таблицы работает с ячейками таблицы, но нижний колонтитул полностью игнорирует UIView.animate(withDuration:) и мгновенно отображает изменения макета без их анимации.

UPDATE:

if self.didTapOnButton == true { 
     self.view.layoutIfNeeded() 
     UIView.animate(withDuration: 0.3, animations: { 
      bubbleView.backgroundColor = UIColor(red: 255/255, green: 225/255, blue: 68/255, alpha: 1) 
      containerViewTrailingConstraint.constant = 5 
      iconImageViewTrailingConstraint.constant = 5 
      bubbleViewEqualWidthConstraint.constant = 0 
      self.view.layoutIfNeeded() 
     }, completion: { (done:Bool) in 
      UIView.animate(withDuration: 0.2, animations: { 
       textView.alpha = 1 
       doneButton.alpha = 1 
      }, completion: { (done:Bool) in 
       textView.becomeFirstResponder() 
      }) 
     }) 
     self.didTapOnButton = false 
    } 

код, который запускает анимацию. self.didTapOnButton установлен на true, когда кнопка нажата, и сразу после этого табличное представление перезагружается, поэтому этот код запускается один раз (уведомление self.didTapOnButton получает повторное задание до false после завершения анимации). Кажется, очень маловероятно, что проблема находится внутри этого кода, хотя, поскольку она отлично работала, когда ячейка все еще находилась в представлении таблицы, вместо нижнего колонтитула таблицы.

+1

Возможно, вы имели в виду «table view _section_ header»? Я спрашиваю, потому что они являются представлениями с желаемой встроенной функциональностью (также потому, что я уверен, что можно анимировать заголовки заголовков таблицы). У вас есть ссылка на то, где вы читаете, что это невозможно? – Andreas

+0

Да, вот что я имею в виду. Не могу найти ссылку, это было давно, поэтому, возможно, она была удалена, она была с другой учетной записью. Чтобы быть более конкретным, я хочу анимировать внутри раздела FOOTER, а не заголовка. Вы знаете, как это сделать? Вызов 'reloadData()' может сделать ячейки анимированными, а нижние колонтитулы - нет. В нижнем колонтитуле изменения в блоке анимации мгновенно происходят без анимации. –

+0

Я просто добавил тестовый подкласс UIView, содержащий анимированный CALayer, и он отлично работает. Какую анимацию вы пытаетесь достичь? – Paulw11

ответ

0

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

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

if self.didTapOnButton == true { 
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { 
     self.view.layoutIfNeeded() 
     UIView.animate(withDuration: 0.3, animations: { 
      bubbleView.backgroundColor = UIColor(red: 255/255, green: 225/255, blue: 68/255, alpha: 1) 
      containerViewTrailingConstraint.constant = 5 
      iconImageViewTrailingConstraint.constant = 5 
      bubbleViewEqualWidthConstraint.constant = 0 
      self.view.layoutIfNeeded() 
     }, completion: { (done:Bool) in 
      UIView.animate(withDuration: 0.2, animations: { 
       textView.alpha = 1 
       doneButton.alpha = 1 
      }, completion: { (done:Bool) in 
       textView.becomeFirstResponder() 
      }) 
     }) 
     self.didTapOnButton = false 
    } 
} 
+0

ДА! ЭТО ОНО! ЭТО СРАБОТАЛО! СПАСИБО БОЛЬШОЕ! Глупое дело не так давно, я исправил еще одну проблему с 'UIAlertController', сразу же исчезающим после того, как он был представлен точно так же, так что я сейчас нападаю, чтобы не думать об этом раньше. Я предполагаю, что эти временные хаки похожи на план Z, на который вы можете пойти, когда ничего не работает. Второй раз это спасатель после того, как весь день царапал мне голову по глупой проблеме макета. Еще раз спасибо! И, кстати, мне не нужен «+ 0,1' секунд от вашего кода, просто' .now() 'сделал трюк для меня. Сохранял меня десятую часть секунды :) –

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