173

の周りに破線の境界線を追加するにはどうすればよいですかUIView

このようなもの

4

25 に答える 25

275

サブレイヤーが好きな場合の別の方法。カスタム ビューの init に、これを入れます (_border は ivar です)。

_border = [CAShapeLayer layer];
_border.strokeColor = [UIColor colorWithRed:67/255.0f green:37/255.0f blue:83/255.0f alpha:1].CGColor;
_border.fillColor = nil;
_border.lineDashPattern = @[@4, @2];
[self.layer addSublayer:_border];

そして、あなたのレイアウトサブビューに、これを入れてください:

_border.path = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;
_border.frame = self.bounds;
于 2013-03-06T23:49:42.313 に答える
155

以下の例のように、レイヤーとベジェパスを使用して、このパターンで境界線を設定できます。

Objective-C

CAShapeLayer *yourViewBorder = [CAShapeLayer layer];
yourViewBorder.strokeColor = [UIColor blackColor].CGColor;
yourViewBorder.fillColor = nil;
yourViewBorder.lineDashPattern = @[@2, @2];
yourViewBorder.frame = yourView.bounds;
yourViewBorder.path = [UIBezierPath bezierPathWithRect:yourView.bounds].CGPath;
[yourView.layer addSublayer:yourViewBorder];

Swift 3.1

var yourViewBorder = CAShapeLayer()
yourViewBorder.strokeColor = UIColor.black.cgColor
yourViewBorder.lineDashPattern = [2, 2]
yourViewBorder.frame = yourView.bounds
yourViewBorder.fillColor = nil
yourViewBorder.path = UIBezierPath(rect: yourView.bounds).cgPath
yourView.layer.addSublayer(yourViewBorder)

以下の例のように、パターン画像を使用してさまざまな種類のデザインを設定することもできます。

[yourView.layer setBorderWidth:5.0];
[yourView.layer setBorderColor:[[UIColor colorWithPatternImage:[UIImage imageNamed:@"DotedImage.png"]] CGColor]];///just add image name and create image with dashed or doted drawing and add here

ここでは、プロジェクトにフレームワークを追加し、ファイル<QuartzCore/QuartzCore>の以下の行でインポートする必要がありYourViewController.mます。

#import <QuartzCore/QuartzCore.h>
于 2012-12-03T09:23:38.717 に答える
29

これは、どのプロジェクトでも機能する UIView サブクラスです。ラウンドビューでも機能します。

import UIKit

class CustomDashedView: UIView {

    @IBInspectable var cornerRadius: CGFloat = 0 {
        didSet {
            layer.cornerRadius = cornerRadius
            layer.masksToBounds = cornerRadius > 0
        }
    }
    @IBInspectable var dashWidth: CGFloat = 0
    @IBInspectable var dashColor: UIColor = .clear
    @IBInspectable var dashLength: CGFloat = 0
    @IBInspectable var betweenDashesSpace: CGFloat = 0

    var dashBorder: CAShapeLayer?

    override func layoutSubviews() {
        super.layoutSubviews()
        dashBorder?.removeFromSuperlayer()
        let dashBorder = CAShapeLayer()
        dashBorder.lineWidth = dashWidth
        dashBorder.strokeColor = dashColor.cgColor
        dashBorder.lineDashPattern = [dashLength, betweenDashesSpace] as [NSNumber]
        dashBorder.frame = bounds
        dashBorder.fillColor = nil
        if cornerRadius > 0 {
            dashBorder.path = UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius).cgPath
        } else {
            dashBorder.path = UIBezierPath(rect: bounds).cgPath
        }
        layer.addSublayer(dashBorder)
        self.dashBorder = dashBorder
    }
}

このようにして、次のようにストーリーボードから編集できます。

ここに画像の説明を入力

結果のペア:

ここに画像の説明を入力

ここに画像の説明を入力

于 2019-09-24T10:23:38.537 に答える
27

スウィフト 3 :

import UIKit

class UIViewWithDashedLineBorder: UIView {

    override func draw(_ rect: CGRect) {

        let path = UIBezierPath(roundedRect: rect, cornerRadius: 0)

        UIColor.purple.setFill()
        path.fill()

        UIColor.orange.setStroke()
        path.lineWidth = 5

        let dashPattern : [CGFloat] = [10, 4]
        path.setLineDash(dashPattern, count: 2, phase: 0)
        path.stroke()
    }
}

ストーリーボードで (カスタム クラスとして) 使用するか、コードで直接使用します。

let v = UIViewWithDashedLineBorder(frame: CGRect(x: 0, y: 0, width: 100, height: 100))

結果:

ここに画像の説明を入力

于 2016-11-09T16:56:38.473 に答える
17

Prasad G が提案したものに基づいて、次のように UIImage Extras クラス内にメソッドを作成しました。

- (CAShapeLayer *) addDashedBorderWithColor: (CGColorRef) color {
    CAShapeLayer *shapeLayer = [CAShapeLayer layer];

    CGSize frameSize = self.size;

    CGRect shapeRect = CGRectMake(0.0f, 0.0f, frameSize.width, frameSize.height);
    [shapeLayer setBounds:shapeRect];
    [shapeLayer setPosition:CGPointMake( frameSize.width/2,frameSize.height/2)];

    [shapeLayer setFillColor:[[UIColor clearColor] CGColor]];
    [shapeLayer setStrokeColor:color];
    [shapeLayer setLineWidth:5.0f];
    [shapeLayer setLineJoin:kCALineJoinRound];
    [shapeLayer setLineDashPattern:
     [NSArray arrayWithObjects:[NSNumber numberWithInt:10],
      [NSNumber numberWithInt:5],
      nil]];
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:shapeRect cornerRadius:15.0];
    [shapeLayer setPath:path.CGPath];

    return shapeLayer;
}

シェイプの位置を (0,0) として定義すると、境界線の下隅が画像の中央に配置されることを指摘することが重要です。そのため、(frameSize.width/2,frameSize .高さ/2)

次に、メソッドを使用して、UIImageView の UIImage を使用して破線の境界線を取得し、UIImageView レイヤーのサブレイヤーとして CAShapeLayer を追加します。

[myImageView.layer addSublayer:[myImageView.image addDashedBorderWithColor:[[UIColor whiteColor] CGColor]]];
于 2013-02-05T00:47:37.270 に答える
16

CGContextSetLineDash() メソッドを使用します。

CGFloat dashPattern[]= {3.0, 2};

context =UIGraphicsGetCurrentContext();
CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);
// And draw with a blue fill color
CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1.0);
// Draw them with a 2.0 stroke width so they are a bit more visible.
CGContextSetLineWidth(context, 4.0);
CGContextSetLineDash(context, 0.0, dashPattern, 2);

CGContextAddRect(context, self.bounds);

// Close the path
CGContextClosePath(context);

CGContextStrokePath(context);

// Fill & stroke the path
CGContextDrawPath(context, kCGPathFillStroke);

お役に立てると思います。

于 2012-12-03T10:01:12.677 に答える
10

このためには、その特定のオブジェクトに CAShapeLayer を追加する必要があります

 CAShapeLayer * dotborder = [CAShapeLayer layer];
    dotborder.strokeColor = [UIColor redColor].CGColor;//your own color
    dotborder.fillColor = nil;
    dotborder.lineDashPattern = @[@4, @2];//your own patten 
    [codeBtn.layer addSublayer:dotborder];
    dotborder.path = [UIBezierPath bezierPathWithRect:codeBtn.bounds].CGPath;
    dotborder.frame = codeBtn.bounds;
于 2016-01-30T14:19:22.520 に答える
6

QuartzCore 回答の Swift バージョン。

import QuartzCore    

let dottedPattern = UIImage(named: "dottedPattern")
myView.layer.borderWidth = 1
myView.layer.borderColor = UIColor(patternImage: dottedPattern!).CGColor

このCAShapeLayerアプローチは機能しますが、QuartzCore アプローチはUIView、セル内にある場合、Table View のリロードの処理に適しています。

画像の場合、次のようなものを使用できます(非常に小さいです):

ここに画像の説明を入力

PNG よりもベクトルを優先する傾向があります。

  • Sketch 内で、4x4 ピクセルの長方形を作成します。
  • これを合計4つ作る
  • それらを四角形にグループ化し、色を交互に並べる
  • グループを PDF としてエクスポート
  • 内で、呼ばれる dotPatternImages.xcassetsを作成しますNew Image Set
  • Scale Factorsをに変更Single Vector
  • PDFをドロップ
于 2015-09-18T15:47:14.633 に答える
4

これは、Swift 2で必要な場合です

func addDashedLineBorderWithColor(color:UIColor) {
    let _ = self.sublayers?.filter({$0.name == "DashedBorder"}).map({$0.removeFromSuperlayer()})
    let  border = CAShapeLayer();
    border.name = "DashedBorder"
    border.strokeColor = color.CGColor;
    border.fillColor = nil;
    border.lineDashPattern = [4, 4];
    border.path = UIBezierPath(rect: self.bounds).CGPath
    border.frame = self.bounds;
    self.addSublayer(border);

}
于 2015-11-18T15:56:03.507 に答える