将 UIView 显示为弧线

Posted

技术标签:

【中文标题】将 UIView 显示为弧线【英文标题】:display UIView as an arc 【发布时间】:2013-03-17 20:06:40 【问题描述】:

我想将复杂的 UI 元素显示为带有扇区的甜甜圈,因此每个扇区都可以表示为单个 UIView。 有什么方法可以将矩形 UIView 转换为弧形以适应甜甜圈轮廓?或者那是不可能的? 我完全是 ios 菜鸟,如果您指出正确的文档,我将不胜感激。

【问题讨论】:

在矩形 UIView 中画弧可以吗?那会更容易。 不行。我想实现一个新的 UI 元素,它可能类似于 UITableViewController,而是一个矩形单元格,应该有一种方法可以将任何矩形 UIView 后代插入弧形单元格。带有触摸事件,在中心旋转 对不起...没有真正关注? 我正在尝试使用 UITableViewController 行为创建 UIView 后代。但。我想将其显示为带有扇区的甜甜圈,并希望借助某种转换将任何 UIView 放置在所有者绘制的扇区中,例如 UIViewAnimations 嗯...这是非常复杂的控制。您将不得不研究标准的模型/视图编程风格。您将需要实现一个模型,该模型允许插入具有您希望它们具有的任何属性的“甜甜圈”段数据对象。然后,您将必须管理两个触摸事件以及屏幕显示。屏幕仍将使用 CGLayer 在矩形空间中绘制……有点像我在下面建议的。祝你好运,我已经回答了最初的问题,并指出了你需要考虑的文档方向。 【参考方案1】:

UIView 总是矩形的,除非你对其应用仿射变换(但我仍然认为你不能得到弧形)。我认为您最好的选择是通过子类化 UIView 并实现 drawRect 或使用 CAShapeLayer 在 UIView 内绘制弧线。

【讨论】:

是的,我想要 UIViewAnimation 转换之类的东西,以使矩形 UIView 适合自己绘制的甜甜圈视图的弧形扇区,这是真的吗?【参考方案2】:

在不知道更多关于你究竟想要做什么的情况下,我会冒险并建议你使用 CGDrawing 方法在矩形视图中绘制你的甜甜圈片段。

为此,您将特别使用以下内容:

CGPathAddArc()
CGPathAddLineToPoint()
CGPathMoveToPoint()

此代码绘制填充圆弧:

-(void)drawFilledArc:(CGContextRef)context innerRadius:(CGFloat)rIn outterRadius (CGFloat)rOut
    startAngle:(double)startAng endAngle:(double)endAng drawColor:(UIColor *)color

    float x1, y1;
    CGFloat centerX = originX;
    CGFloat centerY = originY;

    CGContextSaveGState(context);
    CGMutablePathRef path = CGPathCreateMutable();

    CGContextSetLineWidth(context, lineWidth);

    getChartWheelCoord(centerX, centerY, startAng, rIn, &x1, &y1);
    CGPathMoveToPoint(path, NULL, x1, y1);

    getChartWheelCoord(centerX, centerY, startAng, rOut, &x1, &y1);
    CGPathAddLineToPoint(path, NULL, x1, y1);

    CGPathAddArc(path, NULL, centerX, centerY, rOut, radians(-startAng), radians(-endAng), YES);

    getChartWheelCoord(centerX, centerY, endAng, rIn, &x1, &y1);
    CGPathAddLineToPoint(path, NULL, x1, y1);

    CGPathAddArc(path, NULL, centerX, centerY, rIn, radians(-endAng), radians(-startAng), NO);
    CGPathCloseSubpath(path);

    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextAddPath(context, path);
    CGContextDrawPath(context, kCGPathFillStroke);

    CGPathRelease(path);
    CGContextRestoreGState(context);

【讨论】:

在第一条评论中做了一些澄清【参考方案3】:

你可以通过以下方式实现你想要的。

1 如果您的 UI 元素不必对 Click 或 touch Events 负责,那么您可以绘制它 使用核心图形。

2 如果您的 UI 元素必须响应用户交互事件,那么您可以创建一个 UIView 并添加任意数量的自定义按钮作为 UIview 的子视图以及弧形或扇形图像(自定义按钮的图像)。

【讨论】:

我怎么能做第二个,但是有任何子视图(UIView后代)? 你能发个m d图吗?我可以给你一个示例程序 好吧,我想要这样的东西:f1.s.qip.ru/1q1ISx8F.png(不是设计师,对不起油漆:)

以上是关于将 UIView 显示为弧线的主要内容,如果未能解决你的问题,请参考以下文章

将UIVIew转换为UIImage而不显示/显示UIView

UIViews 层动画后,UIView 上的 UIPanGestureRecognizer 行为异常

在显示之前将 uiview 转换为 uiimage

我们如何将一个 UIView 设置为另一个 UIView 的掩码

在某些 VC 与其他 VC 中,如何将横幅 UIView 显示为 UINavigationController 的一部分

将 UIView 坐标从纵向转换为横向,反之亦然