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;
}
¿Puede usted publicar el código que muestra cómo está insertando el archivo adjunto de texto en su 'NSTextView'? –
Rob, he agregado el código que quería ver. Gracias por echar un vistazo a esto! –