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)];
}
paragraphStyle.defaultTabInterval nichts tun:/ –