Me gustaría restringir el usuario de mi iPad aplicación de entrar en un máximo de 20 líneas cuando aparece en el pdf. El usuario introduce el texto en el UITextView (como se muestra a continuación) y luego esto se convierte después en un documento pdf.

Configuración del número máximo de líneas de entrada en UITextView

Me doy cuenta de que voy a tener que hacer un par de cálculos dependiendo de lo que se introduce el texto como se escriba. Hay métodos que puede ayudarme a salir de aquí? textFieldDidEndEditing sólo me permite comprobar después de que se ha entrado.

También, ya que esto sería mucho más sencilla, es allí una manera de limitar el número de líneas de un UITextField puede ser?

Usted puede utilizar el - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string delegado método en el campo de texto para NO volver si los caracteres que el usuario está a punto de entrar haría que el texto es demasiado largo. Sé que de ninguna manera buena de hacer esa determinación, sin embargo.
Gracias – voy a comprobar este método.

OriginalEl autor RGriffiths | 2013-10-20

4 Comentarios

  1. 11

    Que estaban cerca con el textFieldDidEndEditing método de delegado.

    Una mejor manera a pesar de que es responder a la textView:shouldChangeTextInRange:replacementText: método de delegado y, a continuación, ver si el cambio que está a punto de suceder, el resultado sería más líneas que se están permitidos.

    Aquí es un ejemplo de cómo hacerlo:

    - (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);
    }

    Pongo un ejemplo completo en línea en https://github.com/st3fan/StackOverflow/tree/master/TextViewWithLineLimit .. probado en iOS 7.0.2. ¡A disfrutar!

    Gracias – una gran ayuda.
    Esto no le ayudará con múltiples líneas, sin embargo, ya que sólo se ve por caracteres de salto de línea.
    He visto esto y como Jesse dice que esto no toma en cuenta una larga pieza de texto ajustado. Sin embargo sí que me muestre cómo comprobar el texto como el usuario está escribiendo – gracias

    OriginalEl autor Stefan Arentz

  2. 3

    Las siguientes obras con ‘\n’ + envuelto línea de apoyo.

    - (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);
    }
    Hay una razón por la que usted está configurando self.AutocorrectionType = UITextAutocorrectionTypeNo;?
    De verdad que no. Simplemente es. 🙂
    El código funciona bien gracias. Sin embargo, he encontrado un caso extremo: 1. Establezca el número máximo de líneas para decir, DOS. 2. Tipo hasta que el texto se desborda sobre el final de la segunda línea. 3. Presione ‘Volver’. La nueva línea será permitido y se pasa a la TERCERA línea! EEK!
    Fantástico código, funciona como un encanto. Gracias 🙂

    OriginalEl autor Sebastian Dwornik

  3. 2

    Para limitar el número de líneas en el UITextView, acabo de hacer :

    En el siguiente UITextViewDelegate método :

    - (void)textViewDidChange:(UITextView *)textView
    {
    NSUInteger maxNumberOfLines = 5;
    NSUInteger numLines = textView.contentSize.height/textView.font.lineHeight;
    if (numLines > maxNumberOfLines)
    {
    textView.text = [textView.text substringToIndex:textView.text.length - 1];
    }
    }
    Esto no funciona de forma fiable ya que se asume que el texto que se agrega es como el final. Si coloca el cursor en el medio de la cadena que le permite añadir tantos retornos de carro como quieras….

    OriginalEl autor Numereyes

  4. 0

    mucho más fácil es hacer como:

    Swift:

    textView.textContainer.maximumNumberOfLines = 10;
    textView.textContainer.lineBreakMode = NSLineBreakByTruncatingTail;

    Obj-C:

    textView.textContainer.maximumNumberOfLines = 10;
    [textView.layoutManager textContainerChangedGeometry:textView.textContainer];

    OriginalEl autor KostiaZzz

Dejar respuesta

Please enter your comment!
Please enter your name here