Programing

UITextView에서 줄 높이 설정

lottogame 2020. 12. 14. 07:46
반응형

UITextView에서 줄 높이 설정


나는 이미 공개 API로 할 수 없다고 확신하지만 여전히 묻고 싶습니다.

UITextView에서 줄 높이를 변경하는 방법이 있습니까?

정적으로 수행하는 것으로 충분하며 런타임에 변경할 필요가 없습니다. 문제는 기본 줄 높이가 너무 작다는 것입니다. 텍스트는 매우 압축 된 것처럼 보이며 긴 텍스트를 쓰려고 할 때 악몽입니다.

고마워, 맥스

편집 : 나는 그것이 있고 UIWebView멋지고 스타일링 등을 할 수 있다는 것을 알고 있습니다. 그러나 편집 할 수 없습니다 . 허용되는 줄 높이를 가진 편집 가능한 텍스트 구성 요소가 필요합니다. 너무 느리고 옳지 않다고 생각하기 때문에 Omni Frameworks의 그 것도 도움이되지 않습니다.


iOS 7 이후에는 styleString 접근 방식이 더 이상 작동하지 않습니다.

두 가지 새로운 대안을 사용할 수 있습니다.

첫째, TextKit; 강력하고 새로운 레이아웃 엔진. 줄 간격을 변경하려면 UITextView의 레이아웃 관리자의 대리자를 설정하십시오.

textView.layoutManager.delegate = self; // you'll need to declare you implement the NSLayoutManagerDelegate protocol

그런 다음이 대리자 메서드를 재정의합니다.

- (CGFloat)layoutManager:(NSLayoutManager *)layoutManager lineSpacingAfterGlyphAtIndex:(NSUInteger)glyphIndex withProposedLineFragmentRect:(CGRect)rect
{
    return 20; // For really wide spacing; pick your own value
}

둘째, iOS 7은 이제 NSParagraphStyle의 lineSpacing을 지원합니다. 이것은 예를 들어 첫 줄 들여 쓰기 및 경계 사각형 계산과 같은 더 많은 제어를 제공합니다. 그래서 또는 ...

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.headIndent = 15; // <--- indention if you need it
paragraphStyle.firstLineHeadIndent = 15;

paragraphStyle.lineSpacing = 7; // <--- magic line spacing here!

NSDictionary *attrsDictionary =
@{ NSParagraphStyleAttributeName: paragraphStyle }; // <-- there are many more attrs, e.g NSFontAttributeName

self.textView.attributedText = [[NSAttributedString alloc] initWithString:@"Hello World over many lines!" attributes:attrsDictionary];

FWIW, UITextView의 왼쪽 가장자리를 따라 텍스트를 정렬하는 이전 contentInset 메서드는 iOS7에서도 사용되지 않습니다. 대신 여백을 제거하려면 :

textView.textContainer.lineFragmentPadding = 0;

참고 : iOS7에서는 사용할 수 없습니다.


다음을 다시 구현하는 하위 클래스를 만들 수 있음을 발견했습니다 [UITextView styleString].

@interface UITextView ()
- (id)styleString; // make compiler happy
@end

@interface MBTextView : UITextView
@end
@implementation MBTextView
- (id)styleString {
    return [[super styleString] stringByAppendingString:@"; line-height: 1.2em"];
}
@end

This is not private API usage: it is just subclassing. It's possible Apple may disagree of course (though considering how we all used to swizzle everything in order to customize UIKit appearance, I feel that this kind of “private” usage is not what Apple object to), but it's such an easy way to achieve the goals of this question that you may as well try it. Should the app be rejected you can spend the (probably significant) time on a more difficult solution.


The only solution we've found and the one we've chosen: create a custom font. Sound silly but seems to be the only realistic way.


In the Attribute Inspector for the UITextView instead change the property Text to Attributed (from Plain), and click the "more" button, there you can set the line height and spacing.

UITextView's Attribute Inspector


The UITextView subclass override of styleString only works if you define a category on UITextView that defines styleString, otherwise you get a compile error. For example, in your UITextView subclass:

#import "SomeDangTextView.h"

@interface UITextView ()

- (id)styleString;

@end

@implementation SomeDangTextView

- (id)styleString {
    return [[super styleString] stringByAppendingString:@"; line-height: 1.5em"];
}

@end

According to Apple's Documentation you can use a UIWebView.

This class does not support multiple styles for text. The font, color, and text alignment attributes you specify always apply to the entire contents of the text view. To display more complex styling in your application, you need to use a UIWebView object and render your content using HTML.


This class does not support multiple styles for text. The font, color, and text alignment attributes you specify always apply to the entire contents of the text view. To display more complex styling in your application, you need to use a UIWebView object and render your content using HTML.


Use OHAttributedLabel Lib. This will solve all the problem you mentioned.

참고URL : https://stackoverflow.com/questions/3760924/set-line-height-in-uitextview

반응형