Xcode 4.3 Как сохранить область экрана моего приложения?

Я создаю собственное приложение на Xcode 4.3 и развертываю его для целевой iOS 5. Приложение в основном является создателем поздравительных открыток. У меня возникли проблемы с выяснением, как сохранить часть экрана из приложения.

Я хочу сделать следующее:

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

Причина, по которой это отличается от других ответов на этом веб-сайте, заключается в том, что область, которую я хочу сохранить, состоит из 4 «элементов». Существует фоновая графика, которая является фоном наклоненной карты, затем есть текстовое поле, где пользователи могут ввести сообщение, а затем рядом с ним находится область изображения, где они могут выбрать свое собственное изображение для размещения на карте.

Вот фото того, о чем я говорю: http://marklopezdesigns.com/mydownloadz!/screenshotCard3.png

Как мне сохранить «композитный» из них в высоком разрешении?

И тогда как я могу получить это в теле сообщения электронной почты?

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

Заранее спасибо за помощь.

========

Вот решение ниже

======== ...итак, немного повозившись. Наконец-то получил то, что хотел. Вот кодовая база, которая у меня есть в моем методе, который срабатывает при нажатии кнопки «Сохранить в альбом»:

- (IBAction)savePhoto{  

CGRect rect;  
rect = CGRectMake(11,50 ,305, 262);  
UIView *cardViewer = [[UIView alloc] initWithFrame:rect];  
UIGraphicsBeginImageContext(cardViewer.bounds.size);   
//make view background transparent  
cardViewer.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.0];  
cardViewer.opaque = NO;  

//stuff items into a subview for capturing  
[self.view addSubview:cardViewer];  
[cardViewer addSubview:self.tiltedCard];  
[cardViewer addSubview:self.bigCardView];  
[cardViewer addSubview:self.cardWords];  
[cardViewer addSubview:self.photoView];  

[cardViewer.layer renderInContext:UIGraphicsGetCurrentContext()];  
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();  
UIGraphicsEndImageContext();  
CGImageRef imageRef = CGImageCreateWithImageInRect([viewImage CGImage], rect);  
UIImage *img = [UIImage imageWithCGImage:imageRef];  
CGImageRelease(imageRef);  
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);  

//put everything back where it belongs  
[self.view addSubview:self.tiltedCard];  
[self.view addSubview:self.bigCardView];  
[self.view addSubview:self.cardWords];  
[self.view addSubview:self.photoView];  

[cardViewer removeFromSuperview];  

}


person bizarro tot    schedule 20.11.2012    source источник
comment
Итак, вы хотите сделать снимок экрана с помощью Xcode или с помощью своего приложения? Если это не Xcode, пожалуйста, не притворяйтесь, что это так.   -  person    schedule 20.11.2012
comment
Я почти уверен, что ОП хочет, чтобы это было сделано программно как часть приложения.   -  person Josiah    schedule 20.11.2012
comment
Да, я хочу, чтобы это было сделано программно как часть приложения. Я предлагаю пользователю кнопку с надписью «Отправить эту карточку по электронной почте», и когда это происходит, я хочу захватить область экрана приложения и поместить ее в тело электронного письма.   -  person bizarro tot    schedule 20.11.2012


Ответы (3)


Чтобы захватить только часть экрана, укажите границы с помощью CGRectMake.

CGRect rect = CGRectMake(50, 50, 100, 100);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.view.layer renderInContext:context];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

В приведенном выше примере мы захватываем область размером 100 на 100 пикселей, начиная с x:50px и y:50px.

person Bijoy Thangaraj    schedule 21.11.2012
comment
Спасибо за помощь, Биджой. - person bizarro tot; 22.11.2012
comment
это работает: UIGraphicsBeginImageContext(self.view.bounds.size); [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CGRect прямоугольный; прямоугольник = CGRectMake(14,50,294,203); CGImageRef imageRef = CGImageCreateWithImageInRect([viewImage CGImage], rect); UIImage *img = [UIImage imageWithCGImage:imageRef]; CGImageRelease (изображениеСсылка); UIImageWriteToSavedPhotosAlbum (img, ноль, ноль, ноль); - person bizarro tot; 22.11.2012
comment
Я могу захватить нужную область с помощью кода сверху... есть ли способ не захватывать фоновое текстовое изображение из моего приложения? Я не могу обязательно ориентироваться на один слой или объект в своем представлении, потому что мне нужно составное изображение поздравительной открытки, текст, наложенный на нее, и фотография пользователя, наложенная на карту. как показано здесь: marklopezdesigns.com/mydownloadz!/screenshotCard3.png - person bizarro tot; 22.11.2012
comment
вот что смогла создать приведенная выше кодовая база: marklopezdesigns.com/mydownloadz!/almostThere.png это здорово, но мне не нужен этот загорелый фон. Этот фон — фон моего экрана приложения. Если я смогу просто захватить все, кроме этого фона, я буду «золотым». Любые идеи? - person bizarro tot; 22.11.2012
comment
@ user1657498 Теперь я понял ваш вопрос. Решение простое. Поместите только тот контент, который вам нужно захватить, в другое представление, а в приведенном выше коде вместо использования self.view.layer используйте [yourNewView.layer renderInContext:context];. Дайте мне знать, если это сработало. Спасибо... - person Bijoy Thangaraj; 22.11.2012
comment
Итак, я попытался сделать то, что вы сказали, но я все еще в замешательстве, потому что сейчас я либо снимаю пустой вид. Или я могу вставить изображение в свой новый вид изображения, как я написал ниже... но это не композиция из 3 элементов... вместо этого это один элемент (изображение). Я вставлю свой код ниже в отдельный комментарий. Я не знаю, куда идти отсюда. Я застрял ..... - person bizarro tot; 22.11.2012
comment
часть 1 (ИЗ 2) моего кода, потому что в КОММЕНТАРИЯХ есть ограничение на количество символов: CGRect rect; прямоугольник = CGRectMake(14,50,294,203); UIImageView *cardViewer = [[UIImageView alloc] initWithFrame:rect]; UIGraphicsBeginImageContext(cardViewer.bounds.size); // я не знаю, что теперь поместить в мой imageView ???? [cardViewer setImage:bigCardView.image];//это не то, что мне нужно [cardViewer.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); - person bizarro tot; 22.11.2012
comment
часть 2 (OF 2) моего кода, потому что в КОММЕНТАРИЯХ есть ограничение на количество символов: CGImageRef imageRef = CGImageCreateWithImageInRect([viewImage CGImage], rect); UIImage *img = [UIImage imageWithCGImage:imageRef]; CGImageRelease (изображениеСсылка); UIImageWriteToSavedPhotosAlbum (img, ноль, ноль, ноль); - person bizarro tot; 22.11.2012
comment
ссылка на bigCardView.image - это имя моего изображения поздравительной открытки... но если я получу этот атрибут изображения, то я не захватываю текстовое поле и фотографию пользователя, наложенную поверх этого изображения поздравительной открытки. - person bizarro tot; 22.11.2012
comment
Поместите все свои элементы управления в UIView, а затем выполните захват этого UIView. - person Bijoy Thangaraj; 23.11.2012
comment
спасибо чувак ты супер крутой. иногда такому человеку, как я, просто нужна небольшая помощь, чтобы пройти по ступенькам. Я понял!. Я отредактирую свой пост, чтобы другие могли поделиться «нашим» кодовым решением. благодаря тонну. - person bizarro tot; 23.11.2012

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

UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
person Oliver Atkinson    schedule 20.11.2012
comment
спасибо вам за ответ. Однако я уже пробовал эту кодовую базу без везения. Когда я применяю этот код, мне возвращается изображение ВСЕГО ЭКРАНА ПРИЛОЖЕНИЯ, а не произвольной области экрана ПРИЛОЖЕНИЯ. Возможно, есть способ расширить/изменить эту кодовую базу, чтобы захватить область размером 100 на 100 пикселей, например, начиная с x: 50px и y: 50px? - person bizarro tot; 21.11.2012
comment
Bijoy Thangaraj ответил на это для вас, @ user1657498 дайте мне знать, если вам все еще нужна помощь - person Oliver Atkinson; 21.11.2012

Чтобы захватить только область экрана, используйте UIView или SubView и просто укажите границы с помощью CGRectMake.

CGRect rect = CGRectMake(10, 10, 200, 200);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.YourView.layer renderInContext:context]; // Make sure here you are using the  greetingcardView rather than self.view
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Примечание. self.view будет захватывать весь экран, поэтому просто визуализируйте представление в любом месте.

person Ajay Sharma    schedule 21.11.2012