入力テキストの複数行に uitextview を使用し、テキスト入力の行を制限します。iOS7で、全文入力時や多段文字(日本語)入力時にアプリがクラッシュする問題を修正しました。(この問題を繰り返すことはできませんが、私の顧客は、下の図と同じように Crashlytics でエラーが表示されると言いました)
テストシミュレーターではクラッシュしないため、デバッグできません。以下は、テキスト制限行の設定に関する私のコードです。
- (BOOL) textView:(UITextView *)textViewshouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
CGRect textRect = [textView.layoutManager usedRectForTextContainer:textView.textContainer];
CGFloat sizeAdjustment = textView.font.lineHeight * [UIScreen mainScreen].scale;
//------------------fix num line-----------------------------
NSLayoutManager *layoutManager = [textView layoutManager];
unsigned numberOfLines, index, numberOfGlyphs = [layoutManager numberOfGlyphs];
NSRange lineRange;
for (numberOfLines=0, index=0; index < numberOfGlyphs; numberOfLines++) {
[layoutManager lineFragmentRectForGlyphAtIndex:index
effectiveRange:&lineRange];
index = NSMaxRange(lineRange);
}
if (textRect.size.height >= textView.frame.size.height - textView.contentInset.bottom - sizeAdjustment) {
if ([text isEqualToString:@"\n"] && numberOfLines < MAX_NUMBER_OF_LINES_ALLOWED-1) {
[UIView animateWithDuration:0.2 animations:^{
[textView setContentOffset:CGPointMake(textView.contentOffset.x, textView.contentOffset.y + sizeAdjustment)];
}];
}
}
[textView scrollRangeToVisible:textView.selectedRange];
if(numberOfLines < MAX_NUMBER_OF_LINES_ALLOWED) {
if([text isEqualToString:@"\n"] && numberOfLines == MAX_NUMBER_OF_LINES_ALLOWED-1) {
return NO;
} else {
return numberOfLines < MAX_NUMBER_OF_LINES_ALLOWED;
}
} else {
return NO;
}
}
-(void)textViewDidChange:(UITextView *)textView {
//------------------fix num line-----------------------------
NSLayoutManager *layoutManager = [textView layoutManager];
unsigned numberOfLines, index, numberOfGlyphs = [layoutManager numberOfGlyphs];
NSRange lineRange;
for (numberOfLines = 0, index = 0; index < numberOfGlyphs; numberOfLines++){
(void) [layoutManager lineFragmentRectForGlyphAtIndex:index
effectiveRange:&lineRange];
index = NSMaxRange(lineRange);
}
NSLog(@"numberOfLines %d",numberOfLines);
if (numberOfLines<MAX_NUMBER_OF_LINES_ALLOWED) {
_tempComment = self.commentTextView.text;
} else {
self.commentTextView.text = _tempComment;
}