2013-08-06 2 views
1

내가 그 라인 UITextView 배경 줄을 텍스트와 정렬하는 방법?

CGContextBeginPath(context); 
    CGContextSetStrokeColorWithColor(context, self.horizontalLineColor.CGColor); 
    CGContextSetLineWidth(context, kDashedBorderWidth); 
    CGContextSetLineDash(context, 0, kDashedLinesLength, kDashedCount) ; 

    CGFloat baseOffset = 9.0f + self.font.descender; 
    CGFloat boundsX = self.bounds.origin.x; 
    CGFloat boundsWidth = self.bounds.size.width; 

    NSInteger firstVisibleLine = MAX(1, (self.contentOffset.y/self.font.lineHeight)); 
    NSInteger lastVisibleLine = ceilf((self.contentOffset.y + self.bounds.size.height)/self.font.lineHeight); 
    for (NSInteger line = firstVisibleLine; line <= lastVisibleLine; ++line) 
    { 
     CGFloat linePointY = (baseOffset + (self.font.lineHeight * (float)line));    
     CGContextMoveToPoint(context, boundsX, linePointY); 
     CGContextAddLineToPoint(context, boundsWidth, linePointY); 
    } 
    CGContextClosePath(context); 
    CGContextStrokePath(context); 

그리고 결과를 그리는 데 사용되는 코드는 그림에 표시됩니다 여기 , UITextView의 무승부 배경 라인입니다 시도하고 enter image description here

그것은 그것 GET처럼 보인다 첫 번째 줄은 바르게 표시되지만 다음 줄은 텍스트와 정렬되지 않습니다.

내가 여기에서 무엇을 그리워 했습니까? 현지화 설정과 관련이 있습니까?

+2

줄 높이 계산이 꺼져있는 것처럼 보입니다. 첫 번째 줄은 올바르게 정렬 되었기 때문에 처음에는 줄이 그어 지지만 텍스트의 줄 높이가 점선 줄의 줄보다 크기 때문에 줄무늬가 점점 늘어납니다. 먼저 라인 높이에 대한 계산을보고 조정할 것입니다. – garrettmurray

+0

나는'self.font.lineHeight'가 정확한 높이 값을 제공하지 않는 것 같다고 동의한다. – jAckOdE

+0

분명히 UITextView의 내부 렌더링은 라인을 레이아웃하기 위해'lineHeight' 속성을 사용하지 않았습니다. 내부적으로 어떻게 작동 하는지를 모르고 선을 정확하게 그릴 수는 없습니다. –

답변

2

몇 번의 실험을 거친 후에 실제로 lineHeight은 실제 높이보다 약간 작습니다 (약 1 포인트 크기). 여기

두 매직 넘버 난 당신이 당신의 자신의 버전을 구현하는 경우 찾을 필요가 있다고 생각이있다

CGFloat baseOffset = 7.0f + self.font.descender; 

// .... 

for (NSInteger line = firstVisibleLine; line <= lastVisibleLine; ++line) 
{ 
    CGFloat linePointY = (baseOffset + ((self.font.lineHeight + 1.0f) * (float)line));    
    CGContextMoveToPoint(context, boundsX, linePointY); 
    CGContextAddLineToPoint(context, boundsWidth, linePointY); 
} 

버전 일 경우 : 7.0f1.0f

는 주변 단지 작품이다, 나는 이것을 성취하는 더 좋은 방법을 알고 싶어합니다.

4

this을 확인할 수 있습니다.

+0

이 프로젝트를 내 드로잉 코드의 시작점으로 사용합니다. 그것은 똑같은 문제가 있습니다. – jAckOdE

+0

이 프로젝트는 좋지만 문제는 모든 타임 라인을 그립니다. 그냥 textview에 커서를 놓고 textview 프레임을 다시 그리면 uitextview의 선과 텍스트가 그대로 그려집니다. – kalpesh

1

이것은 정확한 해결책은 아니지만이 UI를 둘러싼 방법입니다. 이 UI는 밑줄 친 느낌을줍니다.

  • 는 패턴으로 점선을 제공 할 수있는 밑줄 속성을 NSAttributedString은을 사용해보십시오.

  • CoreText을 사용하면 kCTUnderlinePatternDash 속성으로보기 위에 텍스트를 그릴 수 있습니다. 당신이 필요

  • CoreText tutorial

하지만이를 사용하여 같아요

  • Can I use NSAttributedString in Core Text in iOS?

    , 우리는 기능의 같은 종류를 얻을 수 있습니다.

    희망이 도움이됩니다.

  • +0

    감사합니다. 확실히 도움이되었지만,이 길로 향하기 전에 더 쉬운 해결책을 찾고 싶습니다. – jAckOdE

    +0

    적절한 해결책을 얻었 으면 여기에도 업로드하십시오. 그래서 그것이 모두에게 도움이 될 것입니다. – Mrunal

    +0

    내 대답을 확인해 보라. 나는 내 자신의 대답을 받아 들일 수 없었다. 그래서 2 일 만에 대답했다. – jAckOdE

    관련 문제