TextKit v Xamarin. iOS
TextKit je nové rozhraní API, které nabízí výkonné funkce pro rozložení textu a vykreslování. Je postaven na vrcholu základní textové architektury nízké úrovně, ale je mnohem jednodušší použít než základní text.
Pro zpřístupnění funkcí TextKit standardním ovládacím prvkům byly znovu implementovány některé ovládací prvky pro iOS, aby používaly TextKit, včetně:
- UITextView
- UITextField
- UILabel
Architektura
TextKit poskytuje vrstvenou architekturu, která odděluje úložiště textu od rozložení a zobrazení, včetně následujících tříd:
NSTextContainer– Poskytuje souřadnicový systém a geometrii, která se používá k rozložení textu.NSLayoutManager– Rozloží text tak, že přepíná text na glyfy.NSTextStorage– Obsahuje textová data a také zpracovává aktualizace vlastností textu v dávce. Všechny aktualizace služby Batch jsou předávány správci rozložení pro skutečné zpracování změn, jako je přepočítání rozložení a překreslení textu.
Tyto tři třídy jsou aplikovány na zobrazení, které vykresluje text. Integrovaná zobrazení pro zpracování textu, jako například UITextView , UITextField a UILabel již jsou nastavena, ale můžete je vytvořit a použít i u libovolné UIView instance.
Následující obrázek znázorňuje tuto architekturu:

Storage textu a atributů
NSTextStorageTřída obsahuje text, který je zobrazen v zobrazení. Také sděluje všechny změny textu, například změny znaků nebo jejich atributů – do Správce rozložení pro zobrazení. NSTextStorage dědí z MSMutableAttributed řetězce, což umožňuje, aby byly změny atributů textu zadány v dávkách mezi BeginEditing a EndEditing voláními.
Například následující fragment kódu určuje změnu barvy popředí a pozadí a cílí na konkrétní rozsahy:
textView.TextStorage.BeginEditing ();
textView.TextStorage.AddAttribute(UIStringAttributeKey.ForegroundColor, UIColor.Green, new NSRange(200, 400));
textView.TextStorage.AddAttribute(UIStringAttributeKey.BackgroundColor, UIColor.Black, new NSRange(210, 300));
textView.TextStorage.EndEditing ();
Po EndEditing volání se změny odešlou do Správce rozložení, který zase provede všechny potřebné výpočty rozložení a vykreslování pro text, který se má zobrazit v zobrazení.
Rozložení s cestou vyloučení
TextKit podporuje také rozložení a umožňuje složitým scénářům, jako je například text ve více sloupcích a přetékání textu kolem zadaných cest s názvem cesty vyloučení. Cesty vyloučení se aplikují na textový kontejner, který upraví geometrii rozložení textu, což způsobí, že se text přesměruje kolem určených cest.
Přidání cesty vyloučení vyžaduje nastavení ExclusionPaths vlastnosti ve správci rozložení. Nastavení této vlastnosti způsobí, že Správce rozložení neověří rozložení textu a natéká text kolem cesty pro vyloučení.
Vyloučení na základě CGPath
Zvažte následující UITextView implementaci podtříd:
public class ExclusionPathView : UITextView
{
CGPath exclusionPath;
CGPoint initialPoint;
CGPoint latestPoint;
UIBezierPath bezierPath;
public ExclusionPathView (string text)
{
Text = text;
ContentInset = new UIEdgeInsets (20, 0, 0, 0);
BackgroundColor = UIColor.White;
exclusionPath = new CGPath ();
bezierPath = UIBezierPath.Create ();
LayoutManager.AllowsNonContiguousLayout = false;
}
public override void TouchesBegan (NSSet touches, UIEvent evt)
{
base.TouchesBegan (touches, evt);
var touch = touches.AnyObject as UITouch;
if (touch != null) {
initialPoint = touch.LocationInView (this);
}
}
public override void TouchesMoved (NSSet touches, UIEvent evt)
{
base.TouchesMoved (touches, evt);
UITouch touch = touches.AnyObject as UITouch;
if (touch != null) {
latestPoint = touch.LocationInView (this);
SetNeedsDisplay ();
}
}
public override void TouchesEnded (NSSet touches, UIEvent evt)
{
base.TouchesEnded (touches, evt);
bezierPath.CGPath = exclusionPath;
TextContainer.ExclusionPaths = new UIBezierPath[] { bezierPath };
}
public override void Draw (CGRect rect)
{
base.Draw (rect);
if (!initialPoint.IsEmpty) {
using (var g = UIGraphics.GetCurrentContext ()) {
g.SetLineWidth (4);
UIColor.Blue.SetStroke ();
if (exclusionPath.IsEmpty) {
exclusionPath.AddLines (new CGPoint[] { initialPoint, latestPoint });
} else {
exclusionPath.AddLineToPoint (latestPoint);
}
g.AddPath (exclusionPath);
g.DrawPath (CGPathDrawingMode.Stroke);
}
}
}
}
Tento kód přidá podporu pro kreslení v zobrazení textu pomocí základní grafiky. Vzhledem UITextView k tomu, že třída je nyní sestavena tak, aby pro vykreslování a rozložení textu používala TextKit, může použít všechny funkce TextKit, jako je například nastavení cest vyloučení.
Důležité
Tento příklad podtříd UITextView pro přidání podpory dotykové vykreslování. Podtříd UITextView není nutné pro získání funkcí TextKit.
Poté, co uživatel nakreslí v zobrazení textu, se na instanci použije nakreslený objekt CGPathUIBezierPath nastavením UIBezierPath.CGPath vlastnosti:
bezierPath.CGPath = exclusionPath;
Aktualizace následujícího řádku kódu provede aktualizaci rozložení textu kolem cesty:
TextContainer.ExclusionPaths = new UIBezierPath[] { bezierPath };
Následující snímek obrazovky ukazuje, jak se mění rozložení textu pro tok kolem vykreslené cesty:

Všimněte si, že AllowsNonContiguousLayout v tomto případě je vlastnost Správce rozložení v tomto případě nastavena na hodnotu false. Tím dojde k přepočítání rozložení pro všechny případy, kdy se text změní. Nastavení této hodnoty na true může přinést výkon tím, že se vyhne úplné aktualizaci rozložení, zejména v případě rozsáhlých dokumentů. Nastavení AllowsNonContiguousLayout na hodnotu true však zabrání v tom, aby cesta vyloučení v některých případech aktualizovala rozložení. například pokud je text zadán za běhu bez koncového znaku návratu na začátek před nastavenou cestou.