Вопрос

У меня есть приложение для ввода данных, в котором пользователь вводит около 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top