В общем смысле метку можно анимировать, сначала указав ее рамку, установив ее атрибуты (текст, цвет фона), добавив ее в свой
просмотреть подпредставление, а затем, используя [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];
}];
}