как я обнаруживаю ориентацию iPhone перед вращением

Они являются оба постоянными, но константа доступна также во время компиляции. Это означает, что один аспект различия - то, что можно использовать переменные константы в качестве входа для приписывания конструкторов, но не переменных только для чтения.

Пример:

public static class Text {
  public const string ConstDescription = "This can be used.";
  public readonly static string ReadonlyDescription = "Cannot be used.";
}

public class Foo 
{
  [Description(Text.ConstDescription)]
  public int BarThatBuilds {
    { get; set; }
  }

  [Description(Text.ReadOnlyDescription)]
  public int BarThatDoesNotBuild {
    { get; set; }
  }
}
12
задан FreeAsInBeer 20 September 2011 в 18:58
поделиться

5 ответов

Обновлено:

Итак, из обсуждения комментариев видно, что вы не можете полагаться на [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];

I ' m не уверен, достаточно ли задержки в ноль секунд - это означает, что код для getOriented будет выполняться во время первого прохода через цикл выполнения события. Возможно, вам придется подождать дольше, пока показания акселерометра не зарегистрируются на UIDevice .

3
ответ дан 2 December 2019 в 19:55
поделиться

Морт, эти ответы кажутся отвлекающим маневром; Я не понимаю, почему вы не можете использовать следующий встроенный метод для класса UIViewController:

-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {}

Этот метод вызывается автоматически после того, как произошло вращение (а не с shouldAutorotateToInterfaceOrientation, которая только сообщает вам, что это должно произойти). Удобно, что переменная fromInterfaceOrientation содержит предыдущую ориентацию. Как также говорится в документации, вы можете предположить, что для свойства interfaceOrientation представления уже была установлена ​​новая ориентация, поэтому у вас будет один метод с доступом к старой и новой ориентации!

Если я что-то пропустил и вы уже отказались от возможности использовать этот метод, мои извинения! Просто кажется странным, что вы создаете и сохраняете переменную для "

1
ответ дан 2 December 2019 в 19:55
поделиться

В ответ на ваш комментарий я подумал, что лучше разместить код здесь, чем в комментарии (хотя на самом деле Дэниел заслуживает уважения):

в applicationDidFinishLaunching:

[self performSelector:@selector(getOriented) withObject:nil afterDelay:0.0f];

Тогда вам просто нужно метод для вызова:

- (void) getOriented 
{ 
   UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
   // save orientation somewhere
}
-1
ответ дан 2 December 2019 в 19:55
поделиться

Более полный пример того, как получить ориентацию устройства по показаниям ускорителя, можно найти здесь Поскольку решение полагается на показания ускорителя, оно не будет работать на симуляторе, поэтому вам придется работать на устройстве ... я все еще ищу решение, которое работает на симуляторе.

0
ответ дан 2 December 2019 в 19:55
поделиться

В зависимости от ваших обстоятельств более простым вариантом может быть свойство interfaceOrientation класса UIViewController. Это правильно перед вращением.

12
ответ дан 2 December 2019 в 19:55
поделиться