Анимация альфы до 0 не работает должным образом

В моем приложении есть несколько анимаций, которые включают изменение альфа-значения разных объектов. Они отлично работают для затухания объекта, но они никогда не работают для затухания до 0.

        UIView.animateWithDuration(0.4,
            delay: 0,
            options: .CurveLinear & .AllowUserInteraction & .BeginFromCurrentState,
            animations: {
                cell.notesLabel.alpha = 0
            }, completion: nil)

По сути, прозрачность просто мгновенно переключается со 100% на 0%. Если я увеличу продолжительность, для запуска анимации потребуется больше времени, а затем она снова запустится мгновенно.

У кого-нибудь есть идеи?

Весь код:

let cell = tableView.cellForRowAtIndexPath(indexPath) as CustomTransactionTableViewCell
        if cell.notesLabel.alpha == 100 {
            UIView.animateWithDuration(0.4,
                delay: 0,
                options: .CurveLinear | .AllowUserInteraction | .BeginFromCurrentState,
                animations: {
                    cell.notesLabel.alpha = 0
                }, completion: { (finished:Bool) in
                    UIView.animateWithDuration(1,
                        delay: 0,
                        options: .CurveLinear & .AllowUserInteraction & .BeginFromCurrentState,
                        animations: {
                            cell.paymentArrowImage.frame.origin.x = cell.paymentArrowImage.frame.origin.x - 400
                            cell.creditArrowImage.frame.origin.x = cell.creditArrowImage.frame.origin.x - 400
                            cell.paymentNameLabel.frame.origin.x = cell.paymentNameLabel.frame.origin.x + 400
                            cell.dateLabel.frame.origin.x = cell.dateLabel.frame.origin.x + 400
                            cell.costLabel.frame.origin.x = cell.costLabel.frame.origin.x - 400
                        }, completion: nil)
            })
        } else {
            UIView.animateWithDuration(0.4,
                delay: 0,
                options: .CurveLinear & .AllowUserInteraction & .BeginFromCurrentState,
                animations: {
                    cell.paymentArrowImage.frame.origin.x = cell.paymentArrowImage.frame.origin.x + 400
                    cell.creditArrowImage.frame.origin.x = cell.creditArrowImage.frame.origin.x + 400
                    cell.costLabel.frame.origin.x = cell.costLabel.frame.origin.x + 400
                    cell.paymentNameLabel.frame.origin.x = cell.paymentNameLabel.frame.origin.x - 400
                    cell.dateLabel.frame.origin.x = cell.dateLabel.frame.origin.x - 400
                    cell.notesLabel.alpha = 100
                }, completion: nil)
        }

person user3746428    schedule 17.10.2014    source источник
comment
Является ли ячейка ячейкой коллекции или представления таблицы? Это может объяснить некоторые удивительные результаты.   -  person danh    schedule 18.10.2014
comment
Пробовали ли вы поиграться с различными параметрами, чтобы увидеть, не приводят ли они к неожиданным результатам? Я бы начал с простого .CurveLinear и пошел дальше.   -  person oltman    schedule 18.10.2014
comment
@danh Это ячейка табличного представления, но это проблема и вне ячеек. Я уже использовал ту же анимацию в стандартных представлениях.   -  person user3746428    schedule 18.10.2014
comment
Вам нужно использовать | вместо & между вариантами.   -  person Kevin    schedule 18.10.2014
comment
@Kevin К сожалению, это не имеет значения.   -  person user3746428    schedule 18.10.2014
comment
попробуйте с .CurveEaseInOut вместо .CurveLinear   -  person Asif Asif    schedule 18.10.2014
comment
@user3746428 user3746428 В других местах для параметров по-прежнему используются символы & вместо |.   -  person erdekhayser    schedule 18.10.2014
comment
@ 0x7fffffff Это новая информация. Может быть с этим что-то связано   -  person erdekhayser    schedule 18.10.2014
comment
@ 0x7fffffff Это исправило! Спасибо всем за помощь.   -  person user3746428    schedule 18.10.2014


Ответы (2)


Проблема в том, что вы используете от 0 до 100 в качестве альфа-значений, когда ожидается, что они будут значениями от 0,0 до 1,0. Это приводит к сбоям в работе вашего состояния, а также к проблемам с анимацией.

person Mick MacCallum    schedule 17.10.2014

Ваши варианты в настоящее время .CurveLinear & .AllowUserInteraction & .BeginFromCurrentState

Эти опции на самом деле являются значениями с битовым сдвигом, поэтому они представлены как 001, или 010, или 100, и так далее.

Когда вы & объединяете их вместе, вы на самом деле проверяете, какие биты у них общие. 001 % 010 возвращает 00, потому что там, где 1 находится в единице, 0 находится в любой из них.

Что вы хотите, так это | (или) их вместе. Таким образом, если в этом разряде для любого числа находится 1, оно будет найдено в ответе. Например, 010 | 001 возвращает 011.

Для вашего кода вам действительно нужен .CurveLinear | .AllowUserInteraction | .BeginFromCurrentState.

person erdekhayser    schedule 17.10.2014
comment
Почему-то кажется, что это не исправить. Я обновлю свой первоначальный вопрос остальной частью моего кода, чтобы вы могли увидеть, есть ли в нем что-то очевидное. - person user3746428; 18.10.2014
comment
Хотя это не устраняет проблему, о которой вы сообщили, erdekhayser по-прежнему прав, говоря, что это проблема в вашем коде. - person Daniel T.; 18.10.2014