Мой код работает нормально для обычных устройств, но создает размытые изображения на устройствах Retina.
Кто-нибудь знает решение моей проблемы?
+ (UIImage *) imageWithView:(UIView *)view
{
UIGraphicsBeginImageContext(view.bounds.size);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
Ответы:
Переключитесь с использования
UIGraphicsBeginImageContext
наUIGraphicsBeginImageContextWithOptions
(как описано на этой странице ). Передайте 0.0 для масштаба (третий аргумент), и вы получите контекст с масштабным коэффициентом, равным коэффициенту экрана.UIGraphicsBeginImageContext
использует фиксированный масштабный коэффициент 1,0, поэтому на iPhone 4 вы получаете точно такое же изображение, что и на других iPhone. Могу поспорить, что либо iPhone 4 применяет фильтр, когда вы неявно увеличиваете его, либо ваш мозг замечает, что он менее резкий, чем все вокруг.Так что я думаю:
И в Swift 4:
источник
#import <QuartzCore/QuartzCore.h>
чтобы удалитьrenderInContext:
предупреждение.UIImage
перезагрузить, но заставить версию с высоким разрешением (и вы, вероятно, столкнетесь с проблемами из-за меньшего объема оперативной памяти, доступной в pre -ретина устройства в любом случае).0.0f
для масштаба, это более приемлемо для использования[[UIScreen mainScreen] scale]
, это тоже работает.scale: The scale factor to apply to the bitmap. If you specify a value of 0.0, the scale factor is set to the scale factor of the device’s main screen.
Это явно задокументировано, поэтому, на мой взгляд, 0.0f проще и лучше.В настоящее время принятый ответ устарел, по крайней мере, если вы поддерживаете iOS 7.
Вот что вы должны использовать, если вы поддерживаете только iOS7 +:
Свифт 4:
В этой статье вы можете увидеть, что новый метод iOS7
drawViewHierarchyInRect:afterScreenUpdates:
во много раз быстрее, чемrenderInContext:
.источник
drawViewHierarchyInRect:afterScreenUpdates:
это намного быстрее. Я только что запустил профилировщик времени в инструментах. Генерация моего изображения увеличилась с 138 до 27 мс.afterScreenUpdates:
наYES
?viewDidLoad
илиviewWillAppear:
изображения будут черными; Я должен был сделать это вviewDidAppear:
. Так что я, наконец, вернулся кrenderInContext:
.Я создал расширение Swift на основе решения @Dima:
РЕДАКТИРОВАТЬ: Swift 4 улучшенная версия
Использование:
источник
class
функция, которая принимает вид?static
функция, но поскольку нет необходимости переопределять, вы можете просто изменить его наstatic
func вместоclass
.Использование современного UIGraphicsImageRenderer
источник
renderer
со старымdrawHierarchy
..?Чтобы улучшить ответы @Tommy и @Dima, используйте следующую категорию для визуализации UIView в UIImage с прозрачным фоном и без потери качества. Работаю на iOS7. (Или просто используйте этот метод в реализации, заменив
self
ссылку на ваше изображение)UIView + RenderViewToImage.h
UIView + RenderViewToImage.m
источник
@interface
и то и@implementation
другое(RenderViewToImage)
и добавить#import "UIView+RenderViewToImage.h"
в заголовок,ViewController.h
так это правильное использование? напримерUIImageView *test = [[UIImageView alloc] initWithImage:[self imageByRenderingView]]; [self addSubview:test];
?ViewController.m
был в представлении, которое я пытался визуализировать- (UIView *)testView { UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 50, 50)]; v1.backgroundColor = [UIColor redColor]; UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 150, 150)]; v2.backgroundColor = [UIColor blueColor]; [v2 addSubview:v1]; return v2; }
Свифт 3
Решение Swift 3 (на основе ответа Димы ) с расширением UIView должно выглядеть так:
источник
Встроенное расширение Swift 3.0, поддерживающее новый API iOS 10.0 и предыдущий метод.
Примечание:
!
что может привести к сбою.источник
Swift 2.0:
Используя метод расширения:
Использование:
источник
Реализация Swift 3.0
источник
Все ответы Swift 3 не сработали, поэтому я перевел наиболее приемлемый ответ:
источник
Вот расширение Swift 4 UIView, основанное на ответе @Dima.
источник
Для Swift 5.1 вы можете использовать это расширение:
источник
https://nshipster.com/image-resizing/
Поэтому убедитесь, что размер, который вы передаете,
UIGraphicsImageRenderer
это точки, а не пиксели.Если ваши изображения больше, чем вы ожидаете, вам нужно разделить ваш размер на коэффициент масштабирования.
источник
Иногда метод drawRect делает проблему, поэтому я получил эти ответы более подходящими. Вы также можете взглянуть на него. Захват UIImage из UIView застрял в методе DrawRect
источник
источник
В этом методе просто передайте объект представления, и он вернет объект UIImage.
источник
Добавьте это к методу в категорию UIView
источник