Tôi cần vẽ một đường ngang trong UIView. Cách dễ nhất để làm điều đó là gì. Ví dụ, tôi muốn vẽ một đường ngang màu đen tại y-coord = 200.
Tôi KHÔNG sử dụng Trình tạo giao diện.
Tôi cần vẽ một đường ngang trong UIView. Cách dễ nhất để làm điều đó là gì. Ví dụ, tôi muốn vẽ một đường ngang màu đen tại y-coord = 200.
Tôi KHÔNG sử dụng Trình tạo giao diện.
Câu trả lời:
Cách dễ nhất trong trường hợp của bạn (đường ngang) là thêm một chế độ xem phụ với màu nền và khung màu đen [0, 200, 320, 1]
.
Mẫu mã (Tôi hy vọng không có lỗi - Tôi đã viết nó mà không có 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...
Một cách khác là tạo một lớp sẽ vẽ một đường trong phương thức drawRect của nó (bạn có thể xem mẫu mã của tôi cho điều này tại đây ).
Có thể điều này là hơi muộn, nhưng tôi muốn nói thêm rằng có một cách tốt hơn. Sử dụng UIView rất đơn giản, nhưng tương đối chậm. Phương thức này ghi đè cách chế độ xem tự vẽ và nhanh hơn:
- (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);
trước CGContextMoveToPoint(...);
?
Đây là cách bạn có thể vẽ một đường màu xám ở cuối chế độ xem của mình (cùng ý tưởng với câu trả lời của 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()
}
}
}
Bạn có thể sử dụng Lớp UIBezierPath cho việc này:
Và có thể vẽ bao nhiêu đường tùy thích:
Tôi đã phân loại UIView:
@interface MyLineDrawingView()
{
NSMutableArray *pathArray;
NSMutableDictionary *dict_path;
CGPoint startPoint, endPoint;
}
@property (nonatomic,retain) UIBezierPath *myPath;
@end
Và khởi tạo các đối tượng pathArray và dictPAth sẽ được sử dụng để vẽ đường. Tôi đang viết phần chính của mã từ dự án của riêng tôi:
- (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];
}
Phương thức touchBegin:
UITouch *touch = [touches anyObject];
startPoint = [touch locationInView:self];
myPath=[[UIBezierPath alloc]init];
myPath.lineWidth = currentSliderValue*2;
dict_path = [[NSMutableDictionary alloc] init];
Phương pháp chạm
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];
phương pháp chạm
NSDictionary *tempDict = [NSDictionary dictionaryWithDictionary:dict_path];
[pathArray addObject:tempDict];
[dict_path removeAllObjects];
[self setNeedsDisplay];
Dựa trên câu trả lời của Guy Daher.
Tôi cố gắng tránh sử dụng? vì nó có thể gây ra lỗi ứng dụng nếu GetCurrentContext () trả về nil.
Tôi sẽ không kiểm tra câu lệnh if:
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
mệnh đề chỉ là để bỏ hộp khỏi tùy chọn, hãy sử dụng một guard
câu lệnh thay thế.