2013-03-19 4 views
6

Ich erstelle eine iOS App und möchte eine attributierte Zeichenfolge mit spezifischen Tabstops in einem UITextView anzeigen. Ich möchte sie auch direkt in UIViews mit Core Text in DrawRect zeichnen. Ich möchte (wenn möglich) für die gleiche attributierte Zeichenfolge in beiden Szenarien verwendet werden.Wie füge ich Tabstops zu einem NSAttributedString hinzu und zeige sie in einem UITextView an

Also, in meiner App, ich erstellen ein CFAttributedStringRef oder ein NSAttributedString und wenden Sie ein CTParagraphStyle-Attribut an. Dann versuche ich, in einem UITextView den zugeschrieben Zeichenfolge angezeigt und ich bekomme einen Absturz wie folgt aus:

-[__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" 
) 

Ich verstehe, was los ist, aber ich frage mich, ob ich eine alternative Art und Weise habe zu tun, was Ich möchte. NSMutableParagraphStyle auf iOS hat keine Registerkarte stop Unterstützung, aber ich stelle fest, dass NSMutableParagraphStyle auf OS X diese Fähigkeit hat. Das führt mich zu der Annahme, dass das iOS NSMutableParagraphStyle eines Tages dieses unterstützen kann.

In der Zwischenzeit gibt es Möglichkeit, Tabstopps zu einem CFAttributedStringRef oder einem NSAttributedString hinzuzufügen und immer noch ein UITextView es anzuzeigen?

Die Quelle in Frage:

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

Antwort

8

In iOS 7 können Sie es wie folgt tun:

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 nichts tun:/ –

-1

ios 6.1 NSParagraphStyle hinzugefügt, aber es die CTParagraphStyleRef und NSParagraphStyle scheinen, sind nicht gebührenfreie Überbrückung.

Als Ergebnis, wenn Sie CTParagraphStyleRef in NSAttributeString haben es verursacht:

[__NSCFType headIndent]: Unbekannter Selektor an Instanz gesendet xxxx

und andere Verfahren zur NSParagraphStyle wie Ausrichtung.

3

Dies ist die Swift-Version, die für mich gearbeitet:

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

Was tun die "Optionen", die du eingibst, tun? – ma11hew28

Verwandte Themen