UIImagePickerController cameraViewTransform работает по-разному в iOS 4 - PullRequest
6 голосов
/ 04 августа 2010

Я обновил свой iPhone и SDK до iOS 4.0.1, и теперь мое приложение работает не так, как в iOS 3.x.

Мое приложение использует UIImagePickerController с настраиваемым cameraOverlayView (который я опущу в этом посте). Главное, что мне нужно видеть камеру iphone в полноэкранном режиме. Чтобы перейти непосредственно к проблеме, я добавлю код и снимки экрана, чтобы объяснить, что происходит.

Я создал приложение на основе вида, используя проекты шаблонов XCode с именем «CameraTransform», поэтому получил два класса: CameraTransformAppDelegate и CameraTransformViewController, хорошо! В методе CameraTransformViewController s viewDidAppear я поместил следующий код:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    UIImagePickerController* picker = [[UIImagePickerController alloc] init];

    picker.sourceType = UIImagePickerControllerSourceTypeCamera;        
    picker.delegate = self;

    //[self configurePicker_FirstAttempt:picker];   Use this!
    //[self configurePicker_SecondAttempt:picker];  Use this too!

    [self presentModalViewController:picker animated:YES];
}

- (void)configurePicker_FirstAttempt:(UIImagePickerController*) picker {
    picker.showsCameraControls = NO;
    picker.navigationBarHidden = YES;

    // not needed (use defaults)
    //picker.toolbarHidden = YES;
    //picker.wantsFullScreenLayout = YES;
}

- (void)configurePicker_SecondAttempt:(UIImagePickerController*) picker {

    // Transform values for full screen support
    CGFloat cameraTransformX = 1.0;
    CGFloat cameraTransformY = 1.12412;

    picker.cameraViewTransform = CGAffineTransformScale(picker.cameraViewTransform, cameraTransformX, cameraTransformY);
}

Запуск проекта с / я получил:

Примечание:

  1. В iOS 3.x я использовал третий подход (оба метода без комментариев) для настройки средства выбора, которое отображалось в полноэкранном режиме без «черной полосы» внизу.
  2. Я проверил исходное значение picker.cameraViewTransform (до масштабирования), и для него установлено значение Идентичность (как и ожидалось).
  3. picker.view.frame установлен на границы экрана (0.0, 0.0, 320.0, 480.0)
  4. Я попытался объединить перевод в picker.cameraViewTransform (после масштабирования), например так: CGAffineTransformTranslate(picker.cameraViewTransform, 0.0, 20.0);, и я понял, что была какая-то часть "вида с камеры", которая была скрыта (возможно, это не было источником 0.0, 0.0), так что я получил больше «вида с камеры» на экране.

Похоже, что в новом SDK UIImagePickerController каким-то образом изменился, возможно, элементы управления камерой имеют разные размеры или что-то похожее.

У кого-нибудь была такая проблема?

Ответы [ 4 ]

14 голосов
/ 18 декабря 2010

ios 4.0 Магическое число 1936/320 = 6.05, 2592 / 6.05 = 428, 480-428 = 52 52 / (428/2) = 0.24299 + 1 = 1.24299

ios 3.0 Магическое число 1536/320 = 4,8 2048 / 4,8 = 427 480-427 = 53 53/427 = 0,121412 + 1 = 1,12412

То есть отношения камера-разрешение-экран-разрешение

Для iOS 3.0 cameraViewTransform применяется сверху, поэтому вы должны использовать всю высоту. Но в iOS4 он применяется от центра кадра, поэтому вы должны использовать половину высоты. И вы должны переместить рамку вниз (52/2), чтобы оставить рамку в центре.

4 голосов
/ 05 октября 2010

Я не уверен насчет iOS 3.0, но для iOS 4.0 cameraViewTransform применяется из центра кадра.Вы можете проверить это, сначала применив трансляционное преобразование.

CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 27.0);
imagePickerController.cameraViewTransform = translate;

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

CGAffineTransform scale = CGAffineTransformScale(translate, 1.125, 1.125);
imagePickerController.cameraViewTransform = scale;

Если масштабное преобразование в одиночку работает для прошивки 3 и компании, то применяются к другой узловой точке, как центр верхнего преобразования.Вы всегда должны линейно масштабироваться в обоих направлениях, иначе изображение будет перекошено.

3 голосов
/ 11 июня 2014

CGAffineTransformMakeTranslation не будет работать напрямую с cameraViewTransform. Итак, используйте CGAffineTransformScale, чтобы применить CGAffineTransformMakeTranslation.

float yOffset = 44.0;
CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, yOffset);
self.cameraFeed.cameraViewTransform = CGAffineTransformScale(translate, 1, 1);
2 голосов
/ 23 сентября 2010

Я считаю, что новое масштабное преобразование для iPhone 4 составляет ~ 1,25 (вместо ~ 1,12).

Я потратил несколько минут, пытаясь выяснить, откуда взялись эти магические числа - я полагаюмежду разрешением экрана и разрешением камеры есть какая-то связь, но я не смог понять это в спешке ...

Если кто-то ответит, пожалуйста, напишите ответ - я ненавижу магические числа.

Кстати, разрешение iPhone 4 составляет 2592x1936, а iPhone 3GS - 2048x1536.

...