UIGraphicsBeginImageContext

UIGraphicsBeginImageContext

我对iOS API的这些部分不熟悉,这是一些导致我无限循环的问题

  • 为什么..BeginImageContext有一个大小,但是..GetCurrentContext没有一个大小?如果..GetCurrentContext没有大小,它将在哪里绘制?有什么界限?
  • 为什么它们必须具有两个上下文,一个用于图像,一个用于常规图形?图像上下文已经不是图形上下文了吗?分离的原因是什么(我想知道我不知道的原因)
  • 最佳答案

    UIGraphicsGetCurrentContext()返回对当前图形上下文的引用。它不会创建一个。要记住这一点很重要,因为如果您以这种方式查看它,则将看到它不需要size参数,因为当前上下文只是创建图形上下文所用的大小。
    UIGraphicsBeginImageContext(aSize)用于在UIView的drawRect:方法之外的UIKit级别上创建图形上下文。

    在这里您将使用它们。

    如果您有UIView的子类,则可以重写它的drawRect:方法,如下所示:

    - (void)drawRect:(CGRect)rect
    {
        //the graphics context was created for you by UIView
        //you can now perform your custom drawing below
    
        //this gets you the current graphic context
        CGContextRef ctx = UIGraphicsGetCurrentContext();
    
        //set the fill color to blue
        CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor);
    
        //fill your custom view with a blue rect
        CGContextFillRect(ctx, rect);
    }
    

    在这种情况下,您无需创建图形上下文。它是为您自动创建的,并允许您在drawRect:方法中执行自定义绘图。

    现在,在另一种情况下,您可能想在drawRect:方法之外执行一些自定义绘图。在这里您将使用UIGraphicsBeginImageContext(aSize)
    您可以执行以下操作:
    UIBezierPath *circle = [UIBezierPath
                            bezierPathWithOvalInRect:CGRectMake(0, 0, 200, 200)];
    
    UIGraphicsBeginImageContext(CGSizeMake(200, 200));
    
    //this gets the graphic context
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    //you can stroke and/or fill
    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
    CGContextSetFillColorWithColor(context, [UIColor lightGrayColor].CGColor);
    [circle fill];
    [circle stroke];
    
    //now get the image from the context
    UIImage *bezierImage = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    UIImageView *bezierImageView = [[UIImageView alloc]initWithImage:bezierImage];
    

    我希望这可以帮助您解决问题。另外,您应该使用UIGraphicsBeginImageContextWithOptions(size,opaque,scale)。有关带有图形上下文的自定义绘图的进一步说明,请参见我的答案here

    关于ios - UIGraphicsGetCurrentContext与UIGraphicsBeginImageContext/UIGraphicsEndImageContext,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21785254/

    10-10 21:12