2013-06-28 11 views
15

Bir UILabel'ın bir animasyon bloğunda sınırlarını değiştirdiğimde, yalnızca boyutu artırdığımda, UILabel'in boyutunu değiştirdiğimde, ancak boyutunu değiştirmediğimde çalıştığını fark ettim. UILabel'ı düz bir UIView ile değiştirme, amaçlandığı şekilde çalışır.Neden bir UILabel sınırında animasyonlar sadece boyutu artırırken çalışıyor?

Not: UILabel'ın contentMode özelliğinin UIViewContentModeScaleToFill öğesinin değiştirilmesi bu sorunu giderir, ancak contentMode özelliğini değiştirmeden boyutu artırırken neden çalıştığını hala anlamıyorum.

#import "FooView.h" 

@interface FooView() 
@property (strong, nonatomic) UILabel *label; 
@property (assign, nonatomic) BOOL  resized; 
@end 

@implementation FooView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.backgroundColor = [UIColor lightGrayColor]; 

     self.label = [[UILabel alloc] initWithFrame:(CGRect){0, 0, frame.size}]; 
     self.label.backgroundColor = [UIColor greenColor]; 
     [self addSubview:self.label]; 
     _resized = false; 

     UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changeSize)]; 
     tapRecognizer.numberOfTapsRequired = 1; 
     [self addGestureRecognizer:tapRecognizer]; 
    } 
    return self; 
} 

- (void)changeSize { 
    [UIView animateWithDuration:0.8 
          delay:0.0 
         options:UIViewAnimationOptionCurveEaseIn 
        animations:^{ 
         CGRect bounds = self.label.bounds; 
         if (self.resized) { 
          bounds.size.height *= 2; 
          bounds.size.width *= 2; 
         } else { 
          bounds.size.width /= 2; 
          bounds.size.height /= 2; 
         } 
         self.label.bounds = bounds; 
        } 
        completion:^(BOOL finished) { 
         self.resized = !self.resized; 
        }]; 
} 

@end 
+0

Buraya bir cevabınız var: http://stackoverflow.com/questions/3298764/animating-uilabel-size-decrease – Amit

+0

@ amit3117 no this doesn 'nedenini açıklıyor, ve ben zaten çerçeveyi değil sınırlarını değiştiriyorum – peko

+0

Sadece kodunuzu ayarlıyorum ve gördüğüm aynı efekti görüp görmediğinizi merak ediyorum, sınırlar animasyonla büyüyor, ancak tekrar tıkladığınızda, ortalanmış metnimin sadece geri döndüğünü fark etsem de küçük boyuta "çıt" Büyürken yaptığı gibi ... sadece arka plan rengi, küçük bir etiket için yeniden boyutlandırma efektine sahipti. – rezand

cevap

16

UILabel setleri da ondan onun katman en contentsGravityUIViewContentModeLeft (veya @"left") varsayılan olur oluşturulmakta olan yön metne. Böylelikle, katmanın canlandırılması söylendiğinde, ilk önce içeriğindeki yerçekimine bir bakış atıyor ve bunun üzerindeki sonraki animasyonları temel alıyor. @"left"'un @"resize" olması gerektiği için ölçekleme animasyonunun soldan başlaması gerektiğini varsayar, ancak aynı zamanda verdiğiniz kısıtlamalara da uymak zorundadır (sınırlar değişir), böylece etiketiniz son halini almaya başlar. Boyutu daha sonra ekranın ortasında olması gereken yere yerleşir.

Yalnızca contentMode'dan ayrılmak isterseniz, CATransform3D'leri kullanın ve etiket katmanını sınırlar yerine bu şekilde ölçeklendirin.

+0

mantıklı geliyor, – peko

+0

test etmeme izin verin CALayer'ın contentGravity özelliği hakkında beni bilgilendirdiğiniz için teşekkürler :) – Bersaelor