2016-04-07 4 views
0

Я пытаюсь повернуть UILabel на 180 °, когда выбирается ячейка, которая содержит его. Я попытался настроить преобразование на уровне, я пробовал CABasicAnimation и UIView.animateWithDuration без везения.Вращающаяся метка внутри UITableViewCell

У кого-нибудь есть опыт в прошлом?

Я не могу вызвать reloadData, потому что метка находится внутри ячейки аккордеона, а выбор вызывает открытие или закрытие аккордеона. reloadData переопределяет анимацию из beginUpdates/endUpdates.

Вот что я пробовал:

func rotate180Degrees(duration: CFTimeInterval = 1.0, completionDelegate: AnyObject? = nil) { 
    let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation") 
    rotateAnimation.fromValue = 0.0 
    rotateAnimation.toValue = CGFloat(M_PI) 
    rotateAnimation.duration = duration 

    if let delegate: AnyObject = completionDelegate { 
     rotateAnimation.delegate = delegate 
    } 
    self.layer.addAnimation(rotateAnimation, forKey: nil) 
} 

Как это:

UIView.animateWithDuration(0.1) { 
    cell.chevronLabel.transform = CGAffineTransformMakeRotation(CGFloat(M_PI)) 
} 

Вот моя модель клетки, если оно соответствует:

class SideMenuAccountTypeCell: UITableViewCell { 
    @IBOutlet weak var accountLabel: UILabel! 
    @IBOutlet weak var abbreviationLabel: UILabel! 
    @IBOutlet weak var circleView: CircleView! 
    @IBOutlet weak var chevronLabel: UILabel! 

    private (set) var items = [Item]() 

    class Item { 
     var isHidden: Bool 
     var value: AnyObject 

     init(_ hidden: Bool = true, value: AnyObject) { 
      self.isHidden = hidden 
      self.value = value 
     } 
    } 

    class HeaderItem: Item { 
     init (value: AnyObject) { 
      super.init(false, value: value) 
     } 
    } 

    func append(item: Item) { 
     self.items.append(item) 
    } 

    func removeAll() { 
     self.items.removeAll() 
    } 

    func expand(headerIndex: Int) { 
     self.toggleVisible(headerIndex, isHidden: false) 
    } 

    func collapse(headerIndex: Int) { 
     self.toggleVisible(headerIndex, isHidden: true) 
    } 

    private func toggleVisible(headerIndex: Int, isHidden: Bool) { 
     var header = headerIndex 
     header += 1 

     while header < self.items.count && !(self.items[header] is HeaderItem) { 
      self.items[header].isHidden = isHidden 

      header += 1 
     } 
    } 
} 
+1

Просьба поделиться кодом, который не работает. – Apurv

ответ

0

Найдено этот вопрос y'all:

Xcode автоматически предлагают поставить метод tableView(tableView: tableView, cellForRowAtIndexPath: indexPath) вместо tableView.cellForRowAtIndexPath(indexPath: indexPath), что вызвало новую ячейку быть удалена из очереди, перекрывая анимации.

2

попробовать это в вашем didSelectRowAtIndexPath

SideMenuAccountTypeCell *cell = [self.myTableView cellForRowAtIndexPath:indexPath]; 

    //transform to flips on y-axis 
    CATransform3D tfm = CATransform3DMakeRotation(M_PI, 0.0f, -1.0f, 0.0f); 

    //apply the transform before the animation so that the label remains in the same state on completion 
    cell.chevronLabel.layer.transform = tfm; 

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    animation.duration = 0.5f; 
    animation.beginTime = 0.0f; 
    //apply a little perspective 
    tfm.34 = 0.001f 
    tfm.m14 = -0.001f; 
    animation.removedOnCompletion = YES; 
    animation.fillMode = kCAFillModeForwards; 
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
    animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; 
    animation.toValue = [NSValue valueWithCATransform3D:tfm]; 
    [cell.chevronLabel.layer addAnimation:animation forKey:@"rotateTheLabel"]; 
+0

Тот же эффект, что и другие решения, я пробовал - скажем, никакого эффекта. Я попытался разместить точки останова, и функция * * была запущена. Это проблема раскадровки? –

+0

совсем нет ... я тестировал выше, используя табличное представление в раскадровке, с прототипом ячейки. Я бы проверял, чтобы у вас была правильная ссылка на ячейку. Кроме того, побочный эффект вышеизложенного заключается в том, что chevronLabel будет оставаться трансформированным, когда ячейка повторно используется, поэтому вам нужно установить преобразование обратно, когда ячейка повторно используется. с этим в виду, видите ли вы преобразование на месте после reloadData? Попробуйте также перемещать содержимое функции в файл didSelectRowAtIndexPath, чтобы исключить проблему с ячейкой ref. – MDB983

+0

Я запускаю его в 'didSelectRowAtIndexPath'. После дальнейшего исследования кажется, что преобразование * применяется *, но пользовательский интерфейс по какой-то причине не обновляется. Я попытался вызвать 'reloadData', без эффекта. –

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