кажется, что вы не можете положиться на [UIDevice currentDevice].orientation
, пока ориентация не изменится в первый раз.Если это так, вы, вероятно, можете взломать его, получив необработанные показания акселерометра.
#define kUpdateFrequency 30 // Hz
#define kUpdateCount 15 // So we init after half a second
#define kFilteringFactor (1.0f / kUpdateCount)
- (void)applicationDidFinishLaunching:(UIApplication *)app
{
[UIAccelerometer sharedAccelerometer].updateInterval = (1.0 / kUpdateFrequency);
[UIAccelerometer sharedAccelerometer].delegate = self;
accelerometerCounter = 0;
...
}
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)accel
{
// Average out the first kUpdateCount readings
// acceleration_[xyz] are ivars typed float
acceleration_x = (float)accel.x * kFilteringFactor + acceleration_x * (1.0f - kFilteringFactor);
acceleration_y = (float)accel.y * kFilteringFactor + acceleration_y * (1.0f - kFilteringFactor);
acceleration_z = (float)accel.z * kFilteringFactor + acceleration_z * (1.0f - kFilteringFactor);
accelerometerCounter++;
if (accelerometerCounter == kUpdateCount)
{
[self initOrientation];
[UIAccelerometer sharedAccelerometer].delegate = nil;
}
}
- (void)initOrientation
{
// Figure out orientation from acceleration_[xyz] and set up your UI...
}
Исходный ответ:
Возвращает ли [UIDevice currentDevice].orientation
правильную ориентацию во времяapplicationDidFinishLaunching:
?Если это так, вы можете настроить свой первоначальный пользовательский интерфейс в соответствии с этой ориентацией.
Если это свойство не будет установлено до более позднего времени, вы можете попробовать поэкспериментировать с performSelector:afterDelay:
, чтобы инициализировать пользовательский интерфейс после небольшой задержки..
Этот пример кода взят из ответа Кендалла ниже, добавленного здесь для полноты:
[self performSelector:@selector(getOriented) withObject:nil afterDelay:0.0f];
Я не уверен, что задержка в ноль секунд достаточна - это означает код дляgetOriented
будет выполняться во время первого прохода цикла выполнения событий.Возможно, вам придется подождать, пока показания акселерометра зарегистрируются на UIDevice
.