UIView에 수평선을 그려야합니다. 가장 쉬운 방법은 무엇입니까? 예를 들어 y-coord = 200에 검은 색 수평선을 그리고 싶습니다.
Interface Builder를 사용하고 있지 않습니다.
답변:
귀하의 경우 (수평선)에서 가장 쉬운 방법은 검정색 배경색과 프레임이있는 하위보기를 추가하는 것 [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()
}
}
}
이를 위해 UIBezierPath 클래스를 사용할 수 있습니다.
원하는만큼 선을 그릴 수 있습니다.
UIView 하위 클래스가 있습니다.
@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];
}
touchesBegin 메서드 :
UITouch *touch = [touches anyObject];
startPoint = [touch locationInView:self];
myPath=[[UIBezierPath alloc]init];
myPath.lineWidth = currentSliderValue*2;
dict_path = [[NSMutableDictionary alloc] init];
touchesMoved 메서드 :
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 메서드 :
NSDictionary *tempDict = [NSDictionary dictionaryWithDictionary:dict_path];
[pathArray addObject:tempDict];
[dict_path removeAllObjects];
[self setNeedsDisplay];
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
절의 이유 가 옵션에서 상자를 풀기 위한 것이라면 guard
대신 명령문 을 사용하는 것이 좋습니다.