Ускорение анимации iPhone - PullRequest
1 голос
/ 22 октября 2009

У меня есть приложение для ввода данных, в котором пользователь вводит около 6 частей информации в разных представлениях в контроллере навигации. Это работает нормально, но как только пользователь привыкнет к приложению, время, необходимое для появления следующего экрана, замедляет работу пользователя.

Я попробовал приложение без анимации, но это не совсем правильно. Есть ли способ заставить анимацию появляться быстрее? В основном я использую контроллер навигации, представления таблиц и представления выбора.

Ответы [ 2 ]

2 голосов
/ 23 октября 2009

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

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

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
0 голосов
/ 23 октября 2009

Вы повторно используете ячейки в табличном представлении? Удостоверьтесь, что вы действительно используете их повторно, другими словами, выполните всю настройку ячейки внутри случая if (cell == nil) и примените данные только в общем случае (как для повторного использования, так и для вновь созданного).

Помните о том, что в ячейку может попасть прозрачность. Часто кажется, что вы должны сделать вещи прозрачными, но, возможно, вы не делаете, потому что UITableViewCell знает о проблемах. Отключение прозрачности в некоторых объектах может показаться неправильным, но стоит попробовать посмотреть, действительно ли это работает. Большая часть стоимости прокрутки ячейки - это создание композиции по мере ее перемещения, а не создание ячейки изначально.

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

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

Вы можете также рассмотреть вопрос о принятии стратегии Мэтта Галлахера для обработки ячеек - она ​​останавливает превращение вашего cellForRowAtIndexPath в один длинный и неприятный набор ifs.

...