Ускорение анимации на iPhone
-
05-07-2019 - |
Вопрос
У меня есть приложение для ввода данных, в котором пользователь вводит около 6 фрагментов информации в разных представлениях в навигационном контроллере.Это работает нормально, но как только пользователь привыкает к приложению, время, необходимое для появления следующего экрана, замедляет работу пользователя.
Я попробовал приложение без анимации, но мне показалось, что это не совсем правильно.Есть ли способ ускорить анимацию?В основном я использую навигационный контроллер, табличные представления и средства выбора.
Решение
Каждый раз, когда вы загружаете новое представление, вы можете попытаться объединить экраны, используя режим прокрутки или другой макет.Кроме того, если вы загружаете какие-либо ненужные графические изображения, вы можете захотеть удалить их.
Вы также можете добавить каждый вид в качестве подвида самостоятельно, и в этом случае, помимо прочего, у вас есть контроль над продолжительностью анимации.Этот код сделает это за вас, хотя будьте осторожны, поскольку я только что написал его и не тестировал (стиль перехода и логические параметры могут быть удалены, поскольку прямо сейчас они ничего не делают).
UIViewControllerExtendedPresentModalViewController.h
#import <Foundation/Foundation.h>
typedef enum _ExtendedModalTransitionStyle
{
ExtendedModalTransitionStyleTopDown
} ExtendedModalTransitionStyle;
@interface UIViewController ( ExtendedPresentModalViewController )
- (void)presentModalViewController: (UIViewController*)modalViewController
withTransitionStyle: (ExtendedModalTransitionStyle)style
animated: (BOOL)animated;
- (void)dismissModalViewController: (UIViewController*)modalViewController
withTransitionStyle: (ExtendedModalTransitionStyle)style
animated: (BOOL)animated;
@end
UIViewControllerExtendedPresentModalViewController.m
#import "UIViewControllerExtendedPresentModalViewController.h"
#import <QuartzCore/QuartzCore.h>
@implementation UIViewController ( ExtendedPresentModalViewController )
- (void)presentModalViewController: (UIViewController*)modalViewController
withTransitionStyle: (ExtendedModalTransitionStyle)style
animated: (BOOL)animated
{
[modalViewController retain]; // we'll need this for a little while, hang on to it.
CATransition* transition = [CATransition animation];
[transition setDuration: 0.4];
[transition setTimingFunction:
[CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear]];
[transition setType: kCATransitionMoveIn];
[transition setSubtype: kCATransitionFromBottom];
[[[self view] layer] addAnimation: transition
forKey: nil];
[[self view] addSubview: [modalViewController view]];
}
- (void)dismissModalViewController: (UIViewController*)modalViewController
withTransitionStyle: (ExtendedModalTransitionStyle)style
animated: (BOOL)animated
{
CATransition* transition = [CATransition animation];
[transition setDuration: 0.4];
[transition setTimingFunction:
[CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear]];//kCAMediaTimingFunctionEaseInEaseOut]];
[transition setType: kCATransitionReveal];
[transition setSubtype: kCATransitionFromTop];
[[[[modalViewController view] superview] layer] addAnimation: transition
forKey: nil];
[[modalViewController view] removeFromSuperview];
[modalViewController release]; // all done, we can let this go.
}
@end
Другие советы
Вы повторно используете ячейки в табличном представлении? Удостоверьтесь, что вы действительно используете их повторно, другими словами, выполните всю настройку ячейки внутри случая if (cell == nil) и примените данные только в общем случае (как для повторного использования, так и для вновь созданного). Р>
Помните о снижении производительности, которое может иметь прозрачность в ячейке. Часто кажется, что вы должны сделать вещи прозрачными, но, возможно, вы не делаете, потому что UITableViewCell знает о проблемах. Отключение прозрачности в некоторых объектах может показаться неправильным, но стоит попробовать посмотреть, действительно ли это работает. Большая часть прокрутки ячейки - это компоновка по мере движения ячейки, а не ее создание на начальном этапе.
Еще одна вещь, которая может помочь, - это создание компоновки представления, которое вы предварительно применяете к своей ячейке, а не добавление всех представлений в ячейку, тогда вы применяете только один предварительно подготовленный вид к своей ячейке.
Если вы на самом деле анимируете представления в прокручивающихся ячейках, вам, возможно, придется переосмыслить это или хотя бы использовать какое-то упрощение, чтобы сделать его немного менее затратным для устройства.
Вы могли бы также рассмотреть возможность принятия стратегии Мэтта Галлахера для обработки ячеек - он останавливает превращение вашего cellForRowAtIndexPath в один длинный и неприятный набор ifs.