Сохранить UIView в прозрачный PNG - PullRequest
14 голосов
/ 19 января 2011

У меня есть UIView, и я хочу, чтобы он был сохранен в виде прозрачного PNG, т.е. без цвета фона UIVIew ...

В настоящее время я использую этот код, и он работает нормально, но с цветом фона :(

UIGraphicsBeginImageContext(self.bounds.size);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage* image1 = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imageData = UIImagePNGRepresentation(image1);
[imageData writeToFile:filePath atomically:YES];

Так есть ли у кого-нибудь идеи о том, чтобы сделать это изображение прозрачным?

Заранее спасибо ..

Ответы [ 4 ]

9 голосов
/ 05 мая 2014

В моем случае я забыл непрозрачное свойство. Должно быть установлено значение NO:

view.opaque = NO;
7 голосов
/ 08 декабря 2011

Измените цвет фона на [UIColor clear], нарисуйте изображение, а затем установите цвет фона обратно на исходный цвет.

Поскольку обновления GUI будут запускаться только в следующем цикле цикла выполнения, пользователь не долженувидеть любое мерцание.

UIColor* color=self.backgroundColor;
view.backgroundColor=[UIColor clearColor];

UIGraphicsBeginImageContext(self.bounds.size);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage* image1 = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imageData = UIImagePNGRepresentation(image1);
[imageData writeToFile:filePath atomically:YES];

self.backgroundColor=color;
3 голосов
/ 03 февраля 2013

Как дополнение к ответу Гилада.На дисплее сетчатки это может вызвать некоторые проблемы с качеством.Чтобы получить контекст сетчатки, вы можете использовать этот код из этой записи.

UIColor* color=self.backgroundColor;
view.backgroundColor=[UIColor clearColor];

// This is for retina render check
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
    UIGraphicsBeginImageContextWithOptions(YourView.frame.size, NO, [UIScreen mainScreen].scale);
else
    UIGraphicsBeginImageContext(keyWindow.bounds.size);
// And it goes up to here the rest stays the same

[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage* image1 = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imageData = UIImagePNGRepresentation(image1);
[imageData writeToFile:filePath atomically:YES];

self.backgroundColor=color;
0 голосов
/ 04 декабря 2017

Для Objective-c вы должны установить opaque = NO

 + (UIImage *) imageWithView:(UIView *)view 
    {     
        UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, [[UIScreen mainScreen] scale]);     
        [view.layer renderInContext:UIGraphicsGetCurrentContext()];     
        UIImage * img = UIGraphicsGetImageFromCurrentImageContext();     
        UIGraphicsEndImageContext();     
        return img; 
    }

Для Swift вы должны установить opaque = false

func imageWithView(inView: UIView) -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(inView.bounds.size, false, 0.0)
        if let context = UIGraphicsGetCurrentContext() {
            inView.layer.render(in: context)
            let image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return image
        }
        return nil
    }
...