iPhone SDK: после ввода определенного количества символов анимация просто не загружается - PullRequest
1 голос
/ 02 февраля 2009

Хорошо, это код:

[lblMessage setText: txtEnter.text];
[lblMessage sizeToFit];

scrollingTextView.contentSize = lblMessage.frame.size;
float width = (lblMessage.frame.size.width) + (480);

[UIView beginAnimations:@"pan" context:nil];
[UIView setAnimationDuration:durationValue];
[UIView setAnimationRepeatCount:5];
scrollingTextView.contentOffset = CGPointMake(width,0);
[UIView commitAnimations];

//The scrolling text view is rotated.
scrollingTextView.transform = CGAffineTransformMakeRotation (3.14/2);

[self.navigationController setNavigationBarHidden:YES];
btnChange.transform = CGAffineTransformMakeRotation (3.14/2);

У меня есть пользователь, который вводит какой-то текст, нажимает кнопку, а затем метка заменяется текстом, развернутым на 90 градусов в виде прокрутки на странице.

После определенного количества символов, например, скажем 20 .. анимация просто не загружается. Я могу вернуться вниз, пока не запустится анимация.

Любые идеи о том, где я иду не так, или лучший способ хранения текста и т. Д. И т. Д.?

Ответы [ 2 ]

1 голос
/ 03 февраля 2009

Основные анимации анимации выполняются в отдельном потоке. Когда вы включаете изменение в contentOffset в блок beginAnimations / commitAnimations, это изменение будет постепенно анимироваться. Поворот прокрутки текста, который происходит дальше, вне блока анимации, будет выполнен мгновенно. Поскольку оба взаимодействуют с одним и тем же элементом управления в разных потоках, неудивительно, что вы получаете странное поведение.

Если вы хотите анимировать вращение текста так же, как и contentOffset, переместите эту строку кода в блок анимации.

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

[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(contentOffsetAnimationHasFinished:finished:context:)];

, который требует от вас реализации метода делегата, подобного следующему:

- (void)contentOffsetAnimationHasFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context;
{
// Do what you need to, now that the first animation has completed
}

РЕДАКТ. (06.02.2009): Я только что создал упрощенную версию вашего приложения, используя только боковую прокрутку текста, и не вижу проблем с анимацией на устройстве с любым количеством символов. Я удалил все посторонние вызовы для разметки кнопок и т. Д. И только анимировал текст. Вместо того, чтобы применять преобразование вращения к представлению прокрутки каждый раз, когда вы нажимаете кнопку, у меня оно начинает вращаться и остается таким же.

Я подумал, что это может быть проблема с размером слоя, так как iPhone имеет ограничение размера текстуры 1024 x 1024 (после чего вам нужно использовать CATiledLayer для поддержки вашего UIView), но я смог выложить текст шире, чем 1024 пикселей и до сих пор есть эта работа.

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

0 голосов
/ 03 февраля 2009

Правильно, этот код отлично работает в симуляторе и работает нормально, пока я не введу более чем, скажем, 20 символов в txtEnter.text:

- (IBAction)updateMessage:(id)sender
{


    //Animation coding

    //Put the message in a resize the label
    [lblMessage setText: txtEnter.text];
    [lblMessage sizeToFit];

    //Resize the scrolliew and change the width.
    scrollingTextView.contentSize = lblMessage.frame.size;
    float width = (lblMessage.frame.size.width) + (480);
    scrollingTextView.transform = CGAffineTransformMakeRotation (3.14/2);

    //Begin the animations
    [UIView beginAnimations:@"pan" context:nil];
    [UIView setAnimationDuration:durationValue];
    [UIView setAnimationRepeatCount:5];

    //Start the scrolling text view to go across the screen
    scrollingTextView.contentOffset = CGPointMake(width,0);
    [UIView commitAnimations];


    //General hiding and showing points.
    [txtEnter resignFirstResponder];
    [btnChange setHidden:NO];
    [txtEnter setHidden:YES];
    [btnUpdate setHidden:YES];
    [lblSpeed setHidden:YES];
    [lblBackground setHidden:YES];
    [backgroundColourControl setHidden:YES];
    [speedSlider setHidden:YES];
    [scrollingTextView setHidden:NO];
    [backgroundImg setHidden:NO];
    [toolbar setHidden:YES];

    [self.navigationController setNavigationBarHidden:YES animated:YES];

    //Depending on the choice from the segment control, different colours are loaded
    switch([backgroundColourControl selectedSegmentIndex] + 1) 
    { 
        case 1: 
            [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
            break; 
        case 2: 
            [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:YES];
            break; 
        default: break; 
    }   

    btnChange.transform = CGAffineTransformMakeRotation (3.14/2);

}

Я попробовал твой метод, Брэд, но похоже, что раздел (void) не работает должным образом.

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

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