2009-10-22 3 views
1

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

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

ответ

2

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

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

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

Спасибо, я попробую это. –

+0

Это увеличит объем управления, который вам нужно будет сделать, но может дать вам дополнительную скорость, в которой вы нуждаетесь. – jessecurry

+0

У меня не было времени попробовать этот код, но очевидно, что мне придется делать все переходы самостоятельно (как вы полагаете) вместо того, чтобы полагаться на нормальное поведение. –

0

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

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

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

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

Вы также можете подумать о принятии Matt Gallagher's strategy for cell handling - он останавливает ваш cellForRowAtIndexPath, превращаясь в один длинный, противный набор ifs.

+0

Я не думаю, что есть проблема с производительностью в своем коде - если я избавлюсь от анимации пользовательского интерфейса намного больше мгновенно, но намного меньше, чем у iPhone. Проблема в том, что анимация требует времени. Вместо анимации, которая занимает 0,5 секунды, я бы хотел, чтобы она работала через 0,25 секунды. Вот поддельный пример, чтобы сделать его более ясным. Перейдите в приложение календаря и нажмите стрелку вправо, чтобы перейти к следующему месяцу. В следующем месяце будет визуально отображаться. Мой вопрос: как я получу следующий месяц, чтобы ускорить просмотр. –

+1

Я получаю это сейчас - хорошо я видел это: http://everburning.com/news/flicking-the-iphone/ , но для этого нужно провести небольшую ручную работу.Я не думаю, что вы можете изменить скорость системных переходов, например, вызванных pushViewController: withAnimation, что приведет к утверждению приложения. Я знаю один способ доступа к частным методам, которые, похоже, перестали работать с выпуском 3.0. –

Смежные вопросы