2013-01-16 2 views
5

4 개의 UITextview를 사용하여 각 단락을 배치했습니다. 이제 각 UITextview에 대해 UIButton을 하위보기로 추가하려고합니다.UILable/UITextView의 마지막 문자 옆에 서브 뷰로 단추 배치

CGRectMake(textview.frame.width-50,textview.frame.height-20,50,20) 프레임을 사용하여 하위 뷰를 만드는 것이 이상적인 솔루션이 아닙니다. 문장이 어디서든 끝날 수 있기 때문에 어떤 단락의 마지막 문자가 어디서든 끝날 수 있기 때문에 그 위치는 일정하지 않습니다.

그래서 결론은 단어 옆에 UITextView 안에 UIButton을 추가하고 싶습니다. 어떻게해야합니까?

모든 해결책은 크게 감사하겠습니다. :)

답변

5

너무 간단하지 않습니다. 사용 :

CGSize sizeOfString = [string sizeWithFont:self.aTextView.font constrainedToSize:self.aTextView.frame.size]; 

당신은 주어진 문자열에 대한 CGSize를 얻을 수 있습니다. 그러나 전체 문자열을 지정하면 크기가 UITextView 크기와 같아집니다 (오른쪽 하단).

각 UITextField의 마지막 줄에서이 메서드를 사용해야합니다. 어려운 부분. 단어 감싸기는 CoreText에 의해 수행됩니다. UITextView 또는 UILabel은 단일 행, 위치 등에 대한 정보를 제공하지 않습니다.

비슷한 것을 수행하여 직접 계산해야합니다 (코드가 너무 깨끗하지 않습니다. 당신은 문제가 이해가 나중에 경우 LL 도움말) : 이제

NSAttributedString* text = self.aTextView.attributedText; 
CTFramesetterRef fs = 
CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)text); 
CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddRect(path, NULL, CGRectMake(0,0,self.aTextView.frame.size.width - 16,100000)); // why the -16? the frame should be the REAL TEXT FRAME, not the UITextView frame. If you look, there is a space between the view margin and the text. This is the baseline. Probably there is a method to calculate it programatically, but I can't check now. In my case it seems like 8px (*2) 
CTFrameRef f = CTFramesetterCreateFrame(fs, CFRangeMake(0, 0), path, NULL); 
CTFrameDraw(f, NULL); 

NSRange lastRange; 
NSArray* lines = (__bridge NSArray*)CTFrameGetLines(f); 

id lastLineInArray = [lines lastObject]; 
CTLineRef theLine = (__bridge CTLineRef)lastLineInArray; 
CFRange range = CTLineGetStringRange(theLine); 
lastRange.length = range.length; 
lastRange.location = range.location - 1; 
NSLog(@"%ld %ld", range.location, range.length); 

CGPathRelease(path); 
CFRelease(f); 
CFRelease(fs); 

// this is the last line 
NSString *lastLine = [self.aTextView.text substringWithRange:lastRange]; 

, 당신은 사용할 수 있습니다

CGSize sizeOfString = [lastLine을 sizeWithFont : self.aTextView.font constrainedToSize : self.aTextView.frame.size]

는 폭 및 문자열의 높이 및 다음 버튼의 최종 위치를 얻을 것이다

(y 좌표를 들어 : 라인 어레이 카운트 * 문자열 높이에서 촬영 행수)

편집하십시오 UITextView에서 왼쪽 공간 텍스트가 UITextView 안에 정말하지 않기 때문에 그런 일이 (이 라인에서 -16이 이유)

CGPathAddRect(path, NULL, CGRectMake(0,0,self.aTextView.frame.size.width - 16,100000)); 

에 대해 언급하지만, 그 파단 중 하나 내부 : UIWebDocumentView (개인 클래스)를 추가합니다. 일부 검색 후에는 CGPathAddRect() 함수에 올바른 rect를 전달하는 데 필요한이 인세 트의 값을 (합법적으로) 얻는 방법을 찾을 수 없습니다. 몇 가지 테스트를 통해 항상 8pt인지 확인하십시오 :-) 또는 콘텐츠 삽입물이없는 UILabel로 전환하십시오.

+0

예, UILabel을 사용하는 경우 -16이 필요하지 않습니다. 여백 공간이 경우 ;-) 당신이 당신의 문제를 해결 듣고 행복하게! 해피 코딩 ;-) – LombaX

0

UIWebView 또는 이러한 기능을 지원하는 제 3 자의 특성있는 텍스트보기를 사용해야합니다.

UITextView는 내부적으로 웹보기를 사용하므로 텍스트의 정확한 레이아웃을 파악하는 것이 중요합니다.

-2

내가 생각하기에, 그 좋은 방법 tableView를 사용합니다. 하나의 셀에 한 단락. 테두리없이 셀을 만들고 셀 배경에 clearColor를 설정합니다. 이 방법으로 버튼을 쉽게 추가 할 수 있습니다.

관련 문제