2011-01-06 5 views
1

Ich möchte eine Cursorposition von UITextview bekommen, ich habe den Code in How to find a pixel-positon of a cursor in UITextView? Post implementieren, der Algorithmus basiert auf Algorithmus in Pixel-Position of Cursor in UITextView.Wie kann ich selectedRange.location Wert erhalten?

mein Problem ist, kann ich nicht den selectedRange.location Wert nach der Tastatur in der zweiten Zeit erscheinen, weil es immer sagen, dass der Wert der Position ist 2147483647, was bedeutet, nicht gefunden. Dies ist meine Implementierung:

-(void)getCursorPosition{ 
NSRange originalPosition = self.codeTextView.selectedRange; 
NSLog(@"original position : %d", self.codeTextView.selectedRange.location); 
CGPoint origin = self.codeTextView.frame.origin; 
unichar c = ' '; 

NSLog(@"location : %d", self.codeTextView.selectedRange.location); 
NSLog(@"length : %d", self.codeTextView.selectedRange.length); 

if (self.codeTextView.selectedRange.location != [self.codeTextView.text length]) { 
    // NSLog(@"cek 1"); 
    c = [self.codeTextView.text characterAtIndex:self.codeTextView.selectedRange.location]; 
    // NSLog(@"cek 2");   
} 

NSLog(@"c : %d", c); 

if (c!=32 && c!=10) { 
    NSRange delimiter = [self.codeTextView.text rangeOfCharacterFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet] 
                   options:NSLiteralSearch 
                    range:NSMakeRange(self.codeTextView.selectedRange.location, 
                        [self.codeTextView.text length] - self.codeTextView.selectedRange.location)]; 
    if (delimiter.location == NSNotFound) { 
     delimiter.location = [self.codeTextView.text length]; 
    } 
    self.codeTextView.selectedRange = delimiter; 
    NSLog(@"delimiter length : %d, location : %d", delimiter.length, delimiter.location); 
} 



int deviationLocation = self.codeTextView.selectedRange.location - originalPosition.location; 
NSString *head = [self.codeTextView.text substringToIndex:self.codeTextView.selectedRange.location]; 
CGSize initialSize = [head sizeWithFont:self.codeTextView.font constrainedToSize:CGSizeMake(self.codeTextView.frame.size.width, 
                          self.codeTextView.frame.size.height)]; 
NSUInteger startOfLine = [head length]; 
BOOL isFirstLine = NO; 

NSLog(@"initialize height : %f", initialSize.height); 
NSLog(@"code height : %f", self.codeTextView.contentSize.height); 

if (initialSize.height/self.codeTextView.contentSize.height == 1) { 
    isFirstLine = YES; 
} 

while (startOfLine > 0 && isFirstLine == NO) { 
    NSRange delimiter = [head rangeOfCharacterFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet] 
               options:NSBackwardsSearch range:NSMakeRange(0, startOfLine)]; 
    startOfLine = delimiter.location; 
    NSString *tempHead = [head substringToIndex:startOfLine]; 
    CGSize tempHeadSize = [tempHead sizeWithFont:self.codeTextView.font constrainedToSize:CGSizeMake(self.codeTextView.frame.size.width, 
                            self.codeTextView.frame.size.width)]; 

    int beforeLine = initialSize.height/self.codeTextView.contentSize.height; 
    int afterLine = tempHeadSize.height/self.codeTextView.contentSize.height; 

    if (beforeLine != afterLine) 
     NSLog(@"break"); 
    break; 
} 

NSString *tail; 
if (isFirstLine == NO) { 
    tail = [head substringFromIndex:(startOfLine + deviationLocation)]; 
}else { 
    tail = [head substringToIndex:startOfLine - deviationLocation]; 
} 

CGSize lineSize = [tail sizeWithFont:self.codeTextView.font forWidth:self.codeTextView.frame.size.width lineBreakMode:UILineBreakModeWordWrap]; 

cursor = origin; 
cursor.x += lineSize.width; 
cursor.y += initialSize.height - lineSize.height; 

self.codeTextView.selectedRange = originalPosition; 

[self.codeTextView becomeFirstResponder]; 

NSLog(@"cursor x : %f, y : %f", cursor.x, cursor.y); 

}

ich diese Methode in textViewShouldBeginEditing Verfahren genannt, das ist die Umsetzung:

-(BOOL)textViewShouldBeginEditing:(UITextView *)textView{ 

[self getCursorPosition]; 

self.viewTextViewScroll.contentSize = CGSizeMake(self.codeTextView.frame.size.width, self.codeTextView.contentSize.height+100); 

CGRect frameCode = self.codeTextView.frame; 
frameCode.size.height = self.codeTextView.contentSize.height + 103; 
self.codeTextView.frame = frameCode; 

CGRect frameLine = self.lineNumberTextView.frame; 
frameLine.size.height = self.codeTextView.contentSize.height +100; 
self.lineNumberTextView.frame = frameLine; 


return YES; 

}

jemand mir helfen kann, bitte

UPDATE:

ich dieses Problem gelöst haben, mit textViewDidChangeSelection Delegatmethode Verwendung hier ist der Code, den ich gemacht habe:

-(void)textViewDidChangeSelection:(UITextView *)textView{ 
counterAppear++; 

if (counterAppear == 1) { 

} 
else if (counterAppear == 2) { 
    isFistAppear = NO; 
    codeBuilderSelectedRange = textView.selectedRange; 

    [self getCursorPosition]; 
    CGFloat xPos = cursor.x - (0.5*self.view.frame.size.width); 

    if (cursor.x < self.view.frame.size.width) { 
     [[[self.viewCodeTextView subviews] lastObject] setContentOffset:CGPointMake(0, cursor.y) animated:YES]; 
    }else { 
     [[[self.viewCodeTextView subviews] lastObject] setContentOffset:CGPointMake(xPos, cursor.y) animated:YES]; 
    } 


}else if (isFistAppear == NO) { //kondisi saat keyboard masih appear & user pindah2 kursor 
    codeBuilderSelectedRange = textView.selectedRange; 
    [self getCursorPosition]; 
    NSLog(@"cursor x :%f, y : %f", cursor.x, cursor.y); 
} 

}

i die BOOL isFirstAppear in viewDidLoad gesetzt, habe ich diese weil, nachdem ich den selectedRange.location-Wert in textViewDidChangeSelection, es immer zweimal aufgerufen hat, gibt der erste Wert immer einen nicht gefundenen Wert, aber der zweite gibt einen richtigen Wert, also setze ich so. Der CounterAppear wurde in der Tastaturmethode gesetzt (ich habe eine Methode erstellt, die von NSNotification in viewDidLoad aufgerufen wurde). counterAppear ist der Wert, der mir die Differenzbedingung gibt, wenn ich auf die Textansicht tippe.

Antwort

1

In TextViewDidBeginEditing wird der Standortwert manchmal falsch. Um dies zu beheben, tun Sie dies:

+0

danke für die Antwort, aber ich habe dieses Problem gelöst, es tut mir leid, diese Frage noch nicht zu aktualisieren –