m_pMotionManager = [[CMMotionManager alloc]init];
if (m_pMotionManager.isAccelerometerAvailable) ///判断加速计是不是好用
{
m_pMotionManager.deviceMotionUpdateInterval = 1/ 30.0f;
__weak typeof(self) weakSelf = self;
[m_pMotionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error)
{
typeof(self) selfBlock = weakSelf;
CGFloat xx = accelerometerData.acceleration.x;
CGFloat yy = -accelerometerData.acceleration.y;
CGFloat zz = accelerometerData.acceleration.z;
CGFloat device_angle = M_PI / 2.0f - atan2(yy, xx);
UIDeviceOrientation orientation = UIDeviceOrientationUnknown;
if (device_angle > M_PI)
device_angle -= 2 * M_PI;
if ((zz < -.60f) || (zz > .60f)) {
if ( UIDeviceOrientationIsLandscape(selfBlock.lastOrientation) )
orientation = selfBlock.lastOrientation;
else
orientation = UIDeviceOrientationUnknown;
} else {
if ( (device_angle > -M_PI_4) && (device_angle < M_PI_4) )
orientation = UIDeviceOrientationPortrait;
else if ((device_angle < -M_PI_4) && (device_angle > -3 * M_PI_4))
orientation = UIDeviceOrientationLandscapeLeft;
else if ((device_angle > M_PI_4) && (device_angle < 3 * M_PI_4))
orientation = UIDeviceOrientationLandscapeRight;
else
orientation = UIDeviceOrientationPortraitUpsideDown;
}
if (orientation != selfBlock.lastOrientation) {
dispatch_async(dispatch_get_main_queue(), ^{
[selfBlock deviceOrientationDidChangeTo:orientation];
});
}
}];
}