ios UIView에서 선 그리기




ios 원 그리기 (7)

UIView에 가로선을 그려야합니다. 가장 쉬운 방법은 무엇입니까? 예를 들어 y-coord = 200에 검정색 가로선을 그립니다.

인터페이스 빌더를 사용하지 않습니다.


Answer #1

다른 하나 (그리고 더 짧은) 가능성. drawRect 내부에 있다면 다음과 같이됩니다 :

[[UIColor blackColor] setFill];
UIRectFill((CGRect){0,200,rect.size.width,1});

Answer #2

스위프트 3 및 스위프트 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()
        }
    }
}

Answer #3

당신은 이것을 위해 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];

}

touches 시작 방법 :

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

Answer #4

가장 쉬운 방법은 검은 배경 색상과 프레임 [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 메서드에 선을 그릴 클래스를 만드는 것입니다 ( here 내 코드 샘플을 볼 수 here ).


Answer #5

어쩌면 조금 늦은 것일 수도 있지만 더 좋은 방법이 있다는 것을 덧붙이고 싶습니다. 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);
}

Answer #6

가이 도허의 대답을 기반으로합니다.

나는 사용을 피하려고합니까? 왜냐하면 GetCurrentContext ()가 nil을 반환하면 응용 프로그램이 중단 될 수 있기 때문입니다.

나는 성명서 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()
        }
    }
}

Answer #7

텍스트없이 배경색에 해당 프레임 크기 (예 : 높이 = 1)의 레이블을 추가하십시오. 코드 또는 인터페이스 빌더를 통해 수행하십시오.





uiview