iphone - медленно для UILabel, чтобы установить текст? - PullRequest
0 голосов
/ 24 мая 2011

Мой код прост.У меня есть UIScrollView и под ним есть пять UILabel.То, что я установил в делегате UIScrollView scrollViewDidScroll, заключается в том, что каждые 150 пикселей, которые перемещал scrollView, я обновляю пять UILabel с NSStrings в NSArray.

Вот коды:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    int offsetY = scrollView.contentOffset.Y;

    BOOL canUpdate = (offsetY % 150 == 0)?YES:NO;

    if (canUpdate) {

        int index = offsetY / 150;

        for (int i = 0;i < 5; i++) {

            UILabel *label = [labelArray objectAtIndex:i];
            label.text = [stringArray objectAtIndex:index];

        }

    } 
}

Это довольно медленно.Я имею в виду, что если я прокручиваю довольно быстро (скажем, может потребоваться несколько раз обновить ярлыки, прежде чем он остановится), я могу видеть лаги прокрутки, точно так же, как что-то блокирует его перемещение.медленно ??

спасибо

Ответы [ 3 ]

0 голосов
/ 24 мая 2011

Нет, абсолютно. Если бы это было медленно, вы бы не смогли эффективно использовать список контактов на iPhone.

Если ваш код работает медленно, вы должны искать другие фрагменты кода, которые замедляют процесс прокрутки. Переход на метод scrollViewDidScroll:, предложенный @pratikshabhisikar, также может помочь. Попробуйте напечатать журнал на вашем scrollViewDidEndDecelerating:, чтобы узнать, сколько раз он вызывался.

0 голосов
/ 24 мая 2011

pratikshabhisikar имеет право.

Вы обновляете только одну из своих меток, когда ваш contentOffset равен точно , кратному 150 (как целое).

(offsetY % 150) 

возвращает true, только если offsetY делится на 150 и не оставляет остатка.Поэтому, если вы выполняете слишком быструю прокрутку, это смещение может пропустить «сладкое пятно» (кратное 150), и вы не получите обновление.

try:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    int index = floor(scrollView.contentOffset.y / 150.0f);
    for (int i = 0;i < 5; i++) {

        UILabel *label = [labelArray objectAtIndex:i];
        label.text = [stringArray objectAtIndex:index];

    }
}

The 'Функция floor 'гарантирует, что вы получите округленную версию в виде целого числа после деления, поэтому в любом месте от 0 до 150 будет возвращаться 0 и т. д.

Вы также можете кэшировать последний загруженный индекс (так как вы будетеперезагрузка текста для любого количества прокрутки в настоящее время (т. е. введите цикл for только если index != mCurrentIndex.

0 голосов
/ 24 мая 2011

Нет, это не медленно.Вы должны попытаться установить свою метку в методе делегата scrollViewDidScroll.

ОБНОВЛЕНИЕ: То есть вы все еще не работаете!?Насколько я могу догадаться, вы пытаетесь проверить, прокручивается ли ваш вид прокрутки 150px, а затем обновить какую-то метку.

В своем коде вы в основном проверяете точное значение 150 px, так как вы использовали операцию по модулю (%).Вы не всегда будете прокручивать, а смещение вида прокрутки будет точно на 150, 300, 450 и т. Д.

...