NSAffineTransform, iki boyutlu grafiklerde afin dönüşümü temsil eden AppKit (macOS) sınıfıdır. Koordinatların öteleme, ölçekleme, döndürme ve kesme kombinasyonunu tanımlayan 3×3 matrisi kapsüller. Apple Belgeleri'ne (2026) göre, NSAffineTransform, Core Graphics'ta macOS üzerinde yolları, noktaları ve grafik bağlamlarını dönüştürmek için yaygın olarak kullanılır.
Önemli Noktalar
NSAffineTransform, AppKit çerçevesinin bir sınıfıdır ve yalnızca macOS'ta kullanılabilir. 3×3 matris aracılığıyla iki boyutlu uzayda afin dönüşümü temsil eder. Core Graphics'taki CGAffineTransform'un (iOS'ta mevcut) aksine, NSAffineTransform, CGAffineTransform yapısı etrafında nesne yönelimli bir sarmalayıcıdır ve NSBezierPath, NSPoint ve NSSize ile çalışmak için kullanışlı yöntemler ekler.
Afin dönüşüm, “nokta bir çizgi üzerindedir” ilişkisini ve çizgilerin paralelliğini koruyan düzlemin bir dönüşümüdür. Başka bir deyişle, afin dönüşümden sonra paralel çizgiler paralel kalır ve düz çizgiler düz kalır. Ancak mesafeler, açılar ve alanlar değişebilir: ölçekleme, döndürme ve kesme, afin dönüşümlerin özel durumlarıdır.
iOS'ta, NSAffineTransform'un eşdeğeri Core Graphics'taki CGAffineTransform yapısıdır. Her iki API de aynı matematiksel modele dayanır — son satırı her zaman [0, 0, 1] olan 3×3 afin dönüşüm matrisi. Fark, NSAffineTransform'un bir sınıf (Objective-C'de retain/release ile) olması, CGAffineTransform'un ise Swift ve C'de bir yapı (değer türü) olmasıdır.
NSAffineTransform dört temel dönüşüm türünü destekler: translate (öteleme), scale (ölçekleme), rotate (döndürme) ve shear (kesme). Her tür ayrı bir yöntemle temsil edilir ve mevcut bir dönüşüm nesnesine uygulanabilir veya yeni bir tane oluşturmak için kullanılabilir.
| İşlem | NSAffineTransform Yöntemi | Parametreler | Görsel Efekt |
|---|---|---|---|
| Translate | translateXBy:yBy: | deltaX, deltaY | Nesneyi X ve Y eksenleri boyunca kaydırır |
| Scale | scaleBy: / scaleXBy:yBy: | factor / scaleX, scaleY | Boyutu büyütür veya küçültür |
| Rotate | rotateByDegrees: / rotateByRadians: | derece veya radyan cinsinden açı | Orijin etrafında döndürür |
| Shear | setTransformStruct aracılığıyla | Matrisin m12, m21 bileşenleri | Nesneyi bir eksen boyunca eğer |
Translate, bir nesnenin tüm noktalarının koordinatlarına bir ofset ekler. deltaX ve deltaY parametreleri sırasıyla yatay ve dikey öteleme miktarını belirler. Pozitif deltaX değeri sağa, deltaY yukarı kaydırır. Translate, nesnenin şeklini veya boyutunu değiştirmez — yalnızca konumunu değiştirir.
Scale, noktaların koordinatlarını belirli bir faktörle çarpar. Tekdüze ölçekleme (tek parametre) ile nesne orantılı olarak büyür veya küçülür. Tekdüze olmayan ölçeklemede şekil bozulur. Faktör 1,0 boyutu değiştirmez, 1,0'dan büyük büyütür, 0,0 ile 1,0 arası küçültür. Negatif değerler ayna yansıması oluşturur.
Rotate, nesneyi orijin etrafında belirli bir açıyla döndürür. Pozitif döndürme açısı saat yönünün tersine dönüşe karşılık gelir. rotateByDegrees derece (0–360), rotateByRadians radyan (0–2π) kabul eder. Döndürme her zaman (0, 0) noktasına göre yapılır, bu nedenle rastgele bir nokta etrafında döndürmek için rotate ile translate'i birleştirmek gerekir.
NSAffineTransform'daki afin dönüşüm, son satırı her zaman [0, 0, 1] olan 3×3 matrisle temsil edilir. Bu, dönüşümlerin bir kombinasyonunu matrislerin çarpımı olarak temsil etmeye izin veren standart matematiksel gösterimdir. Matris yapısı, altı önemli bileşen içeren NSAffineTransformStruct aracılığıyla tanımlanır: m11, m12, m21, m22, tX, tY.
m11, m12, m21, m22 bileşenleri ölçekleme, döndürme ve kesmeden sorumludur. tX ve tY bileşenleri ötelemeden sorumludur. Standart yapılandırmada (birim matris), m11 = 1, m22 = 1 ve geri kalanı 0'dır. Geçerli matris değerlerini almak için, NSAffineTransformStruct yapısını döndüren NSAffineTransform özelliği transformStruct kullanılır.
Matris çarpımı değişmeli olmayan bir işlemdir. Bu, dönüşümleri uygulama sırasının önemli olduğu anlamına gelir: translate + rotate, rotate + translate'den farklı bir sonuç verir. Birleştirirken, NSAffineTransform yeni matrisi soldan geçerli matrisle çarpar: newMatrix = operation × currentMatrix. Bu nedenle, en son eklenen dönüşüm ilk önce uygulanır.
NSAffineTransform, birden çok dönüşümü tek bir nesnede birleştirmeye izin verir. translateXBy:yBy:, scaleBy: veya rotateByDegrees: çağrılarının her biri iç matrisi değiştirir — geçerli matrisi ilgili dönüşümün matrisiyle çarpar. Bu, basit işlemler dizisinden karmaşık bir dönüşüm oluşturmayı sağlar.
Birleştirilmiş bir dönüşümü tersine çevirmek için invert yöntemi kullanılır. Ters, orijinali iptal eden yeni bir afin dönüşüm oluşturur: bir noktaya orijinal dönüşümü ve ardından tersini uygularsanız, nokta orijinal konumuna geri döner. Tersine çevirme, dönüştürülmemesi gereken UI öğelerini çizmeden önce bağlam dönüşümünü iptal etmek için kullanışlıdır.
Bir dönüşümün birim (koordinatları değiştirmez) olup olmadığını kontrol etmek için isIdentity özelliğini kullanın. Birim dönüşüm bir birim matristir — onunla çarpmak noktanın koordinatlarını değiştirmez. Yeni bir NSAffineTransform nesnesi birim dönüşüm olarak oluşturulur. Bu özellik optimizasyon için kullanışlıdır: dönüşüm birimse, uygulanması atlanabilir.
NSAffineTransform dört tür nesneye uygulanabilir: NSPoint, NSSize, NSBezierPath ve NSGraphicsContext grafik bağlamı. Her hedef için ayrı bir yöntem vardır: transformPoint:, transformSize:, transformBezierPath: ve set.
Yöntem transformPoint:, dönüşüm matrisini noktanın koordinat vektörü (x, y, 1) ile çarpar ve noktanın yeni konumunu döndürür. transformSize: benzer şekilde çalışır ancak tX ve tY bileşenlerini hesaba katmaz — öteleme uygulanmaz, yalnızca ölçekleme, döndürme ve kesme uygulanır. Bu, kaydırılmaması gereken vektörleri ve boyutları dönüştürmek için kullanışlıdır.
Yöntem transformBezierPath:, her noktası NSAffineTransform matrisine göre dönüştürülen yeni bir NSBezierPath nesnesi oluşturur. Orijinal yol değiştirilmez — dönüştürülmüş koordinatlarla bir kopya oluşturulur. Bu, çok sayıda düğüme sahip karmaşık yollar için pahalı bir işlemdir.
Yöntem set, geçerli grafik bağlamına (NSGraphicsContext) dönüşümü uygulayarak CTM'sini (Geçerli Dönüşüm Matrisi) değiştirir. set çağrıldıktan sonra, bu bağlamdaki sonraki tüm çizimler dönüştürülecektir. Geçici dönüşümler için set'ten önce ve sonra saveGraphicsState / restoreGraphicsState kullanın.
Grafik nesneleri dönüştürmek için macOS uygulamasında NSAffineTransform kullanımının pratik örneklerine bakalım.
Bu örnek, öteleme, döndürme ve ölçeklemeyi birleştiren bir NSAffineTransform oluşturur. Önce nesne (100, 50) kadar ötelenir, sonra 45 derece döndürülür ve son olarak 1,5 kat ölçeklenir. Sıra önemlidir: ötelemeden sonra döndürme, yeni orijine göre döndürür.
import AppKit
let transform = NSAffineTransform()
transform.translateXBy(100, yBy: 50)
transform.rotateByDegrees(45)
transform.scaleBy(1.5)
// Noktaya uygulama
let point = NSPoint(x: 10, y: 20)
let transformedPoint = transform.transform(point)
// Boyuta uygulama
let size = NSSize(width: 100, height: 50)
let transformedSize = transform.transform(size)
Bu örnek, set ve concat aracılığıyla grafik bağlamına NSAffineTransform uygulanmasını gösterir. Dönüşüm uygulandıktan sonra, sonraki tüm çizimler dönüştürülmüş koordinat sisteminde gerçekleştirilir. saveGraphicsState ile grafik durumunu kaydetmek, orijinal matrise dönmeyi sağlar.
func drawWithTransform(in rect: NSRect) {
guard let ctx = NSGraphicsContext.current
else { return }
ctx.saveGraphicsState()
let xfm = NSAffineTransform()
xfm.translateXBy(rect.midX, yBy: rect.midY)
xfm.rotateByDegrees(30)
xfm.scaleBy(0.8)
xfm.concat()
// Dönüştürülmüş koordinat sisteminde çizim
let path = NSBezierPath(roundedRect: NSRect(
x: -50, y: -50,
width: 100, height: 100
), xRadius: 10, yRadius: 10)
NSColor.blue.setFill()
path.fill()
ctx.restoreGraphicsState()
}
Bu örnek, dönüştürülmüş koordinatlarla bir NSBezierPath'in kopyasını oluşturmayı gösterir. Orijinal yol değişmeden kalır ve dönüştürülmüş kopya ayrı olarak çizilebilir — bu, farklı konumlarda yinelenen öğeler oluşturmak için kullanışlıdır.
func createTransformedTriangle() -> NSBezierPath {
let triangle = NSBezierPath()
triangle.move(to: NSPoint(x: 0, y: 0))
triangle.line(to: NSPoint(x: 100, y: 0))
triangle.line(to: NSPoint(x: 50, y: 100))
triangle.close()
let xfm = NSAffineTransform()
xfm.translateXBy(200, yBy: 100)
xfm.scaleXBy(1.5, yBy: 1.5)
xfm.rotateByDegrees(45)
let transformed = xfm.transform(triangle)
return transformed
}
Sıkça Sorulan Sorular
NSAffineTransform AppKit'in (yalnızca macOS) bir sınıfıdır, CGAffineTransform ise Core Graphics'ın (iOS ve macOS) bir yapısıdır. NSAffineTransform nesne yönelimli bir sarmalayıcıdır ve NSBezierPath ile çalışmak için yöntemler sağlar. CGAffineTransform, CGPath ile kullanılan hafif bir değer türü yapısıdır.
Merkez etrafında döndürmek için üç adım gerçekleştirin: 1) nesnenin merkezine öteleme (orijini merkeze taşıma), 2) istenen açıda döndürme, 3) negatif merkez vektörü kadar geri öteleme. Öteleme—döndürme—öteleme kombinasyonu, orijin yerine rastgele bir nokta etrafında döndürme sağlar.
Hayır, NSAffineTransform yalnızca macOS'ta AppKit'in bir parçası olarak kullanılabilir. iOS'ta, benzer yetenekler sağlayan Core Graphics'ın CGAffineTransform yapısı kullanılır: CGAffineTransformMakeTranslation, CGAffineTransformMakeScale, CGAffineTransformMakeRotation ve CGAffineTransformConcat.
Ters dönüşümü döndüren invert yöntemini kullanın. Orijinal dönüşümü tersiyle çarparsanız, bir birim matris (birim dönüşüm) elde edersiniz. Geçici uygulama için set'ten önce saveGraphicsState ve sonra restoreGraphicsState çağırın.
Negatif ölçekleme kullanın: transform.scaleXBy(-1, yBy: 1) yatay yansıma, scaleXBy(1, yBy: -1) dikey yansıma oluşturur. Rastgele bir eksene göre yansıtmak için translate (eksene kaydırma), -1 ile scale ve ters translate'i birleştirin.
Özet
invert yöntemiyle tersine çevirme herhangi bir afin dönüşümü iptal ederAnahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun