2011-12-19 22 views
5

Ben bir NSTextView [1] HTML alt kümesini düzenliyor ve ben bir <saat> etiket benzetmek istiyorum.NSTextAttachmentCell bir mil yüksek

Bunu yapmanın yolunun NSTextAttachment ve özel bir NSTextAttachmentCell ile olduğunu ve kodun eki ve hücreyi eklemek için yazıldığını öğrendim. Sorun şu ki, hücrenin altında muazzam miktarda boşluk var.

Bu alan hücrenin kendisinin bir parçası değildir; hücrenin tüm alanını kırmızıya çizersem tam olarak doğru boyutta olur, ancak metin görünümü bir sonraki satır metnini kırmızıdan çok aşağıda tutar. Miktar, hücresinin üstündeki metnin ne kadarının olduğuna bağlıdır; Ne yazık ki, <hr> etiketlerinin çok önemli olduğu uzun belgelerle çalışıyorum ve bu uygulamada büyük sorunlara neden oluyor.

halt neler oluyor?

cep alt sınıfının para parçalar:

- (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] isEditable seti ve üretilen biçimlendirmeye sahip bir WebView unusably kirli-özellikle, ben bulamadım oldu çalıştı metni, <p> etiketlerinde güzelce sarmalama yolu. eki dize oluşturur

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

Ve TsPage yöntemi:


yatay kural eki ekler kodu için Rob Keniger talebini cevaplamak için

+ (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

sen Can metin ekini nstextView'inize nasıl eklediğinizi gösteren kodu postalayın. –

+0

Rob, görmek istediğin kodu ekledim. Buna bir göz attığın için teşekkürler! –

cevap

5

değiştirmeyi deneyin senin hücre sınıfının menşei için NSZeroPoint dönmek için hücre sınıfının cellFrameForTextContainer:proposedLineFragment:glyphPosition: yöntemi.

(Bu işe neden hiçbir fikri ancak soru soran var ve bunu canlı ayıklama edilmiştir ve bu gerçekten oluyor.)


sorgulayıcı tarafından eklendi: Öyle görünüyor, hatta döndürülecek doğrultu bir "çerçeve" olarak tanımlanmasına rağmen, kökeni belgenin üst kısmına değil, içindeki satıra göre değişir. Böylece, aynı satırda isterseniz, dönüş değeri origin.y değeri sıfır olarak ayarlanmalıdır.

(origin.x değeri, diğer taraftan, doğrultusunda hücrenin konumunu ifade yapar, böylece hücrenin yatay konumunu değiştirmek istediğiniz sürece lineFrag.origin.x aynı olmalıdır.)

İlgili konular