Uiimage от UIView: выше, чем на экране разрешение? - PullRequest
18 голосов
/ 24 марта 2011

У меня есть UIView, который я отрисовываю в UIImage с помощью типичного метода UIGraphicsBeginImageContextWithOptions, используя масштаб 2,0, поэтому вывод изображения всегда будет версией «отображения сетчатки» того, что будет отображаться на экране, независимо от того, фактическое разрешение экрана пользователя.

UIView, который я рендеринг, содержит как изображения, так и текст (UIImages и UILabels). Изображение отображается в визуализированном UIImage в полном разрешении и выглядит великолепно. Но UILabels, кажется, растеризованы в масштабе 1,0, а затем увеличены до 2,0, что приводит к размытому тексту.

Есть ли что-то, что я делаю не так, или есть какой-то способ заставить текст выглядеть более четким и четким на более высоком уровне шкалы? Или есть какой-то способ сделать это, кроме использования параметра масштабирования UIGraphicsBeginImageContextWithOptions, который будет иметь лучшие результаты? Спасибо!

Ответы [ 3 ]

9 голосов
/ 28 июля 2012

Решение состоит в том, чтобы изменить метку содержимогоScale на 2, прежде чем рисовать, а затем сразу же установить обратно.Я только что запрограммировал проект, чтобы проверить его, и он отлично работает, делая 2х изображение на обычном телефоне с сетчаткой (симуляторе).[Если у вас есть публичное место, я могу его поставить, дайте мне знать.]

РЕДАКТИРОВАТЬ: расширенный код просматривает подпредставления и любые контейнеры UIViews для установки / сброса масштаба

- (IBAction)snapShot:(id)sender
{
    [self changeScaleforView:snapView scale:2];

    UIGraphicsBeginImageContextWithOptions(snapView.bounds.size, snapView.opaque, 2);
    [snapView.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    imageDisplay.image = img; // contentsScale
    imageDisplay.contentMode = UIViewContentModeScaleAspectFit;

    [self changeScaleforView:snapView scale:1];
}

- (void)changeScaleforView:(UIView *)aView scale:(CGFloat)scale
{
    [aView.subviews enumerateObjectsUsingBlock:^void(UIView *v, NSUInteger idx, BOOL *stop)
        {
            if([v isKindOfClass:[UILabel class]]) {
                v.layer.contentsScale = scale;
            } else
            if([v isKindOfClass:[UIImageView class]]) {
                // labels and images
                // v.layer.contentsScale = scale; won't work

                // if the image is not "@2x", you could subclass UIImageView and set the name of the @2x
                // on it as a property, then here you would set this imageNamed as the image, then undo it later
            } else
            if([v isMemberOfClass:[UIView class]]) {
                // container view
                [self changeScaleforView:v scale:scale];
            }       
        } ];
}
2 голосов
/ 27 марта 2011

Попробуйте выполнить рендеринг изображения с двойным размером, а затем создайте масштабированное изображение:

UIGraphicsBeginImageContextWithOptions(size, NO, 1.0);
// Do stuff
UImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

newImage=[UIImage imageWithCGImage:[newImage CGImage] scale:2.0 orientation:UIImageOrientationUp];

Где: size = realSize * scale;

0 голосов
/ 02 апреля 2011

Я боролся с такими же странностями в контексте просмотра текста и рендеринга в PDF. Я обнаружил, что есть некоторые документированные свойства объектов CALayer, которые составляют представление. Может быть, поможет настройка масштаба растеризации соответствующего (под) слоя (ов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...