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)];
}
paragraphStyle.defaultTabInterval nic nie robi:/Co zrobić –