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 работает не во всех ситуациях, с которыми вы можете столкнуться сегодня, в то время как это делает.