2014-04-25 7 views
6

Hallo Ich arbeite mit der neuen TextKit API für iOS7 und ich versuche, eine UITextView mit einer unregelmäßigen Form zu produzieren. Bisher habe ich in einer View-Controller haben:Beispiel für NSTextContainer mit nicht regulärer Form?

-(void) loadView 
{ 
    self.view = [[UIView alloc] initWithFrame:CGRectMake(0,0,320,548)]; 

    NSTextStorage *textStorage = [[NSTextStorage alloc] init]; 

    NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; 
    [textStorage addLayoutManager: layoutManager]; 

    BaseTextContainer *textContainer = [[BaseTextContainer alloc] initWithSize:CGSizeMake(100, 100)]; 
    [layoutManager addTextContainer: textContainer]; 

    BaseTextView *textView = [[BaseTextView alloc] initWithFrame:CGRectMake(110,124, 100, 100) textContainer:textContainer]; 
    textView.backgroundColor = [UIColor blueColor]; 
    textView.editable = YES; 
    [self.view addSubview:textView]; 
} 

Da ist in meinem subclassed NSTextContainer, ich möchte eine mutablePath wie die Form des Textes Behälter gezogen haben, aber nicht sicher, wie dies zu erreichen. Ich habe:

- (BOOL) isSimpleRectangularTextContainer 
{ 
    return NO; 
} 

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{ 
    NSLog(@"TEST"); 
    CGContextRef context = ctx; 
    CGSize layerSize = layer.frame.size; 

    CGAffineTransform transform = CGAffineTransformMakeScale(layerSize.width/self.initialSize.width, layerSize.height/self.initialSize.height); 
    CGMutablePathRef newGraphicMutablePath = CGPathCreateMutableCopyByTransformingPath(self.mutablePath, &transform); 
    CGContextAddPath(context, newGraphicMutablePath); 

    CGPathRelease(newGraphicMutablePath); 
    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor); 
    CGContextDrawPath(context, kCGPathFill); 
} 

Nur ein bisschen verwirrt darüber, wie man das zur Arbeit bringt. Ich kann nirgends ein Beispiel einer NSTextContainer mit einer unregelmäßigen Form finden.

+0

Was ist unregelmäßig, die Ränder des Textes oder der Rahmen um sie gezogen? Zum Beispiel habe ich ein Beispiel geschrieben, bei dem der Text durch einen kreisförmigen Rand begrenzt ist. Meinst Du das? – matt

+0

@matt - Ich versuche, etwas Text in eine ovale Form zu bekommen, ähnlich einem Wortballon. –

+0

Dann empfehle ich anstelle einer Textansicht, Text Kit zu verwenden, um den Text direkt zu zeichnen. – matt

Antwort

10

Es ist nicht notwendig, dass all dieser Code den Textkit-Stapel erstellt, da Sie die Architektur des Stapels nicht ändern. Starten Sie einfach mit einem normalen UITextView - sagen wir mal es self.textView ist - und dann ein zuweisen oder mehrere UIBezierPath Objekte zu seinem Ausschluss Pfade:

self.tv.textContainer.exclusionPaths = myArrayOfBezierPaths; 

Diese Pfade sind Ausschluss Wege, so für eine Ellipse wollen Sie vier machen Pfade, die jeweils eine Ecke des Textcontainers beschreiben.

Alternativ können Sie das Text-Kit bauen sich stapeln, um Ihren eigenen Text Container Unterklasse einzufügen und modifizieren, wo der Text durch zwingende lineFragmentForProposedRect: gehen darf, vielleicht ähnlich dem, was ich hier tun: https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch10p537exclusionPath2/ch23p813textKitShapes/MyTextContainer.swift

einige Experimente:

enter image description here

enter image description here

+0

Super, vielen Dank. –

+0

@matt in Ihrem verbundenen Code, fühlt sich Ihr Test für im Kreis oder nicht wirklich ineffizient. Wenn Ihr Kreis am Ursprung zentriert ist, dann wissen Sie, dass jeder Punkt auf dem Kreis x^2 + y^2 = r^2 erfüllen muss und jeder Punkt auf oder innerhalb des Kreises muss x^2 + y^2 <= erfüllen r^2. Wenn Sie sich von einem Testpunkt aus über eine horizontale Linie bewegen wollen, wobei y konstant bleibt, müssen Sie nur das erste x finden, das x = sqrt (r^2 - y^2) erfüllt, wobei y^2 <= r^2 angenommen wird. Das würde viel weniger Iterationen Ihrer Schleife erfordern und sollte schneller sein, vorausgesetzt, dass sqrt schnell ist. Danke für die Freigabe Ihres Codes übrigens. – Joel

+0

@Joel, ja, es ist absichtlich einfältig. – matt