NSScrollView의 높이를 입력 문자 수에 따라 변경
개요
아래와 같이 입력한 문자수에 따라 NSScrollView와 윈도우의 높이가 바뀌는 것과 같은 것을 작성한다
GitHub
NSTextView의 커스텀 클래스 생성 및 설정
NSTextView의 커스텀 클래스 생성 및 설정
텍스트가 변경되었을 때의 처리
// テキストの変更時に呼ばれる
- (void)didChangeText
{
[self updateScrollViewHeight]; // TextViewの含まれるNSSCrollViewのframeのheightを更新する
[self.delegate ChangeableHeightTextViewDidChange]; // 呼び出し元のWindowControllerでウィンドウの高さを変更する
}
NSTextView
메서드 didChangeText
overrideNSTextView
포함 NSSCrollView
의 높이 업데이트(이 클래스에서 처리)NSTextView
는 자동으로 크기가 바뀌는 것 같습니다.NSSCrollView의 높이 업데이트
static const int kInitialStringHeight = 19; // 1行目の文字列の高さ
static const int kSingleByteStringHeight = 14; // 非日本語文字列の高さ(FontSiZeが12のとき)
//static const int kMultiByteStringHeight = 18; // 日本語文字列の高さ (FontSiZeが12のとき)
static const int kMaximumLineNum = 100; // この行数以上では高さを変更しない
/**
@brief NSTextViewの含まれるNSSCrollViewのframeのheightを更新する
*/
- (void)updateScrollViewHeight {
// Calculate height
NSUInteger numberOfLines = [self numberOfLines];
NSUInteger height = 0;
if (numberOfLines <= kMaximumLineNum) {
height = kInitialStringHeight + (numberOfLines - 1) * kSingleByteStringHeight; // 1行目の高さは固定としている
if (height < kInitialStringHeight) {
height = kInitialStringHeight; // 最低の幅を設定
}
}
// Update height
NSScrollView *scrollView = (NSScrollView *) self.superview.superview;
NSRect frame = scrollView.frame;
frame.size.height = height;
scrollView.frame = frame; // 実際のNSScrollViewのframeを更新
}
// Calculate height
NSUInteger numberOfLines = [self numberOfLines];
NSUInteger height = 0;
if (numberOfLines <= kMaximumLineNum) {
height = kInitialStringHeight + (numberOfLines - 1) * kSingleByteStringHeight; // 1行目の高さは固定としている
if (height < kInitialStringHeight) {
height = kInitialStringHeight; // 最低の幅を設定
}
}
NSString 반각·전각의 판정 당을 참고로 하면 구현은 가능할 것 같다.
// Update height
NSScrollView *scrollView = (NSScrollView *) self.superview.superview;
NSRect frame = scrollView.frame;
frame.size.height = height;
scrollView.frame = frame; // 実際のNSScrollViewのframeを更新
NSTextView
포함 NSSCrollView
의 프레임을 여기에서 직접 업데이트height
를 사용하여 NSScrollView
의 frame
높이 업데이트 self.superview.superview.frame.size.height = height;
Expression is not assignable
와 오류가 발생했습니다. iOS 개발: “Expression is not assignable.”오류을 참조하여 한 방석을 넣어 쓰고있다.
"myLabel.frame"은 속성에 대한 액세스이고 "frame.size"는 구조체 멤버에 대한 액세스입니다. 이것을 혼합하고 있기 때문에 에러가 되고 있다.
NSTextView 문자열의 행 수 계산
/**
@brief NSTextViewの文字列の行数を計算する
*/
- (NSInteger)numberOfLines {
NSLayoutManager *layoutManager = [self layoutManager];
NSUInteger numberOfLines = 0; // 行数のカウント用変数
NSUInteger numberOfGlyphs = [layoutManager numberOfGlyphs];
NSRange lineRange; // 現在対象となっている行の、先頭の開始位置と文字数
for (NSUInteger index = 0; index < numberOfGlyphs; numberOfLines++) { // index: 現在見ている文字の位置
(void) [layoutManager lineFragmentRectForGlyphAtIndex:index
effectiveRange:&lineRange];
index = NSMaxRange(lineRange);
}
// 最終行が改行の場合に計算されていないようなので、その補正をする
NSString *text = self.textStorage.string;
if (text.length != 0 && [[text substringFromIndex:text.length - 1] isEqualToString:@"\n"]) {
numberOfLines++;
}
return numberOfLines;
}
Protocol 정의
NSWindowController
에 대한 프로토콜 정의 @protocol ChangeableHeightTextViewDelegate <NSTextViewDelegate>
- (void)ChangeableHeightTextViewDidChange; // テキストビューの内容が変更されたときによばれる
@end
<NSTextViewDelegate>
는 NSTextViewDelegate
를 상속하여 새로운 프로토콜을 만드는 것을 나타냅니다 @property (weak, nonatomic) id <ChangeableHeightTextViewDelegate> delegate;
※상기와 같이 에러가 나오는데, 기존의 Delegate를 계승하는 경우의 delegate 프로퍼티의 작성법이 잘못되어 있는 것일까?
NSTextView의 크기를 시각화
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
// Drawing code here.
// 見やすいようにNSTextViewの範囲を描画する
NSRect bounds = [self bounds];
[[NSColor greenColor] set];
[NSBezierPath strokeRect:bounds];
}
NSTextView
의 범위를 알기 쉽게 그리기 창 크기 변경
// MARK:- ChangeableHeightTextViewDelegate Delegate Methods
// TextView内のテキストが変更されたときに呼ばれる
- (void)ChangeableHeightTextViewDidChange {
NSRect windowFrame = self.window.frame;
NSRect scrollViewFrame = _myTextView.superview.superview.frame;
// 20:Windowのヘッダ幅、上下のマージン、
// 20:(入力していってね)の高さ
// 6 :固定テキストとNSSCrollViewの間隔
windowFrame.size.height = (20 + 20 + 6 + 20 + 20) + scrollViewFrame.size.height;
[self.window setFrame:windowFrame display:YES];
}
// MARK:- ChangeableHeightTextViewDelegate Delegate Methods
// TextView内のテキストが変更されたときに呼ばれる
- (void)ChangeableHeightTextViewDidChange {
NSRect windowFrame = self.window.frame;
NSRect scrollViewFrame = _myTextView.superview.superview.frame;
// 20:Windowのヘッダ幅、上下のマージン、
// 20:(入力していってね)の高さ
// 6 :固定テキストとNSSCrollViewの間隔
windowFrame.size.height = (20 + 20 + 6 + 20 + 20) + scrollViewFrame.size.height;
[self.window setFrame:windowFrame display:YES];
}
ScrollViewの高さ
+ その他要素の高さ
로 계산 Reference
이 문제에 관하여(NSScrollView의 높이를 입력 문자 수에 따라 변경), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/IKEH/items/129c1ab4dabe33f49247텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)