iOS 방향 변경 즉시 감지
장치 방향이 게임 상태에 영향을 미치는 게임이 있습니다. 사용자는 가로, 세로 및 가로 반전 방향을 빠르게 전환해야합니다. 지금까지 다음을 통해 오리엔테이션 알림을 위해 게임을 등록했습니다.
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
그러나 너무 느립니다. 전화를 회전하고 알림이 실제로 실행되는 사이에 약 1 초의 지연이있는 것 같습니다. 장치 방향의 변화를 즉시 감지하는 방법이 필요합니다. 자이로 스코프를 실험 해 보았지만 아직 제가 찾고있는 솔루션인지 아닌지 알 수있을만큼 충분히 익숙하지 않습니다.
그 지연 이에 대한 얘기는 사실은 거짓 (원치 않는) 방향 변경 알림을 방지하는 필터입니다.
들어 인스턴트 장치 방향 변화의 인식 당신은 가속도계를 직접 모니터링 할거야 단지입니다.
가속도계는 세 축 모두에서 가속도 (중력 포함)를 측정하므로 실제 방향을 파악하는 데 문제가 없어야합니다.
가속도계 작업을 시작하는 일부 코드는 여기에서 찾을 수 있습니다.
이 멋진 블로그는 수학 부분을 다룹니다.
viewWillAppear
함수에 알리미 추가
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
}
방향 변경은이 기능을 알립니다.
- (void)orientationChanged:(NSNotification *)notification{
[self adjustViewsForOrientation:[[UIApplication sharedApplication] statusBarOrientation]];
}
차례로 moviePlayerController 프레임이 방향이 처리되는이 함수를 호출합니다.
- (void) adjustViewsForOrientation:(UIInterfaceOrientation) orientation {
switch (orientation)
{
case UIInterfaceOrientationPortrait:
case UIInterfaceOrientationPortraitUpsideDown:
{
//load the portrait view
}
break;
case UIInterfaceOrientationLandscapeLeft:
case UIInterfaceOrientationLandscapeRight:
{
//load the landscape view
}
break;
case UIInterfaceOrientationUnknown:break;
}
}
viewDidDisappear
알림 을 제거
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
[[NSNotificationCenter defaultCenter]removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
}
방향에 따라 뷰를 변경할 수 있는 가장 빠른 것 같아요
사용하지 않은 이유
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
?
또는 이것을 사용할 수 있습니다
-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
Or this
-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
Hope it owl be useful )
For my case handling UIDeviceOrientationDidChangeNotification
was not good solution as it is called more frequent and UIDeviceOrientation
is not always equal to UIInterfaceOrientation
because of (FaceDown, FaceUp).
I handle it using UIApplicationDidChangeStatusBarOrientationNotification
:
//To add the notification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeOrientation:)
//to remove the
[[NSNotificationCenter defaultCenter]removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
...
- (void)didChangeOrientation:(NSNotification *)notification
{
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if (UIInterfaceOrientationIsLandscape(orientation)) {
NSLog(@"Landscape");
}
else {
NSLog(@"Portrait");
}
}
Try making your changes in:
- (void) viewWillLayoutSubviews {}
The code will run at every orientation change as the subviews get laid out again.
@vimal answer did not provide solution for me. It seems the orientation is not the current orientation, but from previous orientation. To fix it, I use [[UIDevice currentDevice] orientation]
- (void)orientationChanged:(NSNotification *)notification{
[self adjustViewsForOrientation:[[UIDevice currentDevice] orientation]];
}
Then
- (void) adjustViewsForOrientation:(UIDeviceOrientation) orientation { ... }
With this code I get the current orientation position.
ReferenceURL : https://stackoverflow.com/questions/12085990/detecting-ios-orientation-change-instantly
'programing' 카테고리의 다른 글
Django for 루프 템플릿에서 홀수 및 짝수 값을 얻으려면 어떻게해야합니까? (0) | 2021.01.16 |
---|---|
CryptographicException이 처리되지 않았습니다. 시스템이 지정된 파일을 찾을 수 없습니다. (0) | 2021.01.16 |
문자열 내에서 문자열이 나타나는 횟수 계산 (0) | 2021.01.16 |
데이터 테이블 온더 플라이 크기 조정 (0) | 2021.01.16 |
TypeScript의 'instanceof'에서 " 'Foo'는 유형 만 참조하지만 여기서는 값으로 사용되고 있습니다."라는 오류가 표시되는 이유는 무엇입니까? (0) | 2021.01.15 |