このようにして、CALayerに境界線を追加できます。
[webView.layer setBorderColor: [[UIColor colorWithRed:0.6 green:0.7 blue:0.2 alpha:1] CGColor]];
[webView.layer setBorderWidth: 2.75];
しかし、片側だけに境界線を追加することは可能ですか?一番下のボーダーだけが必要です。または、他のプロパティ、たとえばフレーム、境界、マスク、...?
ご協力いただきありがとうございます!
@ Control-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-rounded-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を追加することですが、このソリューションを選択する際に考慮すべき点がいくつかあります。レイヤーのフレーム。
これらの問題を処理するオープンソースソリューションのドロップを実装し、次のような選択的な境界線を宣言できます。
myView.borderDirection = AUIFlexibleBordersDirectionRight | AUIFlexibleBordersDirectionTop;
コードを取得して、それについてさらに読むことができます here
Borderプロパティは、ビューの4辺に常に境界線を追加します。独自の描画メソッドを作成して、ビューの下部に境界線を描画できます。
しかし、UIWebViewの上にビューを追加して、境界線のように見せてみませんか?
My Swift Solution。これには、UIViewのすべての拡張機能である4つの異なる関数が含まれます。各関数は異なる境界線を追加します。
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
}
}
Swiftと同等
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)
これを行う別の方法があります。 CAShapeLayer
には、「strokeStart
」および「strokeEnd
」というプロパティがあります。ストロークが0から始まり、Originに戻ったときに1で終了し、パスが完成することを考慮して、開始と終了の値を設定して、片側に境界線を描画できます。
パスのストロークを開始する相対位置。アニメート可能。このプロパティの値は、0.0〜1.0の範囲である必要があります。このプロパティのデフォルト値は0.0です。 strokeEndプロパティと組み合わせて、このプロパティはストロークするパスのサブ領域を定義します。このプロパティの値は、ストロークを開始するパスに沿った相対ポイントを示し、strokeEndプロパティはエンドポイントを定義します。値0.0はパスの始まりを表し、値1.0はパスの終わりを表します。間の値は、パスの長さに沿って直線的に解釈されます。
例:
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
以下は、既存のUIViewに沿って境界線を適用するためのSwift 4.2で動作します。
extension UIView {
enum Side {
case top
case bottom
case left
case right
}
func addBorder(to side: Side, color: UIColor, borderWidth: CGFloat) {
let subLayer = CALayer()
subLayer.borderColor = color.cgColor
subLayer.borderWidth = borderWidth
let Origin = findOrigin(side: side, borderWidth: borderWidth)
let size = findSize(side: side, borderWidth: borderWidth)
subLayer.frame = CGRect(Origin: Origin, size: size)
layer.addSublayer(subLayer)
}
private func findOrigin(side: Side, borderWidth: CGFloat) -> CGPoint {
switch side {
case .right:
return CGPoint(x: frame.maxX - borderWidth, y: 0)
case .bottom:
return CGPoint(x: 0, y: frame.maxY - borderWidth)
default:
return .zero
}
}
private func findSize(side: Side, borderWidth: CGFloat) -> CGSize {
switch side {
case .left, .right:
return CGSize(width: borderWidth, height: frame.size.height)
case .top, .bottom:
return CGSize(width: frame.size.width, height: borderWidth)
}
}
}
そして、あなたはこれでそれを呼び出すことができます:
myView.addBorder(to: .left, color: .black, borderWidth: 2.0)
何が起こっているのか
Side
およびcolor
とともに、enumで定義されているborderWidth
を提供します。borderColor
およびborderWidth
が与えられます