0

我在 UIImageView 中的图像上绘图时遇到问题,我已经看过“在 UIImage 上绘制另一个图像”,但这只是帮助很大。这是我的场景:我有一个带有 UITableView 的 UIPopoverController,当用户位于可滚动表格视图的底部时,我想显示一个向上的三角形。

我的代码:

- (UIImage *) drawTriangleInViewForSize:(CGSize)sizeOfView
                     imageToDrawOn:(UIImage *)underImage
                           isAtTop:(BOOL)top{
CGPoint firstPoint;
CGPoint secondPoint;
CGPoint thirdPoint;

if(!top){
 //I want to draw a equilateral triangle (side length 10) in the center of the image in
 //the imageView, these are the coordinates I am using.
    firstPoint = CGPointMake(underImage.size.width * 0.5 + 5, underImage.size.height * 0.5 - 5);
    secondPoint = CGPointMake((firstPoint.x - 10), firstPoint.y);
    thirdPoint = CGPointMake(underImage.size.width * 0.5,
                             underImage.size.width * 0.5 + 5);

}
*/
**DISREGARD**
else{
    firstPoint = CGPointMake(sizeOfView.width * 0.5 + 5,
                             self.tableViewChoices.rowHeight * 0.5 - 5);
    secondPoint = CGPointMake((firstPoint.x - 10), firstPoint.y);
    thirdPoint = CGPointMake(sizeOfView.width * 0.5,
                             self.tableViewChoices.rowHeight * 0.5 + 5);
}*/
//get the size of the image for the drawInRect: method
CGFloat imageViewWidth = sizeOfView.width;
CGFloat imageViewHeight = self.tableViewChoices.rowHeight;

//set the graphics context to be the size of the image
UIGraphicsBeginImageContextWithOptions(underImage.size, YES, 0.0);

[underImage drawInRect:CGRectMake(0.0, 0.0, imageViewWidth, imageViewHeight)];

//set the line attributes
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(ctx, [UIColor blackColor].CGColor);
CGContextSetFillColorWithColor(ctx, [UIColor clearColor].CGColor);
CGContextSetLineWidth(ctx, 0.05);

UIGraphicsPushContext(ctx);
    //draw the triangle
CGContextBeginPath(ctx);
CGContextMoveToPoint(ctx, firstPoint.x, firstPoint.y);
CGContextAddLineToPoint(ctx, secondPoint.x, secondPoint.y);
CGContextAddLineToPoint(ctx, thirdPoint.x, thirdPoint.y);
CGContextAddLineToPoint(ctx, firstPoint.x, firstPoint.y);
CGContextClosePath(ctx);

UIGraphicsPopContext();

//get the image
UIImage *rslt = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return rslt;
}

我似乎无法在 imageView 中绘制到 UIImage 的三角形,最终结果要么是完全黑色的 ImageView(UIImage 只是一个 white.png),要么是 imageview 顶部的一行(取决于我是否使用drawInRect:drawAtPoint:以及我使用什么坐标)。我需要做的就是画一个向上的三角形,这并不难,而且看起来我真的是在“按照书本”做。

4

2 回答 2

2

这是我在 UIImageView 中将三角形绘制到 UIImage 上的完整代码。

//draws triangle up or down on a UIImage.
+(UIImage *) drawTriangleInViewForSize:(CGSize)sizeOfView
                     imageToDrawOn:(UIImage *)underImage
                           isAtTop:(BOOL)top
{
CGFloat rowHeight = underImage.size.height; //44; //self.tableViewChoices.rowHeight;
CGPoint firstPoint;
CGPoint secondPoint;
CGPoint thirdPoint;

CGFloat imageViewWidth = sizeOfView.width;
CGFloat imageViewHeight = rowHeight;


if(!top){
    //draw a upward facing triangle in the center of the view.
    firstPoint = CGPointMake(imageViewWidth * 0.5 + 15, imageViewHeight * 0.5 - 5);
    secondPoint = CGPointMake((firstPoint.x - 30), firstPoint.y);
    thirdPoint = CGPointMake(imageViewWidth * 0.5,
                             imageViewHeight * 0.5 + 5);

}else{
    //disregard this 'else'
    firstPoint = CGPointMake(sizeOfView.width * 0.5 + 15,
                             rowHeight * 0.5 - 5);
    secondPoint = CGPointMake((firstPoint.x - 10), firstPoint.y);
    thirdPoint = CGPointMake(sizeOfView.width * 0.5,
                             rowHeight * 0.5 + 5);

}


//get the image context with options(recommended funct to use)
//get the size of the imageView
UIGraphicsBeginImageContextWithOptions(CGSizeMake(imageViewWidth, imageViewHeight), YES, 0.0);

//use the the image that is going to be drawn on as the receiver
[underImage drawInRect:CGRectMake(0.0, 0.0, imageViewWidth, imageViewHeight)];



CGContextRef ctx = UIGraphicsGetCurrentContext();

CGContextSetLineWidth(ctx, 0.5);

//UIGraphicsPushContext(ctx);

//uses path ref
CGMutablePathRef path = CGPathCreateMutable();
//draw the triangle
CGPathMoveToPoint(path, NULL, firstPoint.x, firstPoint.y);
CGPathAddLineToPoint(path, NULL, secondPoint.x, secondPoint.y);
CGPathAddLineToPoint(path, NULL, thirdPoint.x, thirdPoint.y);
CGPathAddLineToPoint(path, NULL, firstPoint.x, firstPoint.y);
//close the path
CGPathCloseSubpath(path);
//add the path to the context
CGContextAddPath(ctx, path);
CGContextSetFillColorWithColor(ctx, [UIColor whiteColor].CGColor);
CGContextSetStrokeColorWithColor(ctx, [UIColor blackColor].CGColor);
CGContextFillPath(ctx);
CGContextAddPath(ctx, path);
CGContextStrokePath(ctx);
CGPathRelease(path);

//UIGraphicsPopContext();

//get the new image with the triangle
UIImage *rslt = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return rslt;

}
于 2013-07-29T05:35:10.947 回答
1

对于这种任务,您的代码看起来太复杂了。为什么不对UIImageView任何你想要的三角形图像使用简单?只需在底部的表格时显示它即可。

请注意,当您为您实现委托时,UITableView您还可以捕获它的UIScrollView委托消息,例如scrollView:didEndDecelerating:等等。

关于您的代码,您错过了实际的路径绘制:

CGContextAddPath(context, trianglePath);
CGContextFillPath(context);

为此,您应该使用与路径相关的功能。使用CGContext-related 函数似乎是不合适的,因为这种方法可能会删除旧路径。所以更好的方法是在上下文中创建自己的可变路径,在其中绘制三角形,然后通过上述函数将这条路径绘制到上下文中。

于 2013-07-22T06:06:14.060 回答