2011-12-19 14 views
5

Estoy editando un subconjunto de HTML en un NSTextView [1] y quiero simular una etiqueta <hr>.NSTextAttachmentCell tiene una milla de altura

He descubierto que la forma de hacerlo es con NSTextAttachment y una NSTextAttachmentCell personalizada, y tengo todo el código escrito para insertar el archivo adjunto y la celda. El problema es que hay una enorme cantidad de espacio en blanco debajo de la celda.

Este espacio no es parte de la celda en sí; si pinto toda el área de la celda de rojo, tiene exactamente el tamaño correcto, pero la vista de texto coloca la siguiente línea muy por debajo del rojo. La cantidad parece depender de la cantidad de texto que es por encima de la celda; desafortunadamente, estoy trabajando con documentos largos donde las etiquetas <hr> son cruciales, y esto causa problemas importantes con la aplicación.

¿Qué diablos está pasando?

Las piezas de dinero de mi subclase de células:

- (NSRect)cellFrameForTextContainer:(NSTextContainer *)textContainer 
       proposedLineFragment:(NSRect)lineFrag glyphPosition:(NSPoint)position 
        characterIndex:(NSUInteger)charIndex { 
    lineFrag.size.width = textContainer.containerSize.width; 

    lineFrag.size.height = topMargin + TsStyleBaseFontSize * 
     heightFontSizeMultiplier + bottomMargin; 

    return lineFrag; 
} 

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView 
     characterIndex:(NSUInteger)charIndex 
     layoutManager:(NSLayoutManager *)layoutManager { 
    NSRect frame = cellFrame; 
    frame.size.height -= bottomMargin; 

    frame.size.height -= topMargin; 
    frame.origin.y += topMargin; 

    frame.size.width *= widthPercentage; 
    frame.origin.x += (cellFrame.size.width - frame.size.width)/2; 

    [color set]; 
    NSRectFill(frame); 
} 

[1] He intentado un WebView con juego isEditable y el margen de beneficio que producía era unusably sucio, en particular, no pude encontrar una forma de ajustar el texto muy bien en <p> etiquetas.


Para responder a la petición de Rob Keniger para el código que se inserta la fijación horizontal regla:

- (void)insertHorizontalRule:(id)sender { 
    NSAttributedString * rule = [TsPage newHorizontalRuleAttributedStringWithStylebook:self.book.stylebook]; 

    NSUInteger loc = self.textView.rangeForUserTextChange.location; 

    if(loc == NSNotFound) { 
     NSBeep(); 
     return; 
    } 

    if(loc > 0 && [self.textView.textStorage.string characterAtIndex:loc - 1] != '\n') { 
     NSMutableAttributedString * workspace = rule.mutableCopy; 
     [workspace.mutableString insertString:@"\n" atIndex:0]; 
     rule = workspace; 
    } 

    if([self.textView shouldChangeTextInRange:self.textView.rangeForUserTextChange replacementString:rule.string]) { 
     [self.textView.textStorage beginEditing]; 
     [self.textView.textStorage replaceCharactersInRange:self.textView.rangeForUserTextChange withAttributedString:rule]; 
     [self.textView.textStorage endEditing]; 
     [self.textView didChangeText]; 
    } 

    [self.textView scrollRangeToVisible:self.textView.rangeForUserTextChange]; 

    [self reloadPreview:sender]; 
} 

Y el método de TsPage que construye la cadena adjunto:

+ (NSAttributedString *)newHorizontalRuleAttributedStringWithStylebook:(TsStylebook*)stylebook { 
    TsHorizontalRuleCell * cell = [[TsHorizontalRuleCell alloc] initTextCell:@"—"]; 
    cell.widthPercentage = 0.33; 
    cell.heightFontSizeMultiplier = 0.25; 
    cell.topMargin = 12.0; 
    cell.bottomMargin = 12.0; 
    cell.color = [NSColor blackColor]; 

    NSTextAttachment * attachment = [[NSTextAttachment alloc] initWithFileWrapper:nil]; 
    attachment.attachmentCell = cell; 
    cell.attachment = attachment; 

    NSAttributedString * attachmentString = [NSAttributedString attributedStringWithAttachment:attachment]; 

    NSMutableAttributedString * str = [[NSMutableAttributedString alloc] initWithString:@""]; 
    [str appendAttributedString:attachmentString]; 
    [str.mutableString appendString:@"\n"]; 

    return str; 
} 
+2

¿Puede usted publicar el código que muestra cómo está insertando el archivo adjunto de texto en su 'NSTextView'? –

+0

Rob, he agregado el código que quería ver. Gracias por echar un vistazo a esto! –

Respuesta

5

trate de cambiar su el método cellFrameForTextContainer:proposedLineFragment:glyphPosition: de la clase celular para devolver NSZeroPoint para el origen del marco de la celda.

(no tengo ni idea de por qué esto debería funcionar, pero el interrogador y he estado vivo-debugging, y lo que realmente hace.)


Agregado por que pregunta: Parece que, incluso aunque el rect devuelto se describe como un "marco", su origen es relativo a la línea en la que se encuentra, no a la parte superior del documento. Por lo tanto, el valor del valor de retorno origin.y debe establecerse en cero si lo desea en la misma línea.

(El valor origin.x, por el contrario, hace referirse a la posición de la celda en la línea, por lo que debe ser el mismo que lineFrag.origin.x a menos que desee cambiar la ubicación horizontal de la celda.)

Cuestiones relacionadas