[ios] UIView에서 선 그리기

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);
}


답변

Swift 3 및 Swift 4

이것은 뷰 끝에 회색 선을 그리는 방법입니다 (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 클래스를 사용할 수 있습니다.

원하는만큼 선을 그릴 수 있습니다.

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];


답변

다른 하나 (그리고 더 짧은) 가능성. 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()
        }
    }
}