私が書いているiOSアプリケーションの場合、ユーザーが限られたテキストを挿入できるUITextViewを使用しています。
テキストビューには2つの制限があります。
- 行は30文字以内にする必要があります
- UITextViewには20行のテキストしか含めることができません。
つまり、最大は30文字の20行です。
ユーザーがUITextViewにテキストを入力していて、現在の文が30文字の場合、新しい行\n
(その行の最後の単語の前)を自動的に挿入し、最後の単語とカーソルを下の行に強制します。
ユーザーが30文字の20行(またはもっと簡単に言うと、最後の行に30文字の20行)がある場合、入力をブロックしたいと思います。
さて、これのほとんどはかなり「単純」ですが、私が持っているコードは、前の行にテキストを挿入するような境界の場合を考慮していません。
Appleのドキュメントを見回しましたが、UITextViewでこの種のワードラップを実際に強制する方法を見つけることができません。
私の試みは、これらすべてをshouldChangeTextInRange
デリゲートメソッドで処理することです(コードをもう少し冗長にしたので、少し読みやすくなりました)。
#define MAX_LENGTH_LINE 30
#define MAX_LENGTH_ROWS 20
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
// Check for backspaces, they should always be allowed?
if ([text length] == 0 && ![text isEqualToString:@"\n"])
return YES;
NSArray* lines = [textView.text componentsSeparatedByString:@"\n"];
// Check if there are a maximum of lines and the last line is already maxed out
NSString* lastLine = [lines objectAtIndex:[lines count] - 1];
if (([lines count] == MAX_LENGTH_ROWS) &&
(lastLine != nil) &&
([lastLine length] > MAX_LENGTH_LINE) &&
([text length] > 0))
return NO;
if ((lastLine != nil) &&
([lastLine length] > MAX_LENGTH_LINE))
{
NSRange range = [textView.text rangeOfString:@" " options:NSBackwardsSearch];
NSRange breakRange = [textView.text rangeOfString:@"\n" options:NSBackwardsSearch];
if (breakRange.location == NSNotFound)
breakRange = NSMakeRange(0, 1);
if (range.location == NSNotFound) {
range = NSMakeRange(0, 1);
}
if (range.location > breakRange.location)
{
textView.text = [textView.text stringByReplacingCharactersInRange:NSMakeRange(range.location, 1) withString:@"\n"];
}
else
{
textView.text = [textView.text stringByAppendingString:@"\n"];
}
}
if ([text isEqualToString:@"\n"])
{
if ([lines count] == MAX_LENGTH_ROWS)
return NO;
else {
return YES;
}
NSRange range = NSMakeRange(textView.text.length - 1, 1);
[textView scrollRangeToVisible:range];
}
return YES;
}
その間、私はしばらくこれにいて、今それを失いました。UITextViewを20行/30文字の制限に制限するためのポインタを提供できる人はいますか?