2013-11-20 22 views
5

UILabel'ın alt görünümünde bir UIView olan bir UIView var.Autolayout animate kısıtlaması alt görüntülemeyi etkilemiyor

Şimdi görünümü, ancak UILabel (Subview, normal yeniden boyutlandırma

)) ... (kısıt sabit özelliğini değiştirerek) ve animasyon UIView içinde layoutIfNeeded çağrı bir animasyon ile UIView genişliğini değiştirmek font boyutunu 'son' boyutuna değiştirir, ancak uiview gibi doğru şekilde animasyon vermedi.

WWDC 2012 oturumuna göre, alt görünümler yalnızca süper görüntü sabitinin değişip değişmediği konusunda canlandırılmalıdır.

UILabel, yazı tipinin yeniden boyutlandırılması gereken en az 0,1 puntolu bir font ölçeğine sahiptir.

cevap

4

kısıtlama. Etiket, adjustsFontSizeToFitWidth ve minimumScaleFactor ayarlanmıştı.

'contentMode etiketlerini UIViewContentModeScaleAspectFit olarak ayarlayarak sabitledim. Varsayılan olarak etiketler için UIViewContentModeLeft.

2

Metnin boyutunu bu şekilde canlandırabileceğinizi sanmıyorum. Bunu yapmayı düşünebilmemin tek yolu, etiketin anlık görüntüsünü oluşturmak, bu görünümü etikete eklemek, animasyonu yapmak ve ardından anlık görüntüyü kaldırmaktır. Bu kod, küçük metni hafifçe aşağı doğru hareket ettirir, ancak etiketi gösterdiğinizde ve görüntü görünümünü kaldırdığınızda sadece çok küçük bir hareketle oldukça iyi görünür. Etiketi içeren küçük görünüm, 185x36 inç boyutundaydı ve etiket, küçük Görünümün her bir tarafına 20 ve üstünden 7 ve tabana doğru olan 8 sınırlamalarına sahipti. Aynı kısıtlamaları kodda resim görünümüne ekliyorum.

@interface ViewController() 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *widthCon; // width constraint on smallView 
@property (weak,nonatomic) IBOutlet UIView *smallView; // view that the label is embedded in 
@property (weak,nonatomic) IBOutlet UILabel *label; 
@end 

@implementation ViewController 

- (IBAction)shrinkView:(id)sender { 

    UIView *snapshot = [self.label snapshotViewAfterScreenUpdates:YES]; 
    [snapshot setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.smallView addSubview:snapshot]; 
    [self.smallView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-20-[snapshot]-20-|" options:0 metrics:nil views:@{@"snapshot":snapshot}]]; 
    NSLayoutConstraint *topCon = [NSLayoutConstraint constraintWithItem:snapshot attribute:NSLayoutAttributeTop relatedBy:0 toItem:self.smallView attribute:NSLayoutAttributeTop multiplier:1 constant:8]; 
    NSLayoutConstraint *bottomCon = [NSLayoutConstraint constraintWithItem:self.smallView attribute:NSLayoutAttributeBottom relatedBy:0 toItem:snapshot attribute:NSLayoutAttributeBottom multiplier:1 constant:7]; 
    [self.smallView addConstraints:@[topCon,bottomCon]]; 
    [self.smallView layoutSubviews]; 
    self.label.alpha = 0; 
    self.widthCon.constant = 100; 
    topCon.constant = 18; 
    bottomCon.constant = 10; 
    [UIView animateWithDuration:.5 animations:^{ 
      [self.view layoutIfNeeded]; 
     } completion:^(BOOL finished) { 
      self.label.alpha = 1; 
      [snapshot removeFromSuperview]; 
     }]; 
} 

Düzenleme sonra:

etiket aynı zamanda uç boyutuna hemen çıkmak yerine aşağı animasyon oluşturduğu şekilde görünümü animasyon uygulamak için bir yol yoktur. Kısıtlayıcıyı bir zamanlayıcı ile doğrudan canlandırmalısınız (WWDC 2012 videosuna "Otomatik Düzenleme için En İyi Uygulamalar" bölümüne yaklaşık 31 dakikada bakın). Bu, etiketin boyutunu canlandırmaya çalışır, ancak yazı tipi boyutu değişikliği sarsıntılıdır ve bu iyi görünmez. Etiket olduğunu görünümüne bir genişlik sınırlaması var (ve etiket iki taraf için kısıtlamaları vardır), o zaman bunu yapabilirsiniz: Ben onun width değiştirerek UILabel yeniden boyutlandırma animasyon mücadele ediyordu

-(IBAction)animateSizeChange:(id)sender { 
    [NSTimer scheduledTimerWithTimeInterval:.001 target:self selector:@selector(doStuff:) userInfo:Nil repeats:YES]; 
} 

-(void)doStuff:(NSTimer *) aTimer { 
    self.widthCon.constant -= .2; 
    if (self.widthCon.constant <90) [aTimer invalidate]; 
} 
+0

zamanlayıcı ile sonradan düzenleme kodu ne yazık ki aynı zamanda çok tempolu görünüyor ..:/ –

+1

anlık görüntü fikri çok hacky ve bu şekilde yaklaşılmamalıdır, düşünmüyor musunuz? –

+0

@ Christian'fuzi'Orgler, hayır, hiç de haince olduğunu sanmıyorum. Apple, bu "hileyi" kendi animasyonlarından bazılarında kullanır. Ayrıca alternatif nedir? İlk yorumunuza gelince, evet bu çok ürkütücü, söylediğim buydu - metni küçültmeye çalışmıyorsanız, bir görünümün alt görünümünü canlandırabilmenin bir yolunu göstermek için bunu ekledim. – rdelmar