web-dev-qa-db-de.com

Zeichnen Sie eine Linie in UIView

Ich muss in einer UIView eine horizontale Linie zeichnen. Was ist der einfachste Weg, um es zu tun. Zum Beispiel möchte ich eine schwarze horizontale Linie bei y-Koordinate = 200 zeichnen.

Ich verwende den Interface Builder NICHT.

83
John Smith

Der einfachste Weg in Ihrem Fall (horizontale Linie) ist das Hinzufügen einer Unteransicht mit schwarzer Hintergrundfarbe und Rahmen [0, 200, 320, 1].

Codebeispiel (ich hoffe es gibt keine Fehler - ich habe es ohne Xcode geschrieben):

UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 200, self.view.bounds.size.width, 1)];
lineView.backgroundColor = [UIColor blackColor];
[self.view addSubview:lineView];
[lineView release];
// You might also keep a reference to this view 
// if you are about to change its coordinates.
// Just create a member and a property for this...

Eine andere Möglichkeit besteht darin, eine Klasse zu erstellen, die in ihrer drawRect-Methode eine Linie zeichnet (Sie können mein Codebeispiel hierfür sehen hier ).

120
Michael Kessler

Vielleicht ist das etwas spät, aber ich möchte hinzufügen, dass es einen besseren Weg gibt. Die Verwendung von UIView ist einfach, aber relativ langsam. Diese Methode überschreibt, wie die Ansicht sich selbst zeichnet und ist schneller:

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);

    // Draw them with a 2.0 stroke width so they are a bit more visible.
    CGContextSetLineWidth(context, 2.0f);

    CGContextMoveToPoint(context, 0.0f, 0.0f); //start at this point

    CGContextAddLineToPoint(context, 20.0f, 20.0f); //draw to this point

    // and now draw the Path!
    CGContextStrokePath(context);
}
310
b123400

Swift 3 und Swift 4

So können Sie am Ende Ihrer Ansicht eine graue Linie zeichnen (gleiche Idee wie bei der Antwort von b123400)

class CustomView: UIView {

    override func draw(_ rect: CGRect) {
        super.draw(rect)

        if let context = UIGraphicsGetCurrentContext() {
            context.setStrokeColor(UIColor.gray.cgColor)
            context.setLineWidth(1)
            context.move(to: CGPoint(x: 0, y: bounds.height))
            context.addLine(to: CGPoint(x: bounds.width, y: bounds.height))
            context.strokePath()
        }
    }
}
24
Guy Daher

Fügen Sie einfach ein Etikett ohne Text und mit Hintergrundfarbe hinzu. Stellen Sie die Koordinaten Ihrer Wahl sowie Höhe und Breite ein. Sie können dies manuell oder mit Interface Builder tun.

14
Phanindra

Eine andere (und noch kürzere) Möglichkeit. Wenn Sie sich in drawRect befinden, ist dies etwa wie folgt:

[[UIColor blackColor] setFill];
UIRectFill((CGRect){0,200,rect.size.width,1});
11
hkatz

Sie können die UIBezierPath-Klasse dafür verwenden:

Und Sie können so viele Linien zeichnen, wie Sie möchten:

Ich habe UIView untergeordnet:

    @interface MyLineDrawingView()
    {
       NSMutableArray *pathArray;
       NSMutableDictionary *dict_path;
       CGPoint startPoint, endPoint;
    }

       @property (nonatomic,retain)   UIBezierPath *myPath;
    @end

Und initialisiert die pathArray- und dictPAth-Objekte, die zum Strichzeichnen verwendet werden. Ich schreibe den Hauptteil des Codes aus meinem eigenen Projekt:

- (void)drawRect:(CGRect)rect
{

    for(NSDictionary *_pathDict in pathArray)
    {
        [((UIColor *)[_pathDict valueForKey:@"color"]) setStroke]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor)
        [[_pathDict valueForKey:@"path"] strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];
    }

    [[dict_path objectForKey:@"color"] setStroke]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor)
    [[dict_path objectForKey:@"path"] strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];

}

touchesBegin Methode:

UITouch *touch = [touches anyObject];
startPoint = [touch locationInView:self];
myPath=[[UIBezierPath alloc]init];
myPath.lineWidth = currentSliderValue*2;
dict_path = [[NSMutableDictionary alloc] init];

touchesMoved-Methode:

UITouch *touch = [touches anyObject];
endPoint = [touch locationInView:self];

 [myPath removeAllPoints];
        [dict_path removeAllObjects];// remove prev object in dict (this dict is used for current drawing, All past drawings are managed by pathArry)

    // actual drawing
    [myPath moveToPoint:startPoint];
    [myPath addLineToPoint:endPoint];

    [dict_path setValue:myPath forKey:@"path"];
    [dict_path setValue:strokeColor forKey:@"color"];

    //                NSDictionary *tempDict = [NSDictionary dictionaryWithDictionary:dict_path];
    //                [pathArray addObject:tempDict];
    //                [dict_path removeAllObjects];
    [self setNeedsDisplay];

touchesEnded Methode:

        NSDictionary *tempDict = [NSDictionary dictionaryWithDictionary:dict_path];
        [pathArray addObject:tempDict];
        [dict_path removeAllObjects];
        [self setNeedsDisplay];
11
Rakesh

Basierend auf der Antwort von Guy Daher.

Ich versuche die Verwendung zu vermeiden? da es zu einem Absturz der Anwendung kommen kann, wenn GetCurrentContext () den Wert nil zurückgibt.

Ich würde nicht überprüfen, ob Aussage:

class CustomView: UIView 
{    
    override func draw(_ rect: CGRect) 
    {
        super.draw(rect)
        if let context = UIGraphicsGetCurrentContext()
        {
            context.setStrokeColor(UIColor.gray.cgColor)
            context.setLineWidth(1)
            context.move(to: CGPoint(x: 0, y: bounds.height))
            context.addLine(to: CGPoint(x: bounds.width, y: bounds.height))
            context.strokePath()
        }
    }
}
0
Robert Harrold