ฉันต้องการวาดเส้นแนวนอนใน UIView วิธีที่ง่ายที่สุดที่จะทำคืออะไร ตัวอย่างเช่นฉันต้องการวาดเส้นแนวนอนสีดำที่ y-Coord = 200
ฉันไม่ได้ใช้ Interface Builder
ฉันต้องการวาดเส้นแนวนอนใน UIView วิธีที่ง่ายที่สุดที่จะทำคืออะไร ตัวอย่างเช่นฉันต้องการวาดเส้นแนวนอนสีดำที่ y-Coord = 200
ฉันไม่ได้ใช้ Interface Builder
คำตอบ:
วิธีที่ง่ายที่สุดในกรณี (เส้นแนวนอน) ของคุณคือการเพิ่ม subview [0, 200, 320, 1]
กับสีพื้นหลังสีดำและกรอบ
ตัวอย่างโค้ด (ฉันหวังว่าจะไม่มีข้อผิดพลาด - ฉันเขียนโดยไม่มี Xcode):
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...
อีกวิธีหนึ่งคือการสร้างคลาสที่จะลากเส้นในเมธอด drawRect (คุณสามารถดูตัวอย่างโค้ดของฉันได้ที่นี่ )
อาจจะช้าไปหน่อย แต่ฉันต้องการเพิ่มว่ามีวิธีที่ดีกว่านี้ การใช้ UIView นั้นง่าย แต่ค่อนข้างช้า วิธีนี้จะลบล้างวิธีที่มุมมองดึงตัวเองและเร็วขึ้น:
- (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);
มาก่อนCGContextMoveToPoint(...);
?
นี่คือวิธีวาดเส้นสีเทาที่ส่วนท้ายของมุมมองของคุณ (แนวคิดเดียวกับคำตอบของ 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()
}
}
}
เพียงเพิ่มป้ายกำกับที่ไม่มีข้อความและสีพื้นหลัง กำหนดพิกัดที่คุณต้องการรวมทั้งความสูงและความกว้าง คุณสามารถทำได้ด้วยตนเองหรือด้วย Interface Builder
คุณสามารถใช้ UIBezierPath Class สำหรับสิ่งนี้:
และสามารถลากเส้นได้มากเท่าที่คุณต้องการ:
ฉันมี UIView subclassed:
@interface MyLineDrawingView()
{
NSMutableArray *pathArray;
NSMutableDictionary *dict_path;
CGPoint startPoint, endPoint;
}
@property (nonatomic,retain) UIBezierPath *myPath;
@end
และเริ่มต้นวัตถุ pathArray และ dictPAth ซึ่งจะใช้สำหรับการวาดเส้น ฉันกำลังเขียนส่วนหลักของโค้ดจากโครงการของฉันเอง:
- (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:
UITouch *touch = [touches anyObject];
startPoint = [touch locationInView:self];
myPath=[[UIBezierPath alloc]init];
myPath.lineWidth = currentSliderValue*2;
dict_path = [[NSMutableDictionary alloc] init];
วิธีการสัมผัส
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 วิธีการ:
NSDictionary *tempDict = [NSDictionary dictionaryWithDictionary:dict_path];
[pathArray addObject:tempDict];
[dict_path removeAllObjects];
[self setNeedsDisplay];
ความเป็นไปได้อีกอย่างหนึ่ง (และสั้นกว่านั้น) หากคุณอยู่ใน drawRect สิ่งต่อไปนี้:
[[UIColor blackColor] setFill];
UIRectFill((CGRect){0,200,rect.size.width,1});
จากคำตอบของ Guy Daher
ฉันพยายามหลีกเลี่ยงการใช้? เนื่องจากอาจทำให้แอปพลิเคชันหยุดทำงานได้หาก GetCurrentContext () ส่งกลับค่า nil
ฉันจะตรวจสอบว่าคำสั่ง:
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
ประโยคเป็นเพียงการ unbox จากทางเลือกให้เลือกใช้guard
คำสั่งแทน
เพิ่มป้ายกำกับโดยไม่มีข้อความและมีสีพื้นหลังขนาดเฟรมที่สอดคล้องกัน (เช่นความสูง = 1) ทำผ่านรหัสหรือในตัวสร้างอินเทอร์เฟซ