iphone开发之设备方向和角度计算

来源:互联网 发布:四川空气质量监测数据 编辑:程序博客网 时间:2024/05/18 00:30

没什么好说的代码如下

 

头文件////////////

 

/*
 Erica Sadun, http://ericasadun.com
 iPhone Developer's Cookbook, 3.0 Edition
 BSD License, Use at your own risk
 */

#import <UIKit/UIKit.h>


@interface UIDevice (Orientation) <UIAccelerometerDelegate>
- (BOOL) isLandscape;
- (BOOL) isPortrait;
- (NSString *) orientationString;
- (float) orientationAngleRelativeToOrientation:(UIDeviceOrientation) someOrientation;
@property (nonatomic, readonly) BOOL isLandscape;
@property (nonatomic, readonly) BOOL isPortrait;
@property (nonatomic, readonly) NSString *orientationString;
@property (nonatomic, readonly) float orientationAngle;
@end

 

实现文件///////////

 

/*
 Erica Sadun, http://ericasadun.com
 iPhone Developer's Cookbook, 3.0 Edition
 BSD License, Use at your own risk
 */

// Thanks jweinberg, Emanuele Vulcano, rincewind42, Jonah Williams

#import "UIDevice-Orientation.h"

@implementation UIDevice (Orientation)

float device_angle;
CFRunLoopRef currentLoop;

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
    float xx = [acceleration x];
    float yy = -[acceleration y];
    device_angle = M_PI / 2.0f - atan2(yy, xx);
   
    CFRunLoopStop(currentLoop);
}

- (float) orientationAngle
{
#if TARGET_IPHONE_SIMULATOR
    // NSLog( @"Running in the simulator!" );
    switch (self.orientation)
    {
        case UIDeviceOrientationPortrait:
            return 0.0f;
        case UIDeviceOrientationPortraitUpsideDown:
            return M_PI;
        case UIDeviceOrientationLandscapeLeft:
            return -(M_PI/2.0f);
        case UIDeviceOrientationLandscapeRight:
            return (M_PI/2.0f);
        default:
            return 0.0f;
    }
#else
    id accelerometer_delegate = [UIAccelerometer sharedAccelerometer].delegate;
    [UIAccelerometer sharedAccelerometer].delegate = self;
   
    // Wait for a reading
    currentLoop = CFRunLoopGetCurrent();
    CFRunLoopRun();
    [UIAccelerometer sharedAccelerometer].delegate = accelerometer_delegate;
   
    return device_angle;
#endif
}

// Thanks Jonah Williams
- (float) orientationAngleRelativeToOrientation:(UIDeviceOrientation) someOrientation
{
    float dOrientation = 0.0f;
    switch (someOrientation)
    {
        case UIDeviceOrientationPortraitUpsideDown: {dOrientation = M_PI; break;}
        case UIDeviceOrientationLandscapeLeft: {dOrientation = -(M_PI/2.0f); break;}
        case UIDeviceOrientationLandscapeRight: {dOrientation = (M_PI/2.0f); break;}
        default: break;
    }
   
    float adjustedAngle = fmod(self.orientationAngle - dOrientation, 2.0f * M_PI);
    if (adjustedAngle > (M_PI + 0.01f)) adjustedAngle = (adjustedAngle - 2.0f * M_PI);
    return adjustedAngle;
}

- (BOOL) isLandscape
{
    return UIDeviceOrientationIsLandscape(self.orientation);
}

- (BOOL) isPortrait
{
    return UIDeviceOrientationIsPortrait(self.orientation);
}

- (NSString *) orientationString
{
    switch ([[UIDevice currentDevice] orientation])
    {
        case UIDeviceOrientationUnknown: return @"Unknown";
        case UIDeviceOrientationPortrait: return @"Portrait";
        case UIDeviceOrientationPortraitUpsideDown: return @"Portrait Upside Down";
        case UIDeviceOrientationLandscapeLeft: return @"Landscape Left";
        case UIDeviceOrientationLandscapeRight: return @"Landscape Right";
        case UIDeviceOrientationFaceUp: return @"Face Up";
        case UIDeviceOrientationFaceDown: return @"Face Down";
        default: break;
    }
    return nil;
}
@end