CALayer:只在一边添加边框

我可以通过这种方式向CALayer添加边框:

[webView.layer setBorderColor: [[UIColor colorWithRed:0.6 green:0.7 blue:0.2 alpha:1] CGColor]]; [webView.layer setBorderWidth: 2.75]; 

但是只能在一边添加边框吗? 我只需要在底部的边界。 或者我可以用其他属性来达到这个目的,例如框架,范围,面具……?

在这里输入图像描述

谢谢你的帮助!


b控制-V

  UIWebView *webView = [[UIWebView alloc] init]; CALayer *webViewLayer = webView.layer; // now you can do a lot of stuff like borders: [webViewLayer setBorderColor: [[UIColor greenColor] CGColor]]; [webViewLayer setBorderWidth: 2.75]; 

看一下CALayer文档: https : //developer.apple.com/documentation/quartzcore/calayer

看看这里: http : //iosdevelopertips.com/cocoa/add-round-corners-and-border-to-uiwebview.html

我用这个做了一个正确的边界:

 leftScrollView.clipsToBounds = YES; CALayer *rightBorder = [CALayer layer]; rightBorder.borderColor = [UIColor darkGrayColor].CGColor; rightBorder.borderWidth = 1; rightBorder.frame = CGRectMake(-1, -1, CGRectGetWidth(leftScrollView.frame), CGRectGetHeight(leftScrollView.frame)+2); [leftScrollView.layer addSublayer:rightBorder]; 

最简单的方法是添加一个subLayer来绘制select的边框,但是在select这个解决scheme的时候需要考虑一些事情,最大的一点是确保边界subLayer总是在最上面,并且当你改变您的图层的框架。

我在开源解决scheme中实现了一个放弃这些问题的方法,并且让你声明这样的select性边框:

 myView.borderDirection = AUIFlexibleBordersDirectionRight | AUIFlexibleBordersDirectionTop; 

你可以得到代码,并在这里阅读更多

border属性总是为你的视图的四边添加边框。 您可以使自己的绘制方法在视图的底部绘制边框。

但是,为什么不在UIWebView的上方添加一个视图,使其看起来像一个边界?

这是相当快的

 leftScrollView.clipsToBounds = true let rightBorder: CALayer = CALayer() rightBorder.borderColor = UIColor.darkGrayColor().CGColor rightBorder.borderWidth = 1 rightBorder.frame = CGRectMake(-1, -1, CGRectGetWidth(leftScrollView.frame), CGRectGetHeight(leftScrollView.frame)+2) leftScrollView.layer.addSublayer(rightBorder) 

我的Swift解决scheme。 它涉及四个不同的function,UIView的所有扩展。 每个function都添加了不同的边框。

 extension UIView { @discardableResult func addRightBorder(color: UIColor, width: CGFloat) -> UIView { let layer = CALayer() layer.borderColor = color.cgColor layer.borderWidth = width layer.frame = CGRect(x: self.frame.size.width-width, y: 0, width: width, height: self.frame.size.height) self.layer.addSublayer(layer) return self } @discardableResult func addLeftBorder(color: UIColor, width: CGFloat) -> UIView { let layer = CALayer() layer.borderColor = color.cgColor layer.borderWidth = width layer.frame = CGRect(x: 0, y: 0, width: width, height: self.frame.size.height) self.layer.addSublayer(layer) return self } @discardableResult func addTopBorder(color: UIColor, width: CGFloat) -> UIView { let layer = CALayer() layer.borderColor = color.cgColor layer.borderWidth = width layer.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: width) self.layer.addSublayer(layer) return self } @discardableResult func addBottomBorder(color: UIColor, width: CGFloat) -> UIView { let layer = CALayer() layer.borderColor = color.cgColor layer.borderWidth = width layer.frame = CGRect(x: 0, y: self.frame.size.height-width, width: self.frame.size.width, height: width) self.layer.addSublayer(layer) return self } } 

还有另一种方法做这个。 CAShapeLayer具有名为“ strokeStart ”和“ strokeEnd ”的属性。 考虑到从0开始,在到达原点的时候结束于1,从而完成path,可以设置开始和结束的值以在一侧绘制边界。

开始抚摸path的相对位置。 animation。 此属性的值必须在0.0到1.0的范围内。 该属性的默认值是0.0。 结合strokeEnd属性,此属性定义中风path的子区域。 此属性中的值指示沿着开始抚摸的path的相对点,而strokeEnd属性定义结束点。 值为0.0表示path的开始,而值为1.0表示path的结束。 中间的值沿path长度线性解释。

例:

 let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let mask = CAShapeLayer() mask.path = path.CGPath mask.strokeColor = UIColor.redColor().CGColor mask.strokeStart = 0.45 mask.strokeEnd = 0.92 self.layer.mask = mask