如何在UIView上设置渐变边框?

UIView上添加一个简单的边界非常简单。 你只需链接到QuartzCore ,导入它,并使用:

 self.view.layer.borderColor = [UIColor redColor].CGColor; self.view.layer.borderWidth = 2.0f; 

我的问题是…有没有办法使这个边界使用渐变。 我知道如何将渐变遮罩应用于整个视图,而不仅仅是边界。 我假设这可能涉及到一个自定义的视图和CoreGraphics绘图内drawRect:但我不知道从哪里开始。

我不完全确定你的意思是“渐变”。 既然你已经说过你已经使用核心graphics来对graphics应用渐变,那么我会假定你的意思是(而不是前面的答案所指的阴影)。

您不能将渐变应用于边框。 但是,您可以使用自定义形状创build自己的边框。 最简单的方法是创build两个path,一个外部path和一个内部path。 为了简单起见,我们假设path是一个简单的矩形(在drawRect给出的矩形):

 UIBezierPath *path = [UIBezierPath bezierPathWithRect:rect]; 

第二条path将是比第一条path小的内部path(足以构成边界):

 //To create a 1.0f borderWidth CGRect innerRect = rect; innerRect.origin.x += 1.0f; innerRect.origin.y += 1.0f; innerRect.size.width -= 2.0f; innerRect.size.height -= 2.0f; UIBezierPath *innerPath = [UIBezierPath bezierPathWithRect:innerRect]; 

现在,将内部path附加到正常path,并确保path使用evenOddFillRule。 evenOddFillRule将告诉核心graphics只填充外部,留下内部的一部分。 哦,你会想剪辑到path:

 [path appendPath:innerPath]; path.usesEvenOddFillRule = YES; [path addClip]; 

如果对此形状应用渐变,它将填充内部path外部和外部path内部,使渐变形成边框。

UPDATE

如果你的目标iOS 5.0可能有更好的方法来做到这一点。 我发现了一个名为CGPathCreateCopyByStrokingPath()的显着的新path函数。 查看链接的细节,但基本上,它创build了一个新的path,是原来的斯托克(s),所以,如果你填充新的path,它会创build相同的图像抚摸旧path。 这太棒了,因为不是填充新的path,你可以剪裁它,然后填充一个渐变,给你一个渐变边框。 这比我之前提到的方法要容易得多,当然,它只在iOS 5.0中可用。 这也将使得创build新的复杂形状变得更容易。

我创build了第二个渐变图层,使颜色在数组中反转,然后使第二个图层的框架比第一个图层略小。 创build边框的外观。