SORU
17 EKİM 2012, ÇARŞAMBA


Nasıl Otomatik Düzen kullanıldığında bir CALayer bağlantı noktası ayarlayın.

Notİşler bu soru; son bir bakış için here bkz. istendi bu yana değişti


Otomatik düzen önce, çerçeve depolama, bağlantı noktası ayarı ve çerçeve geri görünüm hareket ettirmeden bir manzara katmanı bağlantı noktasını değiştirebilirsiniz.

Otomatik düzen bir dünyada, çerçeveler daha fazla seti yok, ama kısıtlamaları istediğimiz yere bir görünüm geri konumunu ayarlama görevine görünmüyor. Kısıtlamalar görünümü yeniden konumlandırmak için kesmek olabilir, ama dönme veya başka bir yeniden boyutlandırma olayları, bu geçersiz duruma.

Şu parlak fikir oluşturur gibi işe yaramaz bir "düzen özniteliklerini (sol) genişliği Geçersiz eşleştirme":

layerView.layer.anchorPoint = CGPointMake(1.0, 0.5);
// Some other size-related constraints here which all work fine...
[self.view addConstraint:
    [NSLayoutConstraint constraintWithItem:layerView
                                 attribute:NSLayoutAttributeLeft
                                 relatedBy:NSLayoutRelationEqual 
                                    toItem:layerView 
                                 attribute:NSLayoutAttributeWidth 
                                multiplier:0.5 
                                  constant:20.0]];

Burada amacım buydu ayarlamak için sol kenar layerView, görünümü ile ayarlanmış bağlantı noktası, yarım genişliği artı 20 (mesafe istiyorum daraltma sol kenar superview).

Bağlantı noktası, otomatik düzen ile dışarı atılır görünümünde bir görünüm yerini değiştirmeden, mümkün mü? Kodlanmış değerler kullanın ve her dönüş kısıtlaması düzenlemek gerek var mı? Umarım o değildir.

Başvurduğum zaman bir görünüme dönüştürmek, böylece bağlantı noktasını değiştirmek istiyorum, doğru Görsel Efekt olsun.

CEVAP
31 Aralık 2012, PAZARTESİ


[DEĞİŞTİR:Uyarı:Tüm çıkan tartışma muhtemelen modası geçmiş ya da en azından ağır artık zamanda düzeni tetikleme hata yapabilir 8, dönüştürme uygulanmış bir görünüm iOS azaltılacaktır.]

Otomatik düzen Görünüm vs Dönüştürüyor

Otomatik düzen hiç iyi görünüm dönüşümleri ile yürütülmez. Sebebi, bildiğim kadarıyla ben ayırt olduğunu anlaman şart değil karmaşa ile karenin bir görünümü olan bir dönüşüm (dışında varsayılan kimlik dönüşümü) - ama bu tam otomatik. Otomatik düzen böyle çalışır layoutSubviews çalışma zamanı, tüm kısıtlamalar koşarak ve buna göre tüm görüşlerini çerçeve ayarı geliyor.

Diğer bir deyişle, kısıtlamalar sihir değildir;-sadece bir liste. layoutSubviews yapılacaklar listesi yapılıyor. Ve kare ayarlayarak bunu yapar.

Bir hata olarak bu konuda yardım edemem. Eğer geçerli değilse bu bir görünüm dönüştürmek için:

v.transform = CGAffineTransformMakeScale(0.5,0.5);

Ve yarısı at gibi önce görüntüleme merkezi ile görünmesi için aynı yerde bekliyorum. Ama sınırlamalarına bağlı olarak, bu gördüğüm şey olmayabilir.

Aslında burada ikinci bir sürpriz var: hemen düzeni tetikler bir görünüm için dönüşüm uygulama. Bu bana bir hata gibi görünüyor. Ya da belki de ilk hata mesafede. Beklediğim uzakta düzeni zamana kadar kare bir animasyon ile alabilirim gibi en azından düzeni zamana kadar bir dönüşüm ile, örneğin cihaz döndürülür - elde edebilmek için. Ama aslında düzen zaman bana yanlış geliyor hemen.]

Çözüm 1: Kısıtlamaları

Tek geçerli çözüm ise (ve geçici bir şekilde sallamaktır sadece) bir görünüm için bir Yarı-kalıcı dönüşüm uygulamak için gidiyorum eğer, tüm kısıtlamalar etki kaldırmaktır. Ne yazık ki bu genellikle otomatik düzen hala yer alır, ve şimdi görünüm koymak için bize kısıtlamaları vardır hiç bu yana ekrandan kaybolmak görünüme neden olur. Kısıtlamaları kaldırma ek olarak, görünüm translatesAutoresizingMaskIntoConstraints Evet, EVET aldım. Görünümü artık eski yolu, otomatik düzen tarafından etkili bir şekilde etkilenmeden çalışır. (Buotomatik düzen tarafından etkilenen, belli ki, ama örtülü autoresizing maske kısıtlamaları otomatik düzen eskisi gibi davranışlara neden olabilir.)

Çözüm 2: Yalnızca, Uygun Kısıtlamaları

Eğer bana biraz zorlama gibi görünüyor, başka bir çözüm doğru bir yönelik çalışma kısıtlamaları dönüştürmek ayarlamak için. Eğer bir görünüm tamamen iç genişlik ve yüksekliği ile boy, ve tamamen Merkezi tarafından yerleştirilmiş ise, örneğin, benim ölçek beklediğim gibi çalışacak bir dönüşüm. Bu kod, bir küme (otherView) mevcut kısıtlamaları kaldırmak ve bu dört kısıtlamaları ile, genişlik ve yükseklik vererek ve tamamen merkezi ile bağlantılarını değiştirin. Bundan sonra, benim ölçekli çalışmalar dönüştürme:

NSMutableArray* cons = [NSMutableArray array];
for (NSLayoutConstraint* con in self.view.constraints)
    if (con.firstItem == self.otherView || con.secondItem == self.otherView)
        [cons addObject:con];

[self.view removeConstraints:cons];
[self.otherView removeConstraints:self.otherView.constraints];
[self.view addConstraint:
 [NSLayoutConstraint constraintWithItem:self.otherView attribute:NSLayoutAttributeCenterX relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1 constant:self.otherView.center.x]];
[self.view addConstraint:
 [NSLayoutConstraint constraintWithItem:self.otherView attribute:NSLayoutAttributeCenterY relatedBy:0 toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:self.otherView.center.y]];
[self.otherView addConstraint:
 [NSLayoutConstraint constraintWithItem:self.otherView attribute:NSLayoutAttributeWidth relatedBy:0 toItem:nil attribute:0 multiplier:1 constant:self.otherView.bounds.size.width]];
[self.otherView addConstraint:
 [NSLayoutConstraint constraintWithItem:self.otherView attribute:NSLayoutAttributeHeight relatedBy:0 toItem:nil attribute:0 multiplier:1 constant:self.otherView.bounds.size.height]];

Sonuçta bir dönüşüm içinde yer aldığı bir zaman sonra sen olan bir manzara karesi etkileyen kısıtlamalar varsa, Otomatik düzen görünüm çerçeve dokunmaz.

Çözüm 3: Bir Küme Kullanın

Hem yukarıdaki çözümler sorunu kısıtlamaları faydaları bizim görüşümüze göre pozisyon kaybediyoruz. İşte bu sorunu çözer bir çözüm. Bir ev sahibi olarak hareket etmek, sadece olan görünmez bir görünüm ile başlayın, ve kısıtlamaları konumlandırmak için kullanın. Bunun içinde, bir küme olarak gerçek görünüm koymak. Kısıtlamaları ana görünümünde küme konumlandırmak için kullanın, ama bir dönüşüm uygulayan karşılık vermiyorsun kısıtlamalara bu kısıtlamaları sınırı.

İşte bir örnek:

enter image description here

Beyaz görünümü, ana; şeffaf ve dolayısıyla görünmez olduğunu iddia gerekiyordu. Kırmızı view küme, ana merkezi görüntüleme merkezi tutturarak konumlandırılmış. Şimdi ve herhangi bir sorun olmadan kendi merkezi etrafında kırmızı görünüm, ölçek döndürmek, ve gerçekten resimde de öyle yaptık gösteriyor:

self.otherView.transform = CGAffineTransformScale(self.otherView.transform, 0.5, 0.5);
self.otherView.transform = CGAffineTransformRotate(self.otherView.transform, M_PI/8.0);

Ve bu arada ana bilgisayarda bir sınırımız cihaz döndürmek gibi doğru yerde tutmak görüntüleyin.

Çözüm 4: Katman Dönüşümleri Kullanın

Görünüm dönüşümleri yerine, katman düzeni harekete ve böylece kısıtlamaları ile hemen çatışmaya neden olan dönüşümler, kullanın.

Örneğin, bu "basit" görünüm animasyon iyi otomatik düzen altında kesilebilir: . çarpıntı

[UIView animateWithDuration:0.3 delay:0
                    options:UIViewAnimationOptionAutoreverse
                 animations:^{
    v.transform = CGAffineTransformMakeScale(1.1, 1.1);
} completion:^(BOOL finished) {
    v.transform = CGAffineTransformIdentity;
}];

Sonunda manzara boyutunda değişiklik yok olsa bile, yalnızca transform olmasını düzeni ve kısıtlamaları nedenleri görünümü ayarlama etrafında sıçrama yapabilir. (Bu bir böcek gibi ya da ne hissediyorsun?) Ama eğer Core Animation (bir CABasicAnimation kullanarak ve view katmanına animasyon uygulamak) aynı şeyi yaparsak, düzen olmaz, ve gayet iyi çalışıyor:

CABasicAnimation* ba = [CABasicAnimation animationWithKeyPath:@"transform"];
ba.autoreverses = YES;
ba.duration = 0.3;
ba.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1)];
[v.layer addAnimation:ba forKey:nil];

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • KarnasCamillo

    KarnasCamill

    24 EKİM 2007
  • pissengehen

    pissengehen

    26 EYLÜL 2006
  • USI Events

    USI Events

    6 AĞUSTOS 2013