2013-06-10 10 views
10

düzgün çalışmıyor. > A UILabel ve basit bir UIView - biz 2 subviews olan bir üst görünüme sahip Yukarıdaki örnekteAutoLayout ve UILabel boyutlandırmak animasyon ben çok basit bir görev üzerinde garip bir sorun var cihaz dönme

|--------------------------------------| 
|    Parent View    | 
|          | 
||------------------------------------|| 
||    UILabel    || 
||------------------------------------|| 
|          | 
|          | 
||------------------------------------|| 
||    UIView    || 
||------------------------------------|| 
|          | 
|          | 
|--------------------------------------| 

:

Ben sorunu yeniden oluşturmaya çok küçük bir kurulum ihtiyacı var. autolayout kullanarak Im düzeni yukarıda gösterilen uygulamak:

Constraints for UILabel: 
Leading Space to superview = 0 
Trailing Space to superview = 0 
Fixed Height constraint (e.g. 80pt) 
Top Space constraint (e.g. 50pt) 

The UIView subview has the same constraint types (the values for height and top space differs). 

Yani ben bu kurulum ile beklediğiniz, biz uzay başındaki ve sonundaki sıfır olması gerektiğini tanımlanan her iki subviews üst biriminin tam genişliği kabul edecek olmasıdır. Dolayısıyla, ana görünümün genişliğini değiştirirseniz, alt görüntülerin genişliği de aynı hizaya gelmek için değişmelidir.

ana görünüm 200x400 boyutu punto boyutlarında diyelim. Örneğimi portreimde oluşturup çalıştırdığımda her şey yolunda görünüyor. Manzaraya döndüğümde, her şey hala iyi görünüyor. Üst görünümlerin genişliği ve hatta alt görünümlerin genişliği daha da genişledi. geri portre uilabels genişlik döndüğünde fakat şimdi hemen herhangi bir animasyon olmadan hedef genişliği alır:

|--------------------------------------| 
|    Parent View    | 
|          | 
| (immediately has target size)  | 
|   |--------------|   | 
|   | UILabel |   | 
|   |--------------|   | 
|          | 
| (this subview is still    | 
|    animating its width)  | 
| |------------------------------| | 
|-->|   UIView    |<--| 
| |------------------------------| | 
|          | 
|          | 
|--------------------------------------| 

görüntüleme genişliği üst ve UIView subviews genişliği uygun şekilde canlandırılmıştır. Burada garip bir davranışa sahip tek uilabel ve bu soruna neyin neden olduğunu anlayamıyorum.

+0

Programsal olarak hiyerarşi ve kısıtlamalar oluşturuyor musunuz? Bu durumda, translatesAutoresizingMaskIntoConstraints değerini NO olarak ayarladınız mı? –

+0

bunu anladın mı? Aynı problemi yaşıyorum – user18853

cevap

0

Sorun, UILabel'ın yeniden boyutlandırmasını değil, metnin animasyon vermemesidir. Etikete farklı bir arka plan rengi verecekseniz, bunun gerçekten animasyonlu olduğunu görürsünüz ve bu sadece pozisyona atlayan bir yazıdır.

Bunu düzeltmenin bir yolu, herhangi bir animasyon içermeyen etiketin genişliğini değiştirmek ve X öğesini X noktalarıyla değiştirmek, burada X başlangıç ​​ve bitiş genişliği arasındaki farkın yarısıdır ve sonra yalnızca konumunu canlandırır.

Kodunuz için bu yöntemle ilgili tek sorun, otomatik düzende yapabileceğinize inanmıyorum.

0

Hatırladığım gibi, kısıtlamalar için bazı özellikler sunmalısınız, ancak bu kadar kolay UI öğeleri için UIViewAutoresizing maskeleri kullanmanızı öneririz. Bunlar çok daha basit ve daha kısa tanımlara sahiptir. Senin durumunda sadece UIViewAutoresizingFlexibleWidth kullanın.

0

autolayout'u story board'a ayarlamak daha iyi. Kısıtlamalar belirlerken, tüm alt görünümlerin görünüm denetleyicinizde seçildiğinden emin olun. Bunun için aşağıdakileri yapmanız gerekir: ana görünümü denetleyicisi görünümünde

  1. tıklayın
  2. Basın Ctrl+A
  3. tıklayın Çöz Otomatik düzen Sorunlar
  4. Seç Kişisel View Controller eksik kısıtlamaları ekle

Sonra kısıt tüm subviews olarak ayarlanır ve rotasyonlar sırasında mükemmel çalışacaktır.

1

Benim öneriler: Eğer sınıflandırma ettiyseniz

ebeveyn görünümü - (void)layoutSubviews kullanın: Üst görünümü sınıflandırma olmasaydı

- (void)layoutSubviews { 
    label.frame = CGRectMake(leftInset, labelY, parentView.frame.size.width - leftInset*2, labelHeight); 
    childView.frame = CGRectMake(leftInset, childViewY, parentView.frame.size.width - leftInset*2, childHeight); 
} 

kullanabileceğiniz autoresizingMask:

label.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
childView.autoresizingMask = UIViewAutoresizingFlexibleWidth;