пытается нарисовать масштабированный UIImage в пользовательском представлении, но ничего не рендерится - PullRequest
0 голосов
/ 10 апреля 2010

Я создал собственный класс представления и сейчас просто хочу нарисовать изображение, масштабированное для соответствия виду, учитывая UIImage. Я попытался просто нарисовать UIImage.CGImage, но, как другие засвидетельствовали на этом сайте (и в документах), это переводит изображение вверх ногами.

Итак, при предложении ответа, который я нашел на другой вопрос, я пытаюсь нарисовать его напрямую, но в представлении ничего не отображается, и я не уверен, почему. Вот мой код для рисования:

- (void)drawRect:(CGRect)rect {
    // Drawing code
    [super drawRect:rect];

    if (self.originalImage) {
        [self drawImage];
    }
}

- (void) drawImage {
    if (CGSizeEqualToSize(originalImage.size, self.frame.size) == NO) {
        CGFloat scaleFactor = 1.0;
        CGFloat scaledWidth = 0.0;
        CGFloat scaledHeight = 0.0;
        CGPoint thumbPoint = CGPointMake(0.0, 0.0);

        CGFloat widthFactor = self.frame.size.width / originalImage.size.width;
        CGFloat heightFactor = self.frame.size.height / originalImage.size.height;

        if (widthFactor < heightFactor) {
            scaleFactor = widthFactor;
        } else {
            scaleFactor = heightFactor;
        }

        scaledWidth = originalImage.size.width * scaleFactor;
        scaledHeight = originalImage.size.height * scaleFactor;

        if (widthFactor < heightFactor) {
            thumbPoint.y = (self.frame.size.height - scaledHeight) * 0.5;
        } else if (widthFactor > heightFactor) {
            thumbPoint.x = (self.frame.size.width - scaledWidth) * 0.5;
        }

        UIGraphicsBeginImageContext(self.frame.size);
        CGRect thumbRect = CGRectZero;
        thumbRect.origin = thumbPoint;
        thumbRect.size.width = scaledWidth;
        thumbRect.size.height = scaledHeight;

        [originalImage drawInRect:thumbRect];
        self.scaledImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    } else {
        self.scaledImage = originalImage;
    }   
}

Мое понимание (после небольшого изучения) состоит в том, что функция UIGraphicsBeginImageContext создает закадровый для меня, чтобы рисовать, так что теперь, как я могу визуализировать этот контекст поверх исходного?

Ответы [ 3 ]

1 голос
/ 10 апреля 2010

Я похвалил вызовы GraphicsBegin и GraphicsEnd и рендеринг изображения - но многие вещи, которые я прочитал, указывали на то, что таким образом следует создавать графический контекст.

Если бы это были имена, то имело бы смысл называть их до и после рисования.

Но это не имена.Полные имена функций, используемые вами в вашем коде:

  • UIGraphicsBeginImageContext
  • UIGraphicsEndImageContext

Эти имена намекают на то, что эти функции предназначены для конкретного вида чертежа, а документация подтверждает это:

Эта функция используется для настройки среды рисования для рендеринга в растровое изображение.…

Хотя контекст, созданный этой функцией, является текущим контекстом, вы можете вызвать функцию UIGraphicsGetImageFromCurrentImageContext , чтобы извлечь объект изображения на основе текущего содержимого контекста.

Вот для чего предназначены эти функции: создание нового изображения путем захвата какого-либо чертежа.

Ваша ситуация иная: у вас уже есть изображение, и вы вызываете представлениерисовать.Это означает, что у вас уже есть текущий контекст , и вам нужно только нарисовать его.

Итак, не создавайте контекст - просто рисуйте.

0 голосов
/ 14 апреля 2010

Функция, которую вы назвали drawImage, должна называться createScaledImage, поскольку все, что она делает, это создает scaledImage. Чтобы нарисовать scaledImage, попробуйте

[scaledImage drawAtPoint:self.frame.origin];

Вы бы лучше обслужили, вставив originalImage или scaledImage в UIImageView с contentMode установленным в UIViewContentModeScaleAspectFit. UIImageView в основном будет делать именно то, что вы там написали, но он получает доступ к любому кешированию и быстрому рисованию, которое Apple делает за кулисами.

0 голосов
/ 10 апреля 2010

Если вы хотите нарисовать UIImage, используйте UIImageView. Это было написано, чтобы сделать это для вас.

...