2011-01-06 71 views
1

我想從UITextView的光標位置,我已經實現How to find a pixel-positon of a cursor in UITextView?後的代碼,該算法在Pixel-Position of Cursor in UITextView基於算法。我如何獲得selectedRange.location值?

我的問題是,後鍵盤出現在第2次我不能讓selectedRange.location價值,因爲它總是告訴該位置的值是2147483647,這意味着沒有找到。這是我的實現:

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

}

我叫textViewShouldBeginEditing方法的方法,這是實現:

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

}

有人可以幫助我,請

UPDATE:

我已經解決了這個問題,用textViewDidChangeSelection委託方法, 這裏是我所做的代碼:

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

}

我設置BOOL isFirstAppear在viewDidLoad中,我設置因爲,在我的NSLog在textViewDidChangeSelection的selectedRange.location值,它總是叫了兩聲,第一個值總是給出一個值未找到,但是第二給出一個正確的價值,所以我設置這樣的。我在鍵盤方法設置的counterAppear(ⅰ製成的,通過在NSNotification稱爲viewDidLoad中的方法)。 counterAppear是當我點擊textview時給予差異條件的值。

回答

1

在textViewDidBeginEditing,位置值將錯就錯的時候。要解決這個問題,請執行以下操作:

-(void)textViewDidBeginEditing:(UITextView *)textView { 
[self performSelector:@selector(beginEditing:) withObject:textView afterDelay:0]; }-(void)beginEditing:(UITextView*)sender { 
//code here } 
+0

謝謝你的回答,但我已經解決了這個問題,很遺憾我還沒有更新這個問題 – 2011-03-07 04:11:07