代码之家  ›  专栏  ›  技术社区  ›  Ben Collins

尝试在自定义视图中绘制缩放的uiimage,但没有任何渲染

  •  0
  • Ben Collins  · 技术社区  · 16 年前

    我已经创建了一个自定义视图类,现在只想绘制一个缩放到适合视图的图像,给定一个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 回复  |  直到 16 年前
        1
  •  1
  •   Peter Hosey    16 年前

    我把电话推荐给 GraphicsBegin 和 GraphicsEnd 图像渲染-但我读到的很多东西都表明,应该用这种方式创建一个图形上下文。

    如果这些是名字,那么你需要在画之前和画之后给他们打电话。

    但那不是名字。在代码中使用的函数的全名是:

    • UIGraphicsBegin Image Context
    • UIGraphicsEnd 图像 语境

    这些名称暗示这些函数用于特定类型的绘图,并且 the documentation 支持这一点:

    使用此函数可以配置绘图环境以渲染为位图。

    当此函数创建的上下文是当前上下文时,可以调用 the UIGraphicsGetImageFromCurrentImageContext function 根据上下文的当前内容检索图像对象。

    这就是这些功能的用途:通过捕获一些图形来生成新图像。

    你的处境是不同的:你已经有了一个形象,你是一个被要求绘制的视图。这意味着 you already have a current context ,而且你只需要吸引它。

    所以,不要创建一个上下文-只是绘制。

        2
  •  0
  •   Paul Lynch    16 年前

    如果要绘制uiimage,请使用uiimageview。是为你写的。

        3
  •  0
  •   drawnonward    16 年前

    您命名drawimage的函数应该命名为create scaledimage,因为它所做的只是创建scaledimage。要绘制缩放图像,请尝试

    [scaledImage drawAtPoint:self.frame.origin];
    

    最好将originalimage或scaledimage粘贴到contentmode设置为uiviewcontentmodescalespectfit的uiimageview中。uiimageview基本上会按照您在那里编写的代码执行,但它可以访问苹果在幕后所做的任何缓存和快速绘图。