2013-03-19 11 views
6

Tworzę aplikację na iOS i chciałbym wyświetlić przypisany ciąg z określonymi tabulatorami określonymi w UITextView. Chciałbym również narysować je bezpośrednio w UIViews za pomocą Core Text in drawRect. Chciałbym (jeśli to możliwe) dla tego samego przypisanego ciągu, który będzie używany w obu scenariuszach.Jak dodać tabulatory do NSAttributedString i wyświetlać w UITextView

Tak więc, w mojej aplikacji tworzę CFAttributedStringRef lub NSAttributedString i stosuję do niego atrybut CTParagraphStyle. Następnie próbuję wyświetlić nadany ciąg w UITextView i otrzymuję awarię tak:

-[__NSCFType headIndent]: unrecognized selector sent to instance 0x7545080 

po 0x7545080 
$0 = 122966144 CTParagraphStyle: 
base writing direction = -1, alignment = 4, line break mode = 0, 
    default tab interval = 0 
first line head indent = 0, head indent = 0, tail indent = 0 
line height multiple = 0, maximum line height = 0, minimum line height = 0 
line spacing adjustment = 0, paragraph spacing = 0, 
    paragraph spacing before = 0 
tabs: 
(
    "CTTextTab: location = 20, alignment = 0, options = (none)\n", 
    "CTTextTab: location = 40, alignment = 0, options = (none)\n", 
    "CTTextTab: location = 60, alignment = 0, options = (none)\n", 
    "CTTextTab: location = 80, alignment = 0, options = (none)\n", 
    "CTTextTab: location = 100, alignment = 0, options = (none)\n", 
    "CTTextTab: location = 120, alignment = 0, options = (none)\n" 
) 

rozumiem, co się dzieje, ale zastanawiam się, czy mam jakiś alternatywny sposób robienia co Chciałbym. NSMutableParagraphStyle na iOS nie ma tabulacji zatrzymania obsługi, ale zauważam, że NSMutableParagraphStyle na OS X ma tę możliwość . To prowadzi mnie do myślenia, że ​​iOS NSMutableParagraphStyle może pewnego dnia wesprzeć to.

W międzyczasie, czy istnieje sposób dodania tabulatorów do CFAttributedStringRef lub NSAttributedString i nadal wyświetlać UITextView to?

źródło w pytaniu:

- (void)viewWillAppear:(BOOL)animated 
{ 
    CFDictionaryRef attrs = (__bridge CFDictionaryRef) @{}; 
    CFAttributedStringRef a = CFAttributedStringCreate(
     kCFAllocatorDefault, CFSTR("a\tb\tc\td"), attrs); 

    CFMutableAttributedStringRef attrStr; 
    attrStr = CFAttributedStringCreateMutableCopy(
     kCFAllocatorDefault, CFAttributedStringGetLength(a), a); 

    CFArrayRef tabStops = (__bridge CFArrayRef) @[ 
     (__bridge id) CTTextTabCreate(0, 20, NULL), 
     (__bridge id) CTTextTabCreate(0, 40, NULL), 
     (__bridge id) CTTextTabCreate(0, 60, NULL), 
     (__bridge id) CTTextTabCreate(0, 80, NULL), 
     (__bridge id) CTTextTabCreate(0, 100, NULL), 
     (__bridge id) CTTextTabCreate(0, 120, NULL)]; 

    const CTParagraphStyleSetting paraSettings[] = { 
     {kCTParagraphStyleSpecifierTabStops, sizeof(CFArrayRef), &tabStops}, 
    }; 

    CTParagraphStyleRef paraStyle = CTParagraphStyleCreate(
     paraSettings, 
     sizeof(paraSettings)/sizeof(CTParagraphStyleSetting)); 

    CFRange range = CFRangeMake(0, CFAttributedStringGetLength(attrStr)); 
    CFAttributedStringSetAttribute(
     attrStr, range, kCTParagraphStyleAttributeName, paraStyle); 

    CFRelease(paraStyle); 
    CFIndex i, count = CFArrayGetCount(tabStops); 
    for (i = 0; i < count; i++) { 
     CFRelease(CFArrayGetValueAtIndex(tabStops, i)); 
    } 

    [[self textView] setAttributedText: 
     (__bridge NSAttributedString *)(attrStr)]; 
} 

Odpowiedz

8

w iOS 7 można to zrobić tak:

UIFont *font = [UIFont systemFontOfSize:18.0]; 
NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
NSInteger cnt; 
CGFloat tabInterval = 72.0; 
paragraphStyle.defaultTabInterval = tabInterval; 
NSMutableArray *tabs = [NSMutableArray array]; 
for (cnt = 1; cnt < 13; cnt++) { // Add 12 tab stops, at desired intervals... 
    [tabs addObject:[[NSTextTab alloc] initWithTextAlignment:NSTextAlignmentLeft location:tabInterval * cnt options:nil]]; 
} 
paragraphStyle.tabStops = tabs; 
NSDictionary *attributes = @{ NSFontAttributeName: font, NSParagraphStyleAttributeName: paragraphStyle}; 
+1

paragraphStyle.defaultTabInterval nic nie robi:/Co zrobić –

-1

ios 6.1 dodaje NSParagraphStyle ale to wydawać się CTParagraphStyleRef i NSParagraphStyle nie są pod bezpłatny pomostowego.

W rezultacie, jeśli masz CTParagraphStyleRef w NSAttributeString powoduje:

[__NSCFType headIndent]: nierozpoznany selektor wysyłane do instancji xxxx

i innych metod, takich jak NSParagraphStyle wyrównania.

3

To jest wersja Swift, który pracował dla mnie:

let tablInterval: CGFloat = 85.0 
    let paragraphStyle = NSMutableParagraphStyle() 
    let terms = NSTextTab.columnTerminatorsForLocale(NSLocale.currentLocale()) 
    let tabStop0 = NSTextTab(textAlignment: .Right, location: 0, options: [NSTabColumnTerminatorsAttributeName:terms]) 
    let tabStop1 = NSTextTab(textAlignment: .Right, location: tablInterval, options: [NSTabColumnTerminatorsAttributeName:terms]) 
    let tabStop2 = NSTextTab(textAlignment: .Right, location: tablInterval*2, options: [NSTabColumnTerminatorsAttributeName:terms]) 
    let tabStop3 = NSTextTab(textAlignment: .Right, location: tablInterval*3, options: [NSTabColumnTerminatorsAttributeName:terms]) 
    paragraphStyle.addTabStop(tabStop0) 
    paragraphStyle.addTabStop(tabStop1) 
    paragraphStyle.addTabStop(tabStop2) 
    paragraphStyle.addTabStop(tabStop3) 

    let attributedString = NSMutableAttributedString(string:text) 
    attributedString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:rangeAll) 
+0

"opcje", które zawierasz? – ma11hew28

Powiązane problemy