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

没什么好说的代码如下

 

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

 

/* 
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 &gt; (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










本文转自 arthurchen 51CTO博客,原文链接:http://blog.51cto.com/arthurchen/575684,如需转载请自行联系原作者
上一篇:Spring 事务传播机制


下一篇:【OSGI】5.实战OSGI-翻译助手项目03