UITextView dictaminó la línea de fondo, pero mal la altura de la línea

Tengo un UITextView donde el usuario puede crear notas y guardar en un archivo plist.
Quiero ser capaz de mostrar las líneas sólo como una notebook. El problema que tengo es
que el texto no se alinean correctamente.

La imagen a continuación se explica el problema bastante bien.

UITextView dictaminó la línea de fondo, pero mal la altura de la línea

Este es el fondo que uso para crear las líneas como las Notas.aplicación
UITextView dictaminó la línea de fondo, pero mal la altura de la línea

Este es mi código para crear el fondo de mi UITextView:

textView.font            = [UIFont fontWithName:@"MarkerFelt-Thin" size:19.0]; 
textView.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Notes.png"]];

Sé que la UIFont.lineHeight propiedad sólo está disponible en > iOS 4.x.

Así que me pregunto si no hay otra solución a mi problema?

OriginalEl autor Fernando Redondo | 2011-03-21

2 Kommentare

  1. 57

    Usted debe tratar y sacar sus líneas de programación en lugar de utilizar una imagen. Aquí está el código de ejemplo de cómo se puede lograr eso. Puede subclase UITextView y anular es drawRect: método.

    NoteView.h

    #import <UIKit/UIKit.h>
    @interface NoteView : UITextView <UITextViewDelegate> {
    }
    @end

    NoteView.m

    #import "NoteView.h"
    
    @implementation NoteView
    
    - (id)initWithFrame:(CGRect)frame {
    
        self = [super initWithFrame:frame];
        if (self) {
            self.backgroundColor = [UIColor colorWithRed:1.0f green:1.0f blue:0.6f alpha:1.0f];
            self.font = [UIFont fontWithName:@"MarkerFelt-Thin" size:19];
        }
        return self;
    }
    
    - (void)drawRect:(CGRect)rect {
    
        //Get the current drawing context   
        CGContextRef context = UIGraphicsGetCurrentContext(); 
        //Set the line color and width
        CGContextSetStrokeColorWithColor(context, [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.2f].CGColor);
        CGContextSetLineWidth(context, 1.0f);
        //Start a new Path
        CGContextBeginPath(context);
    
        //Find the number of lines in our textView + add a bit more height to draw lines in the empty part of the view
        NSUInteger numberOfLines = (self.contentSize.height + self.bounds.size.height) / self.font.leading;
    
        //Set the line offset from the baseline. (I'm sure there's a concrete way to calculate this.)
        CGFloat baselineOffset = 6.0f;
    
        //iterate over numberOfLines and draw each line
        for (int x = 0; x < numberOfLines; x++) {
            //0.5f offset lines up line with pixel boundary
            CGContextMoveToPoint(context, self.bounds.origin.x, self.font.leading*x + 0.5f + baselineOffset);
            CGContextAddLineToPoint(context, self.bounds.size.width, self.font.leading*x + 0.5f + baselineOffset);
        }
    
        //Close our Path and Stroke (draw) it
        CGContextClosePath(context);
        CGContextStrokePath(context);
    }
    
    @end

    MyViewController.h

    #import <UIKit/UIKit.h>
    #import "NoteView.h"
    @interface MyViewController : UIViewController <UITextViewDelegate> {
    
        NoteView *note;
    }
    
    @property (nonatomic, retain) NoteView *note;
    
    @end

    MyViewController.m

    #import "MyViewController.h"
    #import "NoteView.h"
    
    #define KEYBOARD_HEIGHT 216
    
    @implementation MyViewController
    @synthesize note;
    
    - (void)loadView {
        [super loadView];
        self.note = [[[NoteView alloc] initWithFrame:self.view.bounds] autorelease];
        [self.view addSubview:note];
        note.delegate = self;
        note.text = @"This is the first line.\nThis is the second line.\nThis is the ... line.\nThis is the ... line.\nThis is the ... line.\nThis is the ... line.\nThis is the ... line.\n";
    }
    
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
        [note setNeedsDisplay];
    }
    
    - (void)textViewDidBeginEditing:(UITextView *)textView {
        CGRect frame = self.view.bounds;
        frame.size.height -= KEYBOARD_HEIGHT;
        note.frame = frame;
    }
    
    - (void)textViewDidEndEditing:(UITextView *)textView {
        note.frame = self.view.bounds;
    }
    
    - (void)dealloc {
        [note release];
        [super dealloc];
    }

    Echar un vistazo a la documentación de Apple para La gestión del Teclado, específicamente en Movimiento «de Contenido Que Se Encuentra Debajo del Teclado». Se explica cómo escuchar para NSNotifcations y ajustar sus puntos de vista correctamente.

    Ok, creo que te sigo desde ahora, con respecto a las líneas que aparecen a medida que añada más texto. Voy a editar la respuesta a añadir la altura de la vista para el tamaño del contenido de la altura y que debe cubrir la totalidad de la vista con líneas.
    Ok entiendo, gracias. Si hace clic en entrar y crear nuevas líneas con el texto en la medida en que el texto sería invisible bajo el teclado si su solución no dejar que eso suceda, se puede entonces ver que las líneas no está correctamente alineada más? Si usted acaba de escribir tres líneas todo es perfecto, pero tan pronto como se pone más que el NoteView.marco.tamaño.la altura de las líneas está mal dibujado. ¿Esto ha ocurrido a usted?
    Aceptar esto es absolutamente fantástico. La estoy usando con una vista de texto cargado de un XIB – acaba de hacer un UITextView y establece su clase para NoteView, de hecho. Funciona a la perfección. He hecho un cambio, estoy empezando el bucle for de 1 para que no dibuje una línea por encima de la primera línea de texto se ve más bonita, y más como un verdadero bloc de notas. Pero en realidad esta respuesta va por encima y más allá de lo que podría esperarse de StackOverflow.
    no te olvides de añadir self.contentMode = UIViewContentModeRedraw; en initWithFrame: este modo, el texto y las líneas de desplazamiento juntos. De lo contrario, absolutamente impresionante solución!
    No estoy seguro de que cuando llegó roto, pero la fuente.principales propiedades de siempre devuelve 0 para mí. En lugar usted debe utilizar el tipo de letra.lineHeight que funciona totalmente bien en iOS 9

    OriginalEl autor Adolfo

  2. 0

    Creo que el problema es con su imagen, el espacio amarillo encima de la línea está creando el problema.

    Debe editar la imagen.

    Y buen trabajo.

    Parece ser una combinación de dos cosas: El espacio amarillo que me quite lo hizo ver como la altura de la línea fue el mismo en cada línea. El problema fue muy claro cuando me fijo que: Hay un margen superior en el texto en el UITextView que deja el texto de perfecto alignation. El margen puede ser resuelto con contentInset pero no de relleno. ¿Alguien sabe cómo solucionar el margen superior? El equivalente en CSS es: padding-top:0px
    sí u r a la derecha. yo de verificación al lado de mi auto. pero aún no es capaz de resolver el problema.
    El contentInset propiedad no funciona en mi solución debido a que el fondo se mueve con el contentInset. Es sólo el contenido que necesita ser movido. No puedo entender por qué la UITextView por defecto tiene un relleno como 15px o así. No sé si este es ajustable después de mi investigación, yo creo que es necesario considerar algunas alternativas de solución. Tener a alguien aquí hecho esto en el pasado, tal vez?
    yo quiero hacer esto en mi último proyecto del cliente. a continuación te dejo todos los que la línea de la cosa, debido a muchas dificultades. pero si u encontrar una solución, u debe compartir con nosotros.

    OriginalEl autor Iqbal Khan

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...