【问题标题】:How to draw a triangle over a UIImage in a UIImageView如何在 UIImageView 中的 UIImage 上绘制三角形
【发布时间】:2013-07-22 05:47:04
【问题描述】:

我在 UIImageView 中的图像上绘图时遇到问题,我已经查看了 "Draw another image on a UIImage" 但这只是很大的帮助。这是我的场景:我有一个 UIPopoverController ,里面有一个 UITableView ,当用户位于可滚动表格视图的底部时,我想显示一个向上的三角形。

我的代码:

- (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: 以及我使用的坐标)。我需要做的就是画一个指向上方的三角形,这并不难,而且看起来我真的是在“按部就班”做。

【问题讨论】:

  • 我不确定,但我认为您必须将三角形放在它自己的视图中并将其添加到 imageView。
  • 谢谢,我会调查的。

标签: ios objective-c uiimageview uiimage cgcontextdrawimage


【解决方案1】:

这是我在 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;

}

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 你能解释一下如何使用'CGContextAddPath(context,trianglePath);'吗?在我不得不使用 CGContext 操作进行绘制的几次中,我从未使用过“CGContextAddPath()”(我只有使用 CGContext 将线条和矩形绘制到 pdf 的经验……)。感谢您的回复,如果我不能让它工作,那么我将在我的 imageView 中添加一个简单的 triangle.png。我只是想要一些CG绘图的经验。
    • 我现在看到了如何使用 CGContextAddPath() ,并意识到我忘记添加 "CGContextDrawPath(ctx, kCGPathFillStroke);"在我的代码中也...谢谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    相关资源
    最近更新 更多