带有虚线的 UIView [英] UIView with a Dashed line
问题描述
我所拥有的:
为了创建这一行,我基本上有一个 UIView
并且我执行以下操作:
To create this line, I basically have an UIView
and I do the following:
void setLayerToLineFromAToB(CALayer *layer, CGPoint a, CGPoint b, CGFloat lineWidth)
{
CGPoint center = { 0.5 * (a.x + b.x), 0.5 * (a.y + b.y) };
CGFloat length = sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
CGFloat angle = atan2(a.y - b.y, a.x - b.x);
layer.position = center;
layer.bounds = (CGRect) { {0, 0}, { length + lineWidth, lineWidth } };
layer.transform = CATransform3DMakeRotation(angle, 0, 0, 1);
}
注意:此代码是在 stackoverflow 上找到的,所以如果有人能给我参考,我将不胜感激.
我想要的:
好的,所以我唯一"需要的是在 UIView
上创建这个模式.我知道我可以使用 Quartz2D 做到这一点(一个简单的方法可以在 这里找到一>).但我想通过操作 CALayer
而不是去绘制方法来做到这一点.为什么?由于我在 UIView
上进行了转换,我无法使用 draw
方法正确绘制.
Ok so the "only" thing I need is to create this pattern on the UIView
. I know I am able to do this using Quartz2D (a simple way to do it can be found here). But I want to do it by manipulating the CALayer
and not going to to the draw method. Why? Because of the transformation I am making on my UIView
, I am not able to draw correctly using the draw
method.
编辑 1:
只是为了说明我的问题:
Just to illustrate my problem:
通常你拥有的是 UIView
然后你基本上只是在其中画一些东西(在这种情况下是一条简单的线).我找到的摆脱灰色"区域的解决方案是不绘制某些东西,而是转换 UIView
本身.它工作得很好,如果你想要一条完整的线,当你想要一条虚线时问题就来了.
Normally what you have is UIView
and then you basically just draw something in it (in this case a simple line). The solution I found to get rid of the "gray" area, was to instead of drawing something, just transform the UIView
itself. It work well, if you want a fully filled line, the problem comes when you want a dashed one.
推荐答案
注意:Prince 的代码确实帮了我大忙,所以我会给他 +10 的提示.但最后,我添加了我自己的代码.我还将为其添加一些上下文,以便对未来的读者有用
Note: The code from Prince did really help me out, so I will give him +10 for the tips. But in the end, I add to come with my own code. I will also add some context to it, so it can be useful for future readers
最终的代码是这样的:
-(void)updateLine{
// Important, otherwise we will be adding multiple sub layers
if ([[[self layer] sublayers] objectAtIndex:0])
{
self.layer.sublayers = nil;
}
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
[shapeLayer setBounds:self.bounds];
[shapeLayer setPosition:self.center];
[shapeLayer setFillColor:[[UIColor clearColor] CGColor]];
[shapeLayer setStrokeColor:[[UIColor blackColor] CGColor]];
[shapeLayer setLineWidth:3.0f];
[shapeLayer setLineJoin:kCALineJoinRound];
[shapeLayer setLineDashPattern:
[NSArray arrayWithObjects:[NSNumber numberWithInt:10],
[NSNumber numberWithInt:5],nil]];
// Setup the path
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, beginPoint.center.x, beginPoint.center.y);
CGPathAddLineToPoint(path, NULL, endPoint.center.x, endPoint.center.y);
[shapeLayer setPath:path];
CGPathRelease(path);
[[self layer] addSublayer:shapeLayer];
}
就我而言,beginPoint 和 endPoint 可由用户使用 KVO 移动.所以当其中一个移动时:
In my case, the beginPoint and endPoint are movable by the user, by using KVO. So when one of them moves:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqual:@"position"])
{
[self updateLine];
}
}
我确实经常使用 Prince 的代码.我尝试了 draw:
方法,它在虚线之间添加了一条细线(有点奇怪......),我也尝试了 initWithFrame:
.他的代码本身未经任何修改,就会在控制台上给我这种错误:
I did play a lot with Prince's code. I tried on the draw:
method, which add a thin line between the dashed line (a bit weird...) and I also tried on initWithFrame:
. By itself his code, without any modifications, would give me this kind of errors on the console:
<Error>: CGContextSaveGState: invalid context 0x0
<Error>: CGContextSetLineWidth: invalid context 0x0
<Error>: CGContextSetLineJoin: invalid context 0x0
<Error>: CGContextSetLineCap: invalid context 0x0
<Error>: CGContextSetMiterLimit: invalid context 0x0
<Error>: CGContextSetFlatness: invalid context 0x0
<Error>: CGContextAddPath: invalid context 0x0
<Error>: CGContextDrawPath: invalid context 0x0
<Error>: CGContextRestoreGState: invalid context 0x0
这篇关于带有虚线的 UIView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!