我有一個始終處于縱向的視圖控制器。有一項功能是根據設備本身的當前方向作業的,而不是根據視圖控制器的方向。
在這種情況下,我怎樣才能檢測到設備的方向并在方向改變時觸發功能?
uj5u.com熱心網友回復:
從iOS 8開始,他們引入了viewWillTransitionToSize,每次旋轉發生時都會被觸發
- (void)viewWillTransitionToSize: (CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator> )coordinator {
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation] 。
//在這里做你需要的方向。
} completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
}];
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator] 。
uj5u.com熱心網友回復:
你可以通過運行CMMotionManager來實作這一點
。#import <CoreMotion/CoreMotion.h>
#define DEGREES(x) (180.0 * x / M_PI)/span>
#define RADIAN(x) (M_PI*x/180.0)
#define UPDATE_INTERVAL 0.3
typedef struct Point3D {
CGFloat x, y, z;
} Point3D;
@interface DirectionListener()
{
NSTimer * _motionTimer。
CMMotionManager *_motionManager。
@end @end *_motionManager; }
@implementation DirectionListener
- (instancetype)init
{
self = [super init]。
if (self)
{
}
return self;
}
- (void)dealloc
{
[self stopListenning] 。
_motionManager = nil;
if (_motionTimer)
{
[_motionTimer invalidate];
_motionTimer = nil;
}
}
- (void)startListenning
{
if (_motionManager.deviceMotionActive)
{
return;
}
if (!_motionManager)
{
_motionManager = [[CMMotionManager alloc] init];
_motionManager.deviceMotionUpdateInterval = UPDATE_INTERVAL。
}
[_motionManager startDeviceMotionUpdates]。
if (!_motionTimer)
{
_motionTimer = [NSTimer scheduledTimerWithTimeInterval:UPDATE_INTERVAL target:self selector: @selector(changeWithAttitude) userInfo:nil repeats:YES]。
}
}
- (void)stopListenning {
if (_motionManager.deviceMotionActive)
{
[_motionManager stopDeviceMotionUpdates]。
[_motionTimer invalidate];
_motionTimer = nil;
}
}
-(void)changeWithAttitude
{
//從motionManager那里獲取值。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/307324.html
標籤:
上一篇:在ForEach中,SwiftUI的文本不能被本地化。
下一篇:分享我自學前端的一些學習網站
