Как сделать снимок экрана и обрезать пустое пространство?

У меня есть приложение, которое позволяет пользователю добавлять фотографию к своей фотографии и сохранять ее как приложение для наклеек. Я настроил его, чтобы сделать снимок экрана прямо сейчас, но проблема, с которой я столкнулся, заключается в том, что он делает снимок всего UIView, поэтому на последней сохраненной фотографии в прокрутка камеры.

Как сделать снимок экрана, который вырезает пустое пространство из приложения?

Вот что у меня сейчас...

 UIGraphicsBeginImageContextWithOptions(UIScreen.mainScreen().bounds.size, false, 0);
    self.view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
    var image: UIImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
    self.savedImageAlert()
    self.dismissViewControllerAnimated(true, completion: nil)

Я поэкспериментировал с созданием границ, равных UIImageview, называемых userImageView, но это исказило мою фотографию и по-прежнему имело много белого пространства только вверху фотографии, а не сверху и снизу.

Я новичок в Swift, и мне трудно работать с CG/UIGraphics, поэтому любая помощь будет очень признательна... Я потратил часы на изучение этого и все больше и больше запутывался!

ПРИМЕЧАНИЕ/ОБНОВЛЕНИЕ. Я изменил свой код на следующее:

// Я определил myView вне обеих функций, чтобы можно было ссылаться на myView как в функции, так и в функции IBAction

   let myView = UIView()
func imageWithView(myView:UIView)->UIImage{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0.0)
    view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}

@IBAction func mergeAndSaveImage(sender: AnyObject) {
    let newImage = imageWithView(myView)
    UIImageWriteToSavedPhotosAlbum(newImage, nil, nil, nil)
    self.savedImageAlert()
    self.dismissViewControllerAnimated(true, completion: nil)

В своей раскадровке я создал новый UIView, переименовал его и перетащил два моих UIImageViews под ним в структуру документа.

Я до сих пор не могу заставить это работать, когда я сохраняю изображение, он сохраняет весь экран с пробелами и UIbuttons.

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

Во-вторых, код просто сохраняет изображение всего экрана... Я хочу, чтобы UIView, содержащий два изображения ui, сохранялся как изображение.

Вот что он сохраняет как ....

Вот что сохраняет код...


person Kate Owens    schedule 11.12.2015    source источник


Ответы (1)


Если вам удалось добавить фото внутрь какого-нибудь UIView, то этот метод может вам помочь. Вам просто нужно передать UIView здесь, и только для этого конкретного UIView он вернет объект UIImage. Это не займет другую область экрана, а только UIView, которую вы будете передавать в качестве параметра.

Таким образом, иерархия будет такой. Внутри UIView будет UIImageView, а все остальные вещи, необходимые для вашей наклейки, будут в вашем же UIView, которые будут переданы в приведенном ниже методе для получения только определенного ограниченного UIImage.

Этот UIImage можно легко сохранить или получить где угодно.

//function to convert the given UIView into an UIImage
func imageWithView(view:UIView)->UIImage{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0.0)
    view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}

и позже Вы можете сохранить только это изображение, где угодно.

UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)

EDIT:
При нажатии кнопки выполните следующее:

@IBAction func buttonAction(sender: AnyObject) {
    // you will get an UIImage object
    let image = imageWithView(yourCustomView)

    //Then save your image
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}

Вот скриншот

введите здесь описание изображения

person Rajan Maheshwari    schedule 11.12.2015
comment
Когда вы закончите изменение контекста, вы должны вызвать функцию UIGraphicsEndImageContext, чтобы очистить среду рисования растровых изображений и удалить графический контекст из верхней части стека контекстов. developer.apple.com /library/ios/documentation/UIKit/Reference/ - person Leo Dabus; 12.12.2015
comment
@LeoDabus Спасибо, отредактировал решение. - person Rajan Maheshwari; 12.12.2015
comment
Я пытаюсь подключить его к IBAction, ранее я настроил его так, чтобы при нажатии кнопки выполнялась функция. Мне сейчас трудно с этим, так как у него есть возвращаемое значение... как мне с этим справиться? Извините, если это глупый вопрос, я все еще новичок! - person Kate Owens; 13.12.2015
comment
Вам просто нужно вызвать этот метод внутри метода бездействия. - person Rajan Maheshwari; 13.12.2015
comment
Благодарю вас! Я все еще сталкиваюсь с небольшой проблемой - прямо сейчас он все еще сохраняет все пустое пространство. Возможно ли, что я передаю неправильный параметр (yourCustomView) в методе IBAction? Примечание. У меня есть два UIImageView под UIView в раскадровке (т.е. я перетащил их в структуру документа, чтобы они располагались в шахматном порядке под UIView, который я перетащил на свой контроллер представления. - person Kate Owens; 14.12.2015
comment
@KateOwens Что вы передаете в параметре? - person Rajan Maheshwari; 14.12.2015
comment
представление (в моей раскадровке я перетащил UIview и изменил его имя в структуре документа для просмотра) - person Kate Owens; 14.12.2015
comment
ну, во-первых, не меняйте имя на просмотр. Дайте любое другое имя, например myView, так как представление является именем по умолчанию для суперпредставления. Во-вторых, передайте этот myView в метод. Убедитесь, что myView содержит только изображения и т. д. - person Rajan Maheshwari; 15.12.2015
comment
Хорошо, я попробую это. Должен ли я создавать подвиды UIImage Views для UIView? Если это так, я должен сделать это программно или просто перетащив их под UIView в структуру документа? - person Kate Owens; 15.12.2015
comment
вы можете перетащить их в раскадровку внутри вашего пользовательского представления. - person Rajan Maheshwari; 15.12.2015
comment
@RajanMaheshwari Я определил myView вне обеих функций, поэтому я могу ссылаться и использовать его в предоставленной вами функции, а также в функции IBAction для нажатия кнопки ... все еще не удалось сохранить ее правильно ... - person Kate Owens; 17.12.2015
comment
let myView = UIView() func imageWithView(myView:UIView)->UIImage{ UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0.0) view.layer.renderInContext(UIGraphicsGetCurrentContext()!) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } @IBAction func mergeAndSaveImage(sender: AnyObject) { let newImage = imageWithView(myView) UIImageWriteToSavedPhotosAlbum(newImage, nil, nil, nil) self.savedImageAlert() self.dismissViewControllerAnimated(true, завершение: nil) - person Kate Owens; 17.12.2015
comment
Код @RajanMaheshwari находится в комментарии выше этого ... извините за форматирование. Это также видно в моем вопросе выше; эта часть кода находится внизу моего исходного поста. - person Kate Owens; 17.12.2015
comment
Покажите скриншоты, пожалуйста, что вы получаете и что на самом деле вы хотите - person Rajan Maheshwari; 18.12.2015
comment
@RajanMaheshwari Я добавил снимок экрана того, что сохраняется из приложения ... см. мой пост с вопросом. Вам нужно будет щелкнуть ссылку, так как я пока не могу вставлять изображения напрямую. - person Kate Owens; 18.12.2015
comment
@KateOwens А какое ожидаемое изображение вы хотите? - person Rajan Maheshwari; 19.12.2015
comment
@RajanMaheshwari ожидаемое изображение - это просто изображения в UIView ... если вы посмотрите на изображение, на которое я ссылаюсь в своем вопросе, это должно быть только изображение без пробелов на остальной части экрана и без видимых кнопок. - person Kate Owens; 19.12.2015
comment
на самом деле очень трудно сказать, какое представление содержит что. Можете ли вы задать цвет фона для представления как красный или что-то в этом роде, чтобы мы могли распознавать, что происходит. Укажите любой цвет для представления, которое вы передаете в функцию - person Rajan Maheshwari; 19.12.2015
comment
@RajanMaheshwari Я сделал фон представления синим, и он появился за двумя представлениями изображений, которые я перетащил под представление в раскадровке. Похоже, что две фотографии содержатся в синем представлении... - person Kate Owens; 05.01.2016