#iphone #ios
#iPhone #iOS
Вопрос:
- (void)showLabelAnimation
{
[UIView beginAnimations:@"animationID" context:nil];
[UIView setAnimationDuration:1];
//original rectangle is (0,0,100,50)
//and I want to change label to (100,100,200,100)
label.bounds = CGRectMake(100, 100, 200, 100);
label.frame = CGRectMake(100, 100, 200, 100);
[UIView commitAnimations];
}
Это работает хорошо, но мне просто интересно, почему я должен устанавливать как границы, так и рамки метки. Они кажутся одним и тем же.
Может ли кто-нибудь объяснить это для меня?
Заранее благодарю.
[Правка от 3 ноября] Спасибо за вашу помощь, но когда я удаляю строку setbounds, она работает плохо, метка сразу становится большой, но перемещается в новую позицию с помощью анимации. Анимация изменения размера не отображается.
Это настоящая вещь, которая меня удивляет.
Комментарии:
1. отредактировал мой ответ, чтобы включить дополнительную информацию о вашем редактировании
Ответ №1:
Вам нужно будет только установить рамку. Границы должны обновляться сами по себе.
Редактировать для получения дополнительной справки: метки не масштабируются; изменение его рамки изменяет место размещения текста, но размер текста не масштабируется таким образом.
Однако вы можете присвоить свойству UILabel adjustsFontSizeToFitWidth
значение «да», а затем перед запуском анимации установить максимальный размер шрифта перед ее запуском. По мере масштабирования размер шрифта должен изменяться, чтобы соответствовать размеру и достичь желаемого эффекта.
Комментарии:
1. Спасибо, я попробую, хотя я все еще в замешательстве.
2. Для простого объяснения того, как это работает: в XIB-файле создайте надпись с очень большим размером шрифта (например, 80) и установите флажок «Сжать текст по размеру». Затем с помощью мыши измените размер окна. Вы увидите, как текст меняет размер вместе с полем. Анимация пользовательского интерфейса, которую вы используете здесь, фактически эквивалентна изменению размера окна с помощью мыши.
Ответ №2:
Рамка представляет собой прямоугольник относительно родительского представления. Границы — это прямоугольник относительно самого себя.
Анимация должна работать без строки
label.bounds = CGRectMake(100, 100, 200, 100);
Ответ №3:
Этот код работает для меня
[UIView animateWithDuration:1
animations:^(void) {
self.leLabel.frame = CGRectMake(labFrame.origin.x,
labFrame.origin.y 100.0f, labFrame.size.width 50.0f, labFrame.size.height);
}];
Для того, что вы хотите сделать, вам нужно только установить рамку.
Если я изменю фрейм на привязку в предыдущем коде, я получу очень странное поведение.
Итак, я предполагаю, что причина, по которой вам нужно установить оба, заключается в том, что вы сначала протестировали с привязкой и добавили фрейм после, чтобы исправить ошибку, вызванную настройкой привязки.
Комментарии:
1. Этот код будет работать только на iOS 4.x и выше, где поддерживаются блоки; хотя немногие пользователи все еще используют 3.x, я все же думаю, что это стоит упомянуть (особенно если это единственное место в вашем приложении, где 3.x не будет поддерживаться)
2. Хороший момент. На днях я понял, что iPod моей жены второго поколения. работал под управлением iOS 4.2. Поэтому в тот раз я решил прекратить поддержку менее 4.0, поэтому я всегда забываю проверить этот аспект.