我对iOS API的这些部分不熟悉,这是一些导致我无限循环的问题
最佳答案
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/