7

iPadPDFに出力するときに、アプリのユーザーが最大20行まで入力できるように制限したいと思います。ユーザーがUITextView(以下に示すように) にテキストを入力すると、これは後で PDF ドキュメントに変換されます。

ここに画像の説明を入力

入力するテキストに応じて、いくつかの計算を行う必要があることに気づきました。ここで私を助けることができる方法はありますか? textFieldDidEndEditing入力後にのみ確認できます。

また、これははるかに簡単になるため、行数を制限する方法はありUITextFieldますか?

4

4 に答える 4

11

textFieldDidEndEditingあなたはデリゲートメソッドに近かった。

ただし、より良い方法は、デリゲート メソッドに応答し、textView:shouldChangeTextInRange:replacementText:これから発生する変更によって許可される行数が増えるかどうかを確認することです。

これを行う方法の例を次に示します。

- (BOOL) textView:(UITextView *)textView
    shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    static const NSUInteger MAX_NUMBER_OF_LINES_ALLOWED = 3;

    NSMutableString *t = [NSMutableString stringWithString:
        self.textView.text];
    [t replaceCharactersInRange: range withString: text];

    NSUInteger numberOfLines = 0;
    for (NSUInteger i = 0; i < t.length; i++) {
        if ([[NSCharacterSet newlineCharacterSet]
                characterIsMember: [t characterAtIndex: i]]) {
            numberOfLines++;
        }
    }

    return (numberOfLines < MAX_NUMBER_OF_LINES_ALLOWED);
}

https://github.com/st3fan/StackOverflow/tree/master/TextViewWithLineLimit .. iOS 7.0.2 でテストした完全な例をオンラインにしました。楽しみ!

于 2013-10-20T15:08:06.277 に答える
4

以下は、'\n' + 折り返された行のサポートで機能します。

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.AutoresizingMask   = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        self.AutocorrectionType = UITextAutocorrectionTypeNo;
        self.KeyboardAppearance = UIKeyboardAppearanceAlert;
        self.font               = [UIFont fontWithName:@"Avenir" size:14];

        self.maximumNumberOfLinesAllowed = 4;

        self.delegate           = self;
    }

    return self;
}


- (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)aRange replacementText:(NSString*)aText
{
    NSMutableString *t = [NSMutableString stringWithString: self.text];
    [t replaceCharactersInRange: aRange withString: aText];

    // First check for standard '\n' (newline) type characters.
    NSUInteger numberOfLines = 0;
    for (NSUInteger i = 0; i < t.length; i++) {
        if ([[NSCharacterSet newlineCharacterSet] characterIsMember: [t characterAtIndex: i]]) {
            numberOfLines++;
        }
    }

    if (numberOfLines >= self.maximumNumberOfLinesAllowed)
        return NO;


    // Now check for word wrapping onto newline.
    NSAttributedString *t2 = [[NSAttributedString alloc]
                             initWithString:[NSMutableString stringWithString:t] attributes:@{NSFontAttributeName:self.font}];

    __block NSInteger lineCount = 0;

    CGFloat maxWidth   = self.frame.size.width;
    NSLog(@"maxWidth = %.02f", maxWidth);

    NSTextContainer *tc = [[NSTextContainer alloc] initWithSize:CGSizeMake(maxWidth, CGFLOAT_MAX)];
    NSLayoutManager *lm = [[NSLayoutManager alloc] init];
    NSTextStorage   *ts = [[NSTextStorage alloc] initWithAttributedString:t2];
    [ts addLayoutManager:lm];
    [lm addTextContainer:tc];
    [lm enumerateLineFragmentsForGlyphRange:NSMakeRange(0,lm.numberOfGlyphs)
                                 usingBlock:^(CGRect rect,
                                              CGRect usedRect,
                                              NSTextContainer *textContainer,
                                              NSRange glyphRange,
                                              BOOL *stop)
     {
         lineCount++;
     }];

//    NSLog(@"%d", lineCount);

    return (lineCount <= self.maximumNumberOfLinesAllowed);

}
于 2013-11-24T04:54:33.960 に答える