2009-10-28 2 views
0

마감일이 곧 있으며 나 앞에서 매우 성가신 버그가 있으며 문제를 해결할 방법이 없습니다. 문제는 때때로 디바이스가 방향이 회전되기 전에되어 무엇을 알고하지 않습니다이고, 그래서 조건문에서 프레임을 망쳐 놨 :시작시 회전 또는 강제하기 전에 장치 방향 가져 오기. 어떤 아이디어?

나는 테이블에 장치를 유지하는 경우이 버그는 쉽게 재현 할 수

if (orient == UIInterfaceOrientationPortrait || orient == 0){ 
    r = CGRectMake(0.0, 0.0, 320.0, 480.0); 
     // draw stuff 
    } else { 
    r = CGRectMake(0.0, 0.0, 480.0, 320.0); 
     // draw stuff 
    } 
또는 손 (가로 위치)에 놓고 내 응용 프로그램을 실행하면 세로 형식의 화면에 가로 방향의 사각형이 그려집니다.

내 질문은 : 어떻게 든 이런 상황에서 올바른 방향을 얻을 수 있습니까? 너무 나쁜 그것은 시뮬레이터에서 재현 할 수 없기 때문에 붙여 넣은 코드가이 버그를 담당하는지는 확실하지 않지만 그 방향으로 뷰 프레임을 수정하는 곳입니다. 어쩌면 또 다른 (적절한) 방법이 있을까요? 그리고 회전 이벤트가 발생할 때까지 응용 프로그램을 세로 모드로 강제 설정할 수 있습니까?

답변

1

나는 버그라고 생각하지 않습니다. iPhone이 테이블 위에 놓여지면 Z 축을 따라 모든 중력이 측정됩니다. 장치 방향을 결정하기 위해 xy 축이 사용되지만 시나리오에서는 가속도가 측정되지 않습니다.

편집 : 또한 설명 :

이 이미지는 축이 아이폰의 방향을 보여줍니다 그래서 alt text http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIAcceleration_Class/Art/device_axes.jpg

당신은 아이폰이 -1g의 가속도가 적용, 뒷면에 누워있을 때 z 축. 측정 된 가속도를 수신하려면 UIAccelerometerDelegateUIAccelerometer 공유 인스턴스를 구현하는 대리인을 등록하십시오. 이 작업을 수행하는 방법은 AccelerometerGraph 샘플을 참조하십시오. 가속도계의 정밀도 18mG = 0.018G 그렇게 계정으로 가져가되어

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 
    { 

    // lowPass filter first 

    // now choose orientation 
     if (fabs([acceleration z]) >= 0.9) // sitting on the table: choose new mode or lock current mode 
     if (fabs([acceleration y]) >= 0.9) // probably portrait mode 
     if (fabs([acceleration x]) >= 0.9) // probably landscape mode 

    } 

:

는 아이폰이 테이블에 앉아있는 경우 같은 것을 할 결정합니다. 또한 인스턴트 이동 변경의 영향으로부터 자신을 격리해야하며 간단한 LowPass 필터가이 법안을 완벽하게 충족시킵니다. AccelerometerGraph 샘플은 이러한 필터를 구현하는 방법을 보여줍니다.

또한 매우 낮은 updateInterval을 선택하면 많은 정밀도가 필요하지 않으므로 30Hz는 사용자의 목적에 맞아야합니다.

+0

답변 주셔서 감사합니다. 그러나 아이폰이 "탁자 위에 놓여 있음"을 알 수있는 방법을 알려주십시오. 그리하여 오리엔테이션은 내 응용 프로그램에서 시도 할 때 가로가 아닌 세로가되어야합니다. – sniurkst

+0

음, 이미 내 대답 (z 축의 가속도는 1g + - 조금 :-))입니다. –

+0

UIAccelerometer를 사용하여 휴대 전화가 어떤 위치에 있는지 알려주는 이벤트를 가져와야합니다. – Jason

1

장치의 방향을 결정하는 센서는 오류가 없으며 지능적이지 않습니다. 전화기를 테이블 위에 놓은 다음 걸어 다니면, 거꾸로 된 것을 어떻게 알 수 있습니까?

+0

이제 알았습니다. 제 경우에는 단지 그것이 테이블에 있다는 것을 알아야합니다. 어떻게해야합니까? – sniurkst