2015-12-11 6 views
0

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

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

Вот что я прямо сейчас ...

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, поэтому любая помощь была бы очень оценена ... Я потратил часы, исследуя это и все больше и больше сбиваясь с толку!

NOTE/UPDATE: Я изменил код на следующее:

// Я определил 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 содержал два изображения, которые нужно сохранить в качестве изображения.

Вот что это экономит ....

Here's what the code saves...

ответ

0

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

Итак, иерархия будет такой. Там будет UIImageView в пределах UIView, и все другие вещи, необходимые для вашей наклейки, будут там в вашем же 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) 
} 

Вот скриншот

enter image description here

+0

«Когда вы закончите изменения контекста, необходимо вызвать Функция UIGraphicsEndImageContext для очистки среды рисования растровых изображений и удаления графического контекста из вершина стека контекста. " https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/#//apple_ref/c/func/UIGraphicsBeginImageContextWithOptions –

+0

@LeoDabus Спасибо, Отредактировано решение. –

+0

Я пытаюсь подключить его к IBAction, ранее он был настроен так, что при нажатии кнопки функция выполнялась. У меня с этим трудное время, так как оно имеет возвращаемое значение ... как я могу справиться с этим? Извините, если это глупый вопрос, я все еще новичок! –