Jak obracać sub-widoki wokół własnych ośrodków?

Czy można obrócić widok wokół własnego środka?

W mojej obecnej implementacji pod-widoki (przyciski itp.) wydają się poruszać zabawną ścieżką, zanim znajdą się w pożądanych pozycjach (ponieważ układ współrzędnych Super widoku jest obrócony). Chciałbym, aby widoki obracały się o 90 stopni wokół własnych ośrodków jak na poniższym zdjęciu.

pożądany obrót

Author: ragnarius, 2012-01-08

2 answers

Podoba mi się to pytanie. Uważam również, że animacja obrotu jest drażniąca dla niektórych interfejsów. Oto, jak zaimplementowałbym to, co sobie wyobrażasz. Proste @interface będzie w porządku. Uwaga: używam ARC.

#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

Odpowiednie połączenia wylotowe są wykonane z przyciskami w .xib:

Tutaj wpisz opis obrazka

ControllerWithRotatingButtons.m:

#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
I to wszystko. Teraz po obróceniu urządzenia ekran nie będzie się obracał, ale przyciski będą pokazano:

Tutaj wpisz opis obrazka

Oczywiście, jeśli chcesz, aby tylko etykiety przycisku się obracały, po prostu zastosuj transformację do _buttonA.titleLabel.

Uwaga: pamiętaj, że gdy urządzenie zostanie obrócone, jeśli nie dotkniesz przycisków, urządzenie nadal jest w pionie, ale twoja odpowiedź na mój komentarz wydaje się wskazywać, że nie jest to dla Ciebie problem.

Możesz zostawić komentarz, jeśli masz związane z tym pytanie.

 16
Author: NJones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-10 06:29:09

Możesz ręcznie obracać dowolną podklasę UIView używając właściwości transform.

#import <QuartzCore/QuartzCore.h>

myView.transform = CGAffineTransformMakeRotation(M_PI/2);
 4
Author: Cyprian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-08 11:51:02