UILabel / текстовая анимация на iPhone - PullRequest
1 голос
/ 29 декабря 2010

Потратил довольно много времени, пытаясь понять, как я могу оживить движение UILabel от одного края экрана к противоположному.По сути, я хочу, чтобы текст, который я получил от пользователя, появлялся на экране справа налево и исчезал, и он продолжает повторяться и появляться снова (часть того, что вы видите на Таймс-сквер: -)

Ответы [ 4 ]

2 голосов
/ 04 июля 2012

В общем смысле метку можно анимировать, сначала указав ее рамку, установив ее атрибуты (текст, цвет фона), добавив ее в свой просмотреть подпредставление, а затем, используя [UIView animateWithDuration:delay:options:animations:completion], указать последний кадр. это метод требует немного больше кода "только для метки", но в итоге это того стоит.

Следующий код поместит метку в верхнем левом углу (0,0) и анимирует ее в правом нижнем углу (точные координаты будут зависеть от вашего устройства iOS). Общие шаги следующие:

  • Рассчитайте размер рамки, необходимой для вашей метки, это зависит от шрифта и размер для вашей этикетки
  • Получите фрейм приложения, см. Смещение в UIWindow addSubview о том, почему использовать applicationFrame вместо bounds.
  • Рассчитать координаты вашего пункта назначения; в этом примере мы хотим, чтобы нижний правый угол метки коснитесь правой нижней части экрана, чтобы мы вычислили верхнюю левую координаты для учета рамка этикетки
  • Создать ярлык с помощью initWithFrame
  • Добавьте к метке цвет фона, установите текст, шрифт и т. Д. Примечание. используйте тот же размер шрифта и размер, который вы указали при расчете фрейма!
  • Добавить подпредставление (UILabel) к текущему виду
  • анимировать! Это делается в блоке, передаваемом в качестве параметра animations:, мы указываем окончательное местоположение кадра (обратите внимание, что мы не меняем размер кадра во время анимации), которое мы ранее рассчитывали, чтобы быть в правом нижнем углу.
  • Наконец, после завершения анимации удалите метку с помощью removeFromSuperview

Это очень общий пример, и здесь можно многое сделать, включая анимацию нескольких ярлыков одновременно для эффекта выделения и т. д. добавляя дополнительные анимации, имейте в виду, что контроллер представления может быть отклонен и что анимации все еще работают. Как правило, рекомендуется останавливать анимацию с помощью [self.view.layer removeAllAnimations], а также удалять подпредставления, которые все еще могут висеть (обычно я сохраняю NSMutableArray всех созданных мной меток, чтобы их можно было очистить в viewWillDisappear) .

#define FONT_SIZE 14
#define DURATION  10
#define DELAY     10
-(void)viewWillAppear:(BOOL)animated {


  NSString* string = @"My Label";

  CGSize framesize = [string sizeWithFont:[UIFont fontWithName:@"Copperplate" size:FONT_SIZE]];

  // Origin
  float x0 = 0;
  float y0 = 0;

  CGRect  appFrame       = [[UIScreen mainScreen] applicationFrame];
  CGFloat appFrameWidth  = appFrame.size.width;
  CGFloat appFrameHeight = appFrame.size.height;

  // Destination
  float x1 = appFrameWidth - framesize.width;
  float y1 = appFrameHeight - framesize.height;

  UILabel* label = [[UILabel alloc]initWithFrame:CGRectMake(x0, y0, framesize.width, framesize.height)];
  label.backgroundColor = [UIColor clearColor];
  label.text = string;
  label.shadowColor = [UIColor grayColor];
  label.shadowOffset = CGSizeMake(1,2);
  label.font = [UIFont fontWithName:@"Copperplate" size:FONT_SIZE];

  [self.view addSubview:label];

  [UIView animateWithDuration:DURATION
                        delay:DELAY
                      options:UIViewAnimationOptionAllowUserInteraction
                   animations:^{
                       label.frame = CGRectMake(x1, y1, framesize.width, framesize.height);
                   }
                   completion:^(BOOL finished){
                     [label removeFromSuperview];
                   }];
}
1 голос
/ 29 декабря 2010

Если вы хотите, чтобы ваша метка оставалась в фиксированном месте, вы можете переместить текст внутри метки, например, используя NSTimer, который запускает и вызывает методы для обновления вашей UiLabel через регулярные (вторые или около того) интервалы:1002 *

1 голос
/ 18 мая 2011
- (void)viewDidLoad
{
    [self animateLoop];
    [super viewDidLoad];
}

- (void)animateLoop 
{

    mylab.text=@"SAAAAdiiiii";
    mylab.frame = CGRectMake(-mylab.bounds.size.width, 100, mylab.bounds.size.width,     mylab.bounds.size.height);

    [UIView beginAnimations:@"timesquare" context:nil];
    [UIView setAnimationDuration:5];
    [UIView setAnimationRepeatAutoreverses:(YES)];
    [UIView setAnimationRepeatCount:10];

    mylab.frame = CGRectMake(480, 100, mylab.bounds.size.width, mylab.bounds.size.height);

    [UIView commitAnimations]; 
 }
0 голосов
/ 29 декабря 2010

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

Попробуйте что-то вроде:

-(void)animateLoop {
    myLabel.frame = CGRectMake(-myLabel.bounds.size.width, 100, myLabel.bounds.size.width, myLabel.bounds.size.height);
    [UIView beginAnimations:@"timesquare" context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDidStopSelector:@selector(animateLoop)];
    myLabel.frame = CGRectMake(480, 100, myLabel.bounds.size.width, myLabel.bounds.size.height);
    [UIView commitAnimations];    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...