Ich muss in einer UIView eine horizontale Linie zeichnen. Was ist der einfachste Weg, es zu tun. Zum Beispiel möchte ich eine schwarze horizontale Linie bei y-Koordinate = 200 zeichnen.
Ich benutze NICHT Interface Builder.
Ich muss in einer UIView eine horizontale Linie zeichnen. Was ist der einfachste Weg, es zu tun. Zum Beispiel möchte ich eine schwarze horizontale Linie bei y-Koordinate = 200 zeichnen.
Ich benutze NICHT Interface Builder.
Antworten:
In Ihrem Fall (horizontale Linie) ist es am einfachsten, eine Unteransicht mit schwarzer Hintergrundfarbe und schwarzem Rahmen hinzuzufügen [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 (mein Codebeispiel hierfür finden Sie hier ).
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 sich die Ansicht 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);
}
CGContextBeginPath(context);
vorher nicht anrufen CGContextMoveToPoint(...);
?
So können Sie am Ende Ihrer Ansicht eine graue Linie zeichnen (dieselbe Idee wie die 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()
}
}
}
Sie können die UIBezierPath-Klasse dafür verwenden:
Und kann 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 für das 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];
}
touchBegin-Methode:
UITouch *touch = [touches anyObject];
startPoint = [touch locationInView:self];
myPath=[[UIBezierPath alloc]init];
myPath.lineWidth = currentSliderValue*2;
dict_path = [[NSMutableDictionary alloc] init];
touchMoved-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];
touchEnded Methode:
NSDictionary *tempDict = [NSDictionary dictionaryWithDictionary:dict_path];
[pathArray addObject:tempDict];
[dict_path removeAllObjects];
[self setNeedsDisplay];
Basierend auf der Antwort von Guy Daher.
Ich versuche zu vermeiden, zu verwenden? weil es einen Anwendungsabsturz verursachen kann, wenn GetCurrentContext () nil zurückgibt.
Ich würde keine if-Anweisung überprüfen:
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()
}
}
}
if
Klausel nur darin besteht, die Option zu deaktivieren, verwenden Sie guard
stattdessen lieber eine Anweisung.