SORU
19 Mart 2011, CUMARTESİ


UİView çerçevesi, sınırları ve merkezi

Doğru şekilde bu özellikleri kullanmak için nasıl bilmek istiyorum.

Anladığım kadarıyla frame yaratıyorum görünümünün konteyner kullanılabilir. Görünüm pozisyon konteyner görünüme göre ayarlar. Ayrıca bu görünüm boyutunu ayarlar.

Ayrıca center yaratıyorum görünümünün konteyner kullanılabilir. Bu özellik görünüm kabına göre konumunu değiştirir.

Son olarak, bounds görünümü kendine göredir. Görünüm için drawable alanı değiştirir.

frame bounds arasındaki ilişki hakkında daha fazla bilgi verebilir misiniz? Ne clipsToBounds masksToBounds özellikleri hakkında?

CEVAP
1 Temmuz 2012, Pazar


Sorduğum soru pek çok kez görülmüştür bu yana ayrıntılı bir cevap verecektir. Eğer daha doğru içerik eklemek istiyorsanız, bunu değiştirmek için çekinmeyin.

İlk soru hakkında bir özetleyelim: çerçeve, sınırları ve merkezi ve onların ilişkileri.

Çerçeveframe manzara (CGRect) superviewkendi dikdörtgenin konumunu'nin koordinat sistemi. Varsayılan olarak sol üst kısmında başlar.

İyi bir çalışma olmuşbounds manzara (CGRect) kendi koordinat sisteminde bir dikdörtgen görünümü ifade eder.

Merkezicenter CGPoint superview'In koordinat sistemi ve Görünümü tam merkezi noktanın konumunu belirler. cinsinden ifade edilir

AlınanUIView positionbu ilişkiler (resmi olmayan denklemler olduğundan kod çalışmıyor) önceki özellikler arasında

  • frame.origin = center - (bounds.size / 2.0)

  • center = frame.origin (bounds.size / 2.0)

  • frame.size = bounds.size

NOT:Bu ilişkiler eğer görüş döndürülmüş zaman geçerli değildir. Daha fazla bilgi için, aşağıdaki görüntü alınan bir bakmanı öneririmThe Kitchen DrawerdayalıStanford CS193ptabi ki. Kredi gider@Ravent.

Frame, bounds and center

frame kullanarak yeniden konumlandırmak ve/ya da verir superview kendi içinde bir görünümü yeniden boyutlandırmak. Genellikle kullanılabilir belirli bir küme oluşturduğunuzda, örneğin superview,,. Örneğin:

// view1 will be positioned at x = 30, y = 20 starting the top left corner of [self view]
// [self view] could be the view managed by a UIViewController
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(30.0f, 20.0f, 400.0f, 400.0f)];    
view1.backgroundColor = [UIColor redColor];

[[self view] addSubview:view1];

view bir çizim içinde koordinatları ihtiyacınız olduğunda genelde bounds bakın. Tipik bir örnek, ilk girinti olarak view içinde bir alt görünümünü çizmek için olabilir. Bu küme çizim superview bounds bilmek gerekir. Örneğin:

UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(50.0f, 50.0f, 400.0f, 400.0f)];    
view1.backgroundColor = [UIColor redColor];

UIView* view2 = [[UIView alloc] initWithFrame:CGRectInset(view1.bounds, 20.0f, 20.0f)];    
view2.backgroundColor = [UIColor yellowColor];

[view1 addSubview:view2];

Farklı davranışları değiştirmek için bir bakış bounds olur. Eğer değiştirirseniz, örneğin,bounds size, frame değişiklikler (ve tersi). Değişim bakış center etrafında olur. Aşağıdaki kodu kullanın ve ne olacağını görün

NSLog(@"Old Frame %@", NSStringFromCGRect(view2.frame));
NSLog(@"Old Center %@", NSStringFromCGPoint(view2.center));    

CGRect frame = view2.bounds;
frame.size.height  = 20.0f;
frame.size.width  = 20.0f;
view2.bounds = frame;

NSLog(@"New Frame %@", NSStringFromCGRect(view2.frame));
NSLog(@"New Center %@", NSStringFromCGPoint(view2.center));

Eğerbounds origin değiştirirseniz, ayrıca, iç koordinat sistemi origin değiştirin. Varsayılan olarak origin (0.0, 0.0) (sol üst köşede). Örneğin, değiştirme origin view1 görebilirsiniz (yorum önceki kod istiyorsan) o şimdi üst sol köşe için view2 dokunuşlar view1. Motivasyon oldukça basittir. Sana söylemek view1 onun sol üst köşede şimdi de pozisyonu (20.0, 20.0) beri view2's frame origin başlar (20.0, 20.0), onlar denk.

CGRect frame = view1.bounds;
frame.origin.x  = 20.0f;
frame.origin.y  = 20.0f;
view1.bounds = frame; 

origin view's superview kendi içinde pozisyon ama açıklar bounds merkezi konumu temsil eder.

Son olarak, bounds ve origin kavramlarla ilgili değildir. Hem görünümü (önceki denklemleri Bakınız) frame türetmek için izin verir.

View1. örnek çalışma

Olur aşağıdaki kod kullanarak ne zaman burada.

UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(30.0f, 20.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];

[[self view] addSubview:view1];

NSLog(@"view1's frame is: %@", NSStringFromCGRect([view1 frame]));
NSLog(@"view1's bounds is: %@", NSStringFromCGRect([view1 bounds]));
NSLog(@"view1's center is: %@", NSStringFromCGPoint([view1 center]));

Göreli görüntü.

enter image description here

Bunun yerine eğer değiştirirsem olur [self view] aşağıdaki gibi bir çalışma olmuş.

// previous code here...
CGRect rect = [[self view] bounds];
rect.origin.x  = 30.0f;
rect.origin.y  = 20.0f;
[[self view] setBounds:rect];

Göreli görüntü.

enter image description here

Burada size söylemek [self view] onun sol üst köşede şimdi yeri (30.0, 20.0) ama günden beri view1'nin çerçeve kökeni başlar (30.0, 20.0), onlar denk.

Ek kaynaklar(Eğer isterseniz diğer kaynaklar ile güncellemek için)

clipsToBounds (kaynak Apple doc) hakkında

EVET bu değeri subviews sınırları kırpılmış neden olur alıcı. HAYIR, ötesine kimin subviews için ayarlayın alıcı görünür sınırları kırpılır. Varsayılan değer HAYIR.

frame manzara (0, 0, 100, 100) ve onun alt görünümüdür başka bir deyişle, (90, 90, 30, 30) bu küme sadece bir kısmını göreceksiniz. İkinci ana görünüm sınırları aşmaz.

masksToBounds clipsToBounds eşdeğerdir. Bir yerine UIView bu özellik CALayer bir uygulanır. , clipsToBounds kaputun altında aramalar masksToBounds. Fazla referans için How is the relation between UIView's clipsToBounds and CALayer's masksToBounds? için bir göz atın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AFISHAL

    AFISHAL

    7 Mart 2009
  • Curso Online Gratuito

    Curso Online

    4 Aralık 2011
  • PhoneBuff

    PhoneBuff

    10 HAZİRAN 2011