web-dev-qa-db-ja.com

サブビューを自分の中心の周りで回転させる方法は?

ビューをそれ自体の中心の周りで回転させることは可能ですか?

私の現在の実装では、サブビュー(ボタンなど)は、(スーパービューの座標系が回転しているため)目的の位置に到達する前に、面白いパスに沿って移動しているように見えます。下の写真のように、ビューを自分の中心の周りで90度回転させたいと思います。

desired rotation

36
ragnarius

私はこの質問が本当に好きです。また、一部のインターフェイスでは回転アニメーションが不快に感じます。これが私があなたが描いたものをどのように実装するかです。単純な@interfaceで十分です。 注:私は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

.xibのボタンに適切なコンセント接続が行われます。

enter image description here

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

以上です。これで、デバイスを回転させても画面は回転しませんが、ボタンは次のように回転します。

enter image description here

もちろん、ボタンのラベルだけを回転させたい場合は、代わりに_buttonA.titleLabelに変換を適用するだけです。

注:ボタン以外のタッチに関する限りデバイスを回転させても、デバイスは縦向きのままですが、私のコメントに対するあなたの応答は、それはあなたにとって問題ではないことを示しているようです。 。

関連する質問がある場合は、コメントを残してください。

16
NJones

Transformプロパティを使用して、UIViewサブクラスを手動で回転させることができます。

#import <QuartzCore/QuartzCore.h>

myView.transform = CGAffineTransformMakeRotation(M_PI/2);
4
Cyprian