2012-01-08 18 views
36

Kendi merkezindeki bir görünümü döndürmek mümkün mü?Alt merkezlerin kendi merkezlerinin çevresinde nasıl döndürülebilir?

Mevcut uygulamamda alt görünümler (düğmeler, vb.), Istenen konumlarda sona ermeden önce (süper görüntünün koordinat sistemi döndüğü için) komik bir yol boyunca hareket ediyor gibi görünür. Görünümlerin aşağıdaki resimdeki gibi kendi merkezlerinin etrafında 90 derece dönmesini istiyorum.

desired rotation

+21

+1 Güzelce görüntülenen soru için +1 – Till

+0

Durum çubuğunun sabit kalmasını ister misiniz, yoksa resimde yalnızca göz ardı edilmiş mi? – NJones

+0

@NJones Temel hedefim olmasa da, hala devam ederse tamam olur! Benim mevcut uygulamada, alt görünümler (ya da kök pencere?) Dönüyor olduğundan, alt görünümler bir "komik yol" boyunca hareket eder. – ragnarius

cevap

16

Bu soruyu gerçekten çok seviyorum. Ayrıca bazı arayüzler için rotasyon animasyonunu da buluyorum. Resimde gördüğün şeyi nasıl uygulayacağım. Basit bir @interface sadece iyi olacak. Not: ARC kullanıyorum.

enter image description here

ControllerWithRotatingButtons.m:

#import <UIKit/UIKit.h> 
@interface ControllerWithRotatingButtons : UIViewController 
@property (strong, nonatomic) IBOutlet UIButton *buttonA; 
@property (strong, nonatomic) IBOutlet UIButton *buttonB; 
@property (strong, nonatomic) IBOutlet UIButton *buttonC; 
@end 

uygun çıkış bağlantıları .xib düğmelerin yapılır

#import "ControllerWithRotatingButtons.h" 
@implementation ControllerWithRotatingButtons 
@synthesize buttonA = _buttonA; 
@synthesize buttonB = _buttonB; 
@synthesize buttonC = _buttonC; 
-(void)deviceRotated:(NSNotification *)note{ 
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation; 
    CGFloat rotationAngle = 0; 
    if (orientation == UIDeviceOrientationPortraitUpsideDown) rotationAngle = M_PI; 
    else if (orientation == UIDeviceOrientationLandscapeLeft) rotationAngle = M_PI_2; 
    else if (orientation == UIDeviceOrientationLandscapeRight) rotationAngle = -M_PI_2; 
    [UIView animateWithDuration:0.5 animations:^{ 
     _buttonA.transform = CGAffineTransformMakeRotation(rotationAngle); 
     _buttonB.transform = CGAffineTransformMakeRotation(rotationAngle); 
     _buttonC.transform = CGAffineTransformMakeRotation(rotationAngle); 
    } completion:nil]; 
} 
-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceRotated:) name:UIDeviceOrientationDidChangeNotification object:nil]; 
} 
-(void)viewDidUnload{ 
    [super viewDidUnload]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; 
} 
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 
@end 

Ve işte bu kadar. Cihazınızı döndürdüğünüzde Şimdi ekran döndürme olmayacak ama düğmeler olarak gösterilir olacaktır: Elbette

enter image description here

sadece düğmenin etiket sadece yerine _buttonA.titleLabel dönüşümü geçerli olacak çevirmek istiyorum.

Not: cihaz kadarıyla düğmelerle ilgili herhangi dokunuşlar ilgili olarak döndürülür kez cihaz portre hala ama benim yorumum cevabınız bu sizin için bir sorun değil göstermektedir görünüyor unutmayın.

İlgili bir sorunuz varsa yorum yazmaktan çekinmeyin.

+0

Çok teşekkürler! Kod zarif ve alt gösterimler artık çok kaygan! – ragnarius

+0

Aferin dostum! Çok verimli ! – Nil

4

Sen manuel özelliğini dönüşümü kullanarak herhangi UIView alt sınıfı döndürebilirsiniz.

#import <QuartzCore/QuartzCore.h> 

myView.transform = CGAffineTransformMakeRotation(M_PI/2); 
+0

Kolay görünüyor! Fakat bir şekilde ana görünümün dönmesini engellemeli ve kod snippet'inizi nereye yerleştireceğimi bulmalıyım. – ragnarius

+0

"UIViewController" döndürme geri aramalarına bakmalısınız, örneğin "--AutorotateToInterfaceOrientation:" ve '- willRotateToInterfaceOrientation: duration:'. Görünümü rotasyondan koruyabilir, ancak rotasyon etkinliklerine hala abone olup olmadığınızı görün ve alt raporlarınızı buna göre değiştirin. –

İlgili konular