2014-04-25 21 views
6

Witam Pracuję z nowym interfejsem API TextKit dla systemu iOS7 i próbuję utworzyć UITextView o nieregularnym kształcie. Do tej pory mam w kontrolerze widoku:Przykład NSTextContainer o nieregularnym kształcie?

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

potem w moim podklasy NSTextContainer, chcę mieć mutablePath rysowane jako kształcie kontenera tekstu, ale nie wiem, jak tego dokonać. Mam:

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

Po prostu trochę nie rozumiem, jak to zrobić. Nie mogę znaleźć żadnego przykładu z NSTextContainer o nieregularnym kształcie.

+0

Co ma być nieregularne, marginesy tekstu lub granicy rysowane wokół niego? Na przykład napisałem przykład, w którym tekst jest ograniczony okrągłym marginesem. Czy o to Ci chodziło? – matt

+0

@matt - Próbuję uzyskać tekst pasujący do owalnego kształtu, podobnie jak dymek. –

+0

Zamiast tego zamiast widoku tekstowego polecam użyć zestawu tekstowego do bezpośredniego narysowania tekstu. – matt

Odpowiedz

10

Nie ma potrzeby, aby cały ten kod budował stos pakietu Text Kit, ponieważ nie modyfikuje się architektury stosu. Wystarczy zacząć od normalnej UITextView - powiedzmy to self.textView - a następnie przypisać jeden lub więcej obiektów UIBezierPath do swoich ścieżek wykluczenia:

self.tv.textContainer.exclusionPaths = myArrayOfBezierPaths; 

Te ścieżki są wykluczenia ścieżki, więc dla elipsy będzie chciał wykonać cztery ścieżki, z których każda opisuje narożnik kontenera tekstowego.

Alternatywnie, można zbudować Kit Tekst układać się tak, aby wstawić własny pojemnik tekst podklasy i modyfikować, gdzie tekst jest dozwolone iść nadrzędnymi lineFragmentForProposedRect:, być może podobny do tego, co robię tutaj: https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch10p537exclusionPath2/ch23p813textKitShapes/MyTextContainer.swift

Niektóre eksperymenty:

enter image description here

enter image description here

+0

Niesamowite, dziękuję bardzo. –

+0

@matt w twoim połączonym kodzie, twój test na bycie w kręgu lub nie wydaje ci się naprawdę nieefektywny. Jeśli twój okrąg jest wyśrodkowany w punkcie początkowym, to wiesz, że każdy punkt na kole musi spełniać x^2 + y^2 = r^2 i każdy punkt na lub wewnątrz koła musi spełniać x^2 + y^2 <= r^2. Jeśli chcesz poruszać się po poziomej linii od punktu testowego utrzymującego stałą y, po prostu musisz znaleźć pierwsze x spełniające x = sqrt (r^2 - y^2) przy założeniu y^2 <= r^2. Wymagałoby to znacznie mniejszej liczby iteracji w pętli i powinno być szybsze, zakładając, że sqrt jest szybkie. Dziękujemy za udostępnienie kodu. – Joel

+0

@Joel, tak, to celowo proste. – matt