UIImagePickerController: правильный способ показать полноэкранную камеру? [Дубликат]

Вы можете использовать array_filter(), который отлично работает для всех ситуаций:

$ray_state = array_filter($myarray);

if (empty($ray_state)) {
    echo 'array is empty';
} else {
    echo 'array is not empty';
}
56
задан kubi 27 April 2010 в 00:06
поделиться

11 ответов

Соотношение сторон камеры составляет 4: 3, а соотношение сторон экрана равно 3: 2. Таким образом, изображение камеры не может просто заполнить экран, если вы не хотите обрезать до 3: 2. Для этого примените соответствующее преобразование шкалы.

37
ответ дан Ole Begemann 21 August 2018 в 06:02
поделиться
  • 1
    Это было именно это. Благодаря! Я собираюсь обновить свой вопрос кодом, в котором все работает. – kubi 27 April 2010 в 00:02
  • 2
    У кого-нибудь есть ответ на этот вопрос, который будет работать на всех устройствах? Масштабирование с приведенными выше факторами приведет к искажению изображения и масштабированию с помощью ЛЮБОГО жестко закодированного номера будет работать только на устройстве с одинаковым форм-фактором и системой координат. Есть ли способ найти рамку и рамки просмотра камеры и приспособиться к границам окна? – George 18 September 2012 в 20:31
  • 3
    Это работает для меня. stackoverflow.com/a/23625383/2315453 – arunit21 4 September 2014 в 11:15

Я использовал этот метод для вычисления шкалы.

// get the screen size
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
// establish the height to width ratio of the camera
float heightRatio = 4.0f / 3.0f;
// calculate the height of the camera based on the screen width
float cameraHeight = screenSize.width * heightRatio;
// calculate the ratio that the camera height needs to be scaled by
float scale = screenSize.height / cameraHeight;
imagePicker.cameraViewTransform = CGAffineTransformMakeScale(scale, scale);
3
ответ дан Ali Gangji 21 August 2018 в 06:02
поделиться

моя проблема решена:)

//Camera is 426 * 320. Screen height is 568.  Multiply by 1.333 in 5 inch (iPhone5) to fill vertical

CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 71.0); //This slots the preview exactly in the middle of the screen by moving it down 71 points
self.imagePickerController.cameraViewTransform = translate;

CGAffineTransform scale = CGAffineTransformScale(translate, 1.333333, 1.333333);
self.imagePickerController.cameraViewTransform = scale;
2
ответ дан arunit21 21 August 2018 в 06:02
поделиться

Преобразовать его с помощью этого:

#define CAMERA_TRANSFORM                    1.12412

_picker.wantsFullScreenLayout = YES;
_picker.cameraViewTransform = CGAffineTransformScale(_picker.cameraViewTransform, CAMERA_TRANSFORM, CAMERA_TRANSFORM);
10
ответ дан emenegro 21 August 2018 в 06:02
поделиться

Из моего опыта работы с iOS 7, iphone 5S, чтобы увидеть центр изображения в полноэкранном режиме, вы должны конкатенировать преобразования, а не делать их последовательно:

pickerController.cameraOverlayView = self.view;

CGSize screenSize = [[UIScreen mainScreen] bounds].size;   // 320 x 568

float scale = screenSize.height / screenSize.width*3/4;  // screen height divided by the pickerController height ... or:  568 / ( 320*4/3 )

CGAffineTransform translate=CGAffineTransformMakeTranslation(0,(screenSize.height - screenSize.width*4/3)*0.5);
CGAffineTransform fullScreen=CGAffineTransformMakeScale(scale, scale);
pickerController.cameraViewTransform =CGAffineTransformConcat(fullScreen, translate);
10
ответ дан Enrico Cupellini 21 August 2018 в 06:02
поделиться
  • 1
    Почему преобразование преобразует пользователя size.height - size.width? – Guy Chen 5 October 2014 в 12:22
  • 2
    на самом деле это (screenSize.height - высота pickerController) * 0,5 на самом деле screenSize.width * 4/3 равно pickerController's height – Enrico Cupellini 6 October 2014 в 20:10

Это работало для меня на iOS 10:

let screenSize = UIScreen.main.bounds.size
let cameraAspectRatio = CGFloat(4.0 / 3.0)
let cameraImageHeight = screenSize.width * cameraAspectRatio
let scale = screenSize.height / cameraImageHeight
imagePickerController.cameraViewTransform = CGAffineTransform(translationX: 0, y: (screenSize.height - cameraImageHeight)/2)
imagePickerController.cameraViewTransform = imagePickerController.cameraViewTransform.scaledBy(x: scale, y: scale)
3
ответ дан Furkan Fidan 21 August 2018 в 06:02
поделиться

И вот ответ в Swift.

let screenSize:CGSize = UIScreen.mainScreen().bounds.size

let ratio:CGFloat = 4.0 / 3.0
let cameraHeight:CGFloat = screenSize.width * ratio
let scale:CGFloat = screenSize.height / cameraHeight

let imag:UIImagePickerController = UIImagePickerController()
imag.cameraViewTransform = CGAffineTransformMakeTranslation(0, (screenSize.height - cameraHeight) / 2.0)
imag.cameraViewTransform = CGAffineTransformScale(imag.cameraViewTransform, scale, scale)
4
ответ дан M.Othman 21 August 2018 в 06:02
поделиться
PickerViewController.m    
#define CAMERA_TRANSFORM  1.8

- (void)viewDidAppear:(BOOL)animated
{
 if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {
       // type = UIImagePickerControllerSourceTypeCamera;

        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.allowsEditing = NO;
        picker.delegate   = self;
        picker.sourceType = UIImagePickerControllerSourceTypeCamera;
        picker.showsCameraControls=NO;
        picker.extendedLayoutIncludesOpaqueBars = YES;
        picker.cameraViewTransform = CGAffineTransformScale(picker.cameraViewTransform, CAMERA_TRANSFORM , CAMERA_TRANSFORM);

        [self presentViewController:picker animated:YES completion:nil];
    }else{

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Message"
                                                        message:@"Device have no camera"
                                                       delegate:self
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
    }
}
0
ответ дан Matt 21 August 2018 в 06:02
поделиться

Попробуйте использовать этот код:

picker.wantsFullScreenLayout = YES;
CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 71.0);
CGAffineTransform scale = CGAffineTransformScale(translate, 1.333333, 1.47);
picker.view.transform = scale;
0
ответ дан objectively C 21 August 2018 в 06:02
поделиться

Масштабирование по фиксированному значению не является хорошей идеей ... поскольку я уверен, что любой, кто использовал принятый ответ, вероятно, узнал, когда вышел iPhone 5.

Вот фрагмент кода для динамического масштабирования на основе разрешения экрана, чтобы исключить буквенный бокс.

// Device's screen size (ignoring rotation intentionally):
CGSize screenSize = [[UIScreen mainScreen] bounds].size;

// iOS is going to calculate a size which constrains the 4:3 aspect ratio
// to the screen size. We're basically mimicking that here to determine
// what size the system will likely display the image at on screen.
// NOTE: screenSize.width may seem odd in this calculation - but, remember,
// the devices only take 4:3 images when they are oriented *sideways*.
float cameraAspectRatio = 4.0 / 3.0;
float imageWidth = floorf(screenSize.width * cameraAspectRatio);
float scale = ceilf((screenSize.height / imageWidth) * 10.0) / 10.0;

self.ipc.cameraViewTransform = CGAffineTransformMakeScale(scale, scale);
51
ответ дан Steve 21 August 2018 в 06:02
поделиться
  • 1
    Я все еще получаю черную линию внизу при использовании iPhone 5 .. – Danpe 13 October 2013 в 19:38
  • 2
    @Danpe, вы могли найти решение для iPhone 5? У меня такая же проблема - спасибо! – daspianist 26 December 2013 в 18:44
  • 3
    Благодарю. работает для меня на iPhone 5 – kevinl 12 February 2014 в 23:11
  • 4
    @steve, не могли бы вы взглянуть на это для iPhone 6 / iPhone 6Plus, пожалуйста, это еще не совсем заполняет экран. Простой проект с загрузкой imagepicker в контроллере родительского представления в качестве теста с этим скопированным и вставленным кодом даст те же результаты, что и мои. Пожалуйста, вернись к нам, ура. – Pavan 25 December 2014 в 06:34
  • 5
    Масштабирование не работает на iOS 10 beta 7 для меня. Любая помощь или идеи? – Rashmi Ranjan mallick 24 August 2016 в 13:37

Эй, я видел, что некоторые люди все еще получали черную полосу внизу, вычисляя масштаб для iPhone 5. У меня была эта проблема на некоторое время, но потом я понял, что вам нужно перевести представление так, чтобы оно было посередине экрана, а затем применить масштаб. Вот мой код для выполнения этих двух вещей, и он работает для меня!

    CGSize screenBounds = [UIScreen mainScreen].bounds.size;

    CGFloat cameraAspectRatio = 4.0f/3.0f;

    CGFloat camViewHeight = screenBounds.width * cameraAspectRatio;
    CGFloat scale = screenBounds.height / camViewHeight;

    m_imagePickerController.cameraViewTransform = CGAffineTransformMakeTranslation(0, (screenBounds.height - camViewHeight) / 2.0);
    m_imagePickerController.cameraViewTransform = CGAffineTransformScale(m_imagePickerController.cameraViewTransform, scale, scale);
19
ответ дан strikerdude10 21 August 2018 в 06:02
поделиться
  • 1
    Это решение отлично работает на iPhone 5. Однако, как сообщалось в этом вопросе , CGAffineTransformTranslate не работает в UIImagePickerController со старыми iOS (не уверен, когда они исправили его). Кроме того, кажется, что вам нужно сделать трюк ceilf в ответе Стива, чтобы CGAffineTransformScale работал в более ранних версиях iOS. – sffc 5 January 2014 в 13:59
  • 2
    Вы правы, я должен был добавить «iPhone 5 под управлением iOS 7». Я некоторое время тянул свои волосы, когда CGAffineTransformScale не работал в более старых iOS. – strikerdude10 6 January 2014 в 21:49
  • 3
    Отлично работает. Сохранено много времени. – Azik Abdullah 24 December 2014 в 14:42
  • 4
    Это сработало для меня на iPhone 6 – Epic Byte 20 May 2015 в 18:08
  • 5
    @ strikerdude10 Спасибо большое приятель! – Sam 1 July 2015 в 13:13
Другие вопросы по тегам:

Похожие вопросы: