iOS: Как конвертировать UIViewAnimationCurve в UIViewAnimationOptions?

на UIKeyboardAnimationCurveUserInfoKey есть UIViewAnimationCurve значение. Как преобразовать его в соответствующий UIViewAnimationOptions значение для использования с

4 ответов


возможно, вы можете взять свое первое решение и сделать его встроенной функцией, чтобы сохранить толчок стека. Это такой жесткий условный (постоянный и т. д.), что он должен скомпилироваться в довольно крошечный кусок сборки.

изменить: Per @matt, вот вы идете (цель-C):

static inline UIViewAnimationOptions animationOptionsWithCurve(UIViewAnimationCurve curve)
{
  switch (curve) {
    case UIViewAnimationCurveEaseInOut:
        return UIViewAnimationOptionCurveEaseInOut;
    case UIViewAnimationCurveEaseIn:
        return UIViewAnimationOptionCurveEaseIn;
    case UIViewAnimationCurveEaseOut:
        return UIViewAnimationOptionCurveEaseOut;
    case UIViewAnimationCurveLinear:
        return UIViewAnimationOptionCurveLinear;
  }
}

Swift 3:

extension UIViewAnimationOptions {
    init(curve: UIViewAnimationCurve) {
        switch curve {
            case .easeIn:
                self = .curveEaseIn
            case .easeOut:
                self = .curveEaseOut
            case .easeInOut:
                self = .curveEaseInOut
            case .linear:
                self = .curveLinear
        }
    }
}

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

animationOption = animationCurve << 16;

...возможно, с приведением к NSUInteger, а затем к UIViewAnimationOptions, если компилятор чувствует, что жалуется на это.


в Swift вы можете сделать

extension UIViewAnimationCurve {
    func toOptions() -> UIViewAnimationOptions {
        return UIViewAnimationOptions(rawValue: UInt(rawValue << 16))
    }
}

проблема с решением на основе коммутатора заключается в том, что он предполагает, что никакая комбинация опций никогда не будет передана. Однако практика показывает, что могут быть ситуации, когда предположение не выполняется. Один экземпляр, который я нашел (по крайней мере, на iOS 7), Когда вы получаете анимацию клавиатуры для анимации вашего контента вместе с появлением/исчезновением клавиатуры.

если вы слушаете keyboardWillShow: или keyboardWillHide: уведомления, а затем получить кривую клавиатуру объявила использования, электронной.г:

UIViewAnimationCurve curve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue];

вы, вероятно, получите значение 7. Если вы передадите это в функцию/метод switch, вы не получите правильный перевод этого значения, что приведет к неправильному поведению анимации.

ответ Ноя Уизерспуна вернет правильное значение. Объединив два решения, вы можете написать что-то вроде:

static inline UIViewAnimationOptions animationOptionsWithCurve(UIViewAnimationCurve curve)
{
    UIViewAnimationOptions opt = (UIViewAnimationOptions)curve;
    return opt << 16;
}

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