2011-12-29 14 views
15

ayarlanması:Kısacası yeni oluşturulan doğru çerçeveyi CAShapeLayer

  1. Elma otomatik olarak CAShapeLayer için frame veya bounds set DEĞİLDİR ayarlarsanız
  2. (ve Apple [UIView sizeThatFits] bir eşdeğer uygulanan DEĞİL HAS) Yolun sınırlayıcı kutusunun boyutunu kullanarak çerçeve ... her şey yanlış gidiyor. Ne olursa olsun ayarlamak için denemek nasıl, bu vidalar-up yolu

Yani, programlı bir bir CGPath yeni eklenen ile CAShapeLayer yeni oluşturulan çerçevesini ayarlamak için doğru yolu nedir? Apple'ın belgeleri konuyla ilgili sessiz.

çalışmıyor denedim şeyler: katman en frame edin,

  1. bir CAShapeLayer
  2. bir CGPath oluştur tabakasının
  3. eklemek - bu {{0,0},{0,0}}
  4. Küme: layer.frame = CGPathGetBoundingBox(layer.path)
  5. Çerçeve şimdi doğru, ancak şimdi yol DOUBLE ofset -değiştiriliyor layer.bounds = CGPathGetBoundingBox(layer.path)

  6. ... hepsi delirdi:yolunu neden etkili bir
  7. Seti fazladan (x,y) piksel

    kaydırılacak. Artık hiçbir şey anlam ifade etmiyor
  8. layer.position = CGPathGetBoundingBox(layer.path).origin
  9. ... hiçbir zar; hala deli.

tek şey işi DID o çalıştı, ama başka bir yerde sorunlara neden olmaktadır ettik:

DÜZENLEME: Bu ekranı otomatik döndürme en kısa sürede KIRIYOR. Tahminim: Apple'ın otomatik döndürme , "dönüşüm" özelliğinin kontrolünü gerektirir.

  1. edin katmanın çerçevesini, bir CAShapeLayer
  2. bir CGPath oluştur tabakasının
  3. eklemek - bu {{0,0},{0,0}}
  4. Seti var: layer.frame = CGPathGetBoundingBox(layer.path)
  5. Seti: layer.transform = CGAffineTransformMakeTranslation(CGPathGetBoundingBox(layer.path).origin.x * -1, // same for y-coord: set it to "-1 * the path's origin

Bu çalışır, ancak ... 3 parti çok sayıda kod ilk dönüşüm f varsayar veya bir CALayer Kimliktir.

Bu zor olmamalı! Elbette burada yanlış yaptığım bir şey var mı?

(Bir önerim vardı: "Bir yol eklediğinizde, tüm noktaları el ile -1 * (top-left-point.x, top-left-point.y) olarak kaydırmak için özel bir işlev çalıştırın".Yine, bu işe yarar - ama gülünç bir şekilde karmaşıktır)

+0

Bunun için bir çözüm buldunuz mu? – jannej

+0

Henüz değil. Şu anda sorunun kendisinden bir geçici çözüm kullanıyorum. Yavaş ve korumak için bir acı. Bence sorun Apple'ın kodunda bir hata, belki? – Adam

+3

Küçük bir ek: Sonunda ".frame" in Apple tarafından desteklenmediğini keşfettim. Bu çok tuhaf bir şey çünkü her yerde kullanılıyor - ama eğer dokümanlar ve/veya Apple posta listelerinde yeterince derinlemesine kazıyorsanız, Apple mühendislerinden çalışma niyetinde olmadığını ve hataları düzeltmeyeceğini söyleyen notları keşfedersiniz. HERKES için .bounds'u kullanmanız/talep etmeniz ve "readonly" olarak .frame'i kullanmanız bekleniyor. Bu yüzden özellikle ironik bu durumda .frame "neredeyse çalışır", nerede ayar .bounds "asla çalışmaz" :) – Adam

cevap

4

Katman sınırlarını ayarlamak için layer.bounds yapılması gereken en doğru şeydir - katmanın yerel koordinat alanını yolla eşleştirmek istiyorsanız. Ancak, o zaman, aynı zamanda, katmanın konum özelliğini süper katmandaki doğru yere taşımak için ayarlamanız gerekir.

(Ayarlama .frame sizin için .bounds ve .position doğru değerlerini hesaplama çerçevesi içine çevirir, ancak her zaman sınırlar bırakır.Yalnızca, sizin sınırınız sıfır olmayan bir menşe sahip olduğunda istediğiniz ne değil, el değmemiş .)

Yani böyle bir şey onun zamanki (0,5, 0,5) değerinden anchorPoint değişmemiştir varsayarak çalışmak ve onun superlayer kaynağına ilişkin hizada tabakayı konumlandırmak istediğiniz olmalıdır:

CGRect r = CGPathGetBoundingBox(layer.path); 
layer.bounds = r; 
layer.position = CGPointMake(r.size.width*.5, r.size.height*.5); 
İlgili konular