Setting multiple borders on UIView

2020-03-26 05:53发布

As I cannot find any questions/answers for this, I imagine it is not possible.

Is there anyway to set multiple borders on a UIView.

I am currently setting a standard border with .layer.borderWidth and layer.borderColor. I am wondering if I can add a multiple strokes/borders effect to the view.

I need a border of 4.0f in white then another 1.0f in another color.

5条回答
够拽才男人
2楼-- · 2020-03-26 06:12

Three solutions I can think of:

  • nest a UIView in another one, define one border for each;
  • draw the border yourself in -(void)drawRect;
  • use an UIImageView with a resizable; stretchable image of your borders as background (the best solution performance-wise).
查看更多
小情绪 Triste *
3楼-- · 2020-03-26 06:17

Try this,

I'm adding shadow with alpha 1 which will act as the inner border. And the normal border is given as outer border.

yourView.frame = CGRectInset(yourView.frame, -borderWidth, -borderWidth);
yourView.layer.borderColor = [UIColor blackColor].CGColor;
yourView.layer.borderWidth = borderWidth;


yourView.layer.shadowColor = [UIColor whiteColor].CGColor;
yourView.layer.shadowOffset = CGSizeMake(0, 1);
yourView.layer.shadowOpacity = 1;
yourView.layer.shadowRadius = 1.0;
yourView.clipsToBounds = YES;
查看更多
Summer. ? 凉城
4楼-- · 2020-03-26 06:24

You can insert two layers of different widths using this extension:

extension CALayer {
    func addGradientBorder(colors:[UIColor],width:CGFloat = 1) {
        let gradientLayer = CAGradientLayer()
        gradientLayer.frame =  CGRect(origin: CGPoint.zero, size: self.bounds.size)
        gradientLayer.startPoint = CGPoint(x:0.0, y:0.0)
        gradientLayer.endPoint = CGPoint(x:1.0,y:1.0)
        gradientLayer.colors = colors.map({$0.cgColor})

        let shapeLayer = CAShapeLayer()
        shapeLayer.lineWidth = width
        shapeLayer.path = UIBezierPath(rect: self.bounds).cgPath
        shapeLayer.fillColor = nil
        shapeLayer.strokeColor = UIColor.red.cgColor
        gradientLayer.mask = shapeLayer

        self.addSublayer(gradientLayer)
    }
}

Use this with different widths/colors to get the desired effect:

yourView.layer.addGradientBorder(colors:[UIColor.black,UIColor.black] , width: 20)
yourView.layer.addGradientBorder(colors:[UIColor.white,UIColor.white] , width: 10)

Output looks like the following image with outer white border and inner black border:

Output looks like this with outer white border and inner black border

查看更多
神经病院院长
5楼-- · 2020-03-26 06:26

This is not possible, you will have to fake borders by adding UIView's with a background color to your xib/view.

查看更多
smile是对你的礼貌
6楼-- · 2020-03-26 06:28

That isn't possible with a single UIView instance without adding layers.

What you can do is create a view that is larger than necessary, set its border appropriately, then add a CALayer and position it where you want the inner border and set its border properties appropriately.

Using CALayers is typically faster than full blown UIView, but you can also just have a nested UIView to achieve the same effect.

查看更多
登录 后发表回答