2011-08-29 17 views

cevap

18

Burada CoreGraphics CGAffineTransform ile aynı biçimi kullanan bir işlev var. API formatı.

Bu, diğer "RotateAt()" API'lerinin nasıl çalışması gerektiği konusunda tam olarak çalışır. İşlem, aşağıdaki spesifikasyonun eşdeğerini temsil eder: tercüme (pt.x, pt.y); (Açı) döndürme; tercüme et (-pt.x, -pt.y); Sadece CGAffineTransformMakeRotation() olduğu gibi

CGAffineTransform CGAffineTransformMakeRotationAt(CGFloat angle, CGPoint pt){ 
    const CGFloat fx = pt.x, fy = pt.y, fcos = cos(angle), fsin = sin(angle); 
    return CGAffineTransformMake(fcos, fsin, -fsin, fcos, fx - fx * fcos + fy * fsin, fy - fx * fsin - fy * fcos); 
} 

, açı radyan değil derece içindedir.

+1

Ben pt bir merkez olduğunu varsayalım? – Andy

+0

Neden sadece bir "var t = CGAffineTransformMakeTranslation (-pt.x, -pt.y)' yi yapamıyorsunuz ve daha sonra "t = CGAffineTransformRotate (t, angel)" ile döndürme yapamıyorsunuz ve daha sonra "var t" ile geri çeviri yapmıyoruz = CGAffineTransformTranslate (t, pt.x, pt.y) '? – Adam

+1

@Adam Yapmanız gereken 3 şey var. Cevabım her üçü de yapacak bir çağrı. Son derece optimize edilmiş. Lütfen cevabımı, özellikle koddan önceki 3. satırı tekrar oku. – Andy

1

Sadece bir şans verdim. Böyle bir şey size için ...

- (void)rotateView:(UIView *)view aroundPoint:(CGPoint)point withAngle:(double)angle{ 
    //save original view center 
    CGPoint originalCenter = view.center; 

    //set center of view to center of rotation 
    [view setCenter:point]; 

    //apply a translation to bring the view back to its original point 
    view.transform = CGAffineTransformMakeTranslation(originalCenter.x, originalCenter.y); 

    //multiply the view's existing rotation matrix (the translation) by a rotation and apply it to the view 
    //thereby making it rotate around the external point 
    view.transform = CGAffineTransformConcat(view.transform, CGAffineTransformMakeRotation(angle)); 
} 

Sadece seni biraz akıl yürütme açıklamaya aradığınız sonuca ... vermelidir

Ne temelde fiziksel noktaya görünümü kayıyor yapıyoruz Rotasyon, sonra orijinal noktada kaldı gibi görünmesi için bir çeviri uygulanıyor. Daha sonra, bir rotasyonu görünümün yeni çevirisi ile çarparak çoğaltırsak, esasen tüm görünümü ve koordinat sistemini döndürürüz, böylece belirli nokta etrafında dönüyor gibi görünür. Umarım bunu iyi açıklardım. : | Eğer değilse, dönüşüm matrislerini online olarak incelemeyi öneririm belki de orada nasıl yığdıkları ile ilgili daha iyi açıklamalar bulabilirsiniz!

2

Görüntü görünümünün katmanın anchorPoint'ini (0,0) ve (1,1) dışındaki bir şeye, yani view.layer.anchorPoint = CGPointMake (2, 2) konumuna ayarlayın.

+0

Eğer bununla devam ederseniz, iki şeyi hatırlayın: a) görüşünüzün çizildiği yer tamamen değişecektir, sadece dönüşüm değil b) anchorPoint'in x ve y değerleri görünüm boyutunun katlarıdır. Ana görüş koordinat sisteminde değiller. – mjisrawi

2

Bu şekilde çözdüm: Başka bir görünüme dönmek istediğim UIImage'ı yerleştirdim. Görünüm, görünümün orta noktası görünümün merkez noktasının uiimage görünümünün dış noktası olduğunu, bu yüzden görünümü döndürüyorum ....