2012-06-06 3 views
5

UIScrollView에는 텍스트 필드가있는 여러 동적 뷰가 있습니다. 상자 중 하나에 입력을 시작하면 필드가 화면 상단에 표시되도록 스크롤보기를 표시해야합니다 (키보드 위에 표시됨). 그것은 위대한 작품; 여기에 코드입니다 : 스크롤 뷰가 맨 위에까지 스크롤 할 때마다UIScrollView를 스크롤하여 가장 낮은 텍스트 필드를 표시합니다.

(void)didStartTyping:(id)sender { 
    [scrollView setContentOffset:CGPointMake(0, subView.frame.origin.y) animated:YES]; 
    scrollView.scrollEnabled = NO; 
} 

(void)didFinishTyping:(id)sender { 
    scrollView.scrollEnabled = YES; 
} 

그러나, 나는 가장 눈에 보이는 텍스트 필드에 입력을 시작, 그것은 약 40 픽셀로 충분히 (짧은 아래로 스크롤하지 않습니다). 의문의 여지는 스크롤 뷰의 상단에서 한 픽셀 아래로 스크롤하면 작동하지만 맨 위로 스크롤하면 매우 다르게 동작합니다.

+1

두 시나리오 모두에서 scollview의 프레임을 기록하고 거기에 무엇이 있는지 확인해야합니까? 내가 생각할 수있는 것은 아래쪽 오프셋을 늘릴 필요가 있다는 것입니다. – rishi

+0

글쎄, 그건 말이 되겠지. 그러나 현재로서는보기가 스크롤 될 때 밑보기의 텍스트 필드를 볼 수 없도록 하위보기의 크기를 조정하는 것이 추악한 해결 방법입니다. 최적은 아니지만 지금은 효과가 있습니다.이 문제로 돌아 가면 어떻게 진행되는지 알려 드리겠습니다. 고마워 리시. – Gazzini

+1

수동으로 스크롤보기를 원하는 위치로 스크롤 할 수 있습니다. 즉, 텍스트 필드에 포커스를 두지 않고 키보드가 나타나면 원하는 위치로 스크롤보기를 끌 수 있습니까? 원하는 위치로 드래그 할 수 있습니까? 대부분의 경우 스크롤 뷰의 콘텐츠 크기가 콘텐츠를 엄격하게 감싸는 경우 실제로 마지막 항목을 상단으로 가져올 수 없습니다. 이것을 말하는 또 다른 방법은 콘텐츠 크기 높이를 콘텐츠보다 훨씬 더 크게 설정할 수 있습니까? – danh

답변

2

이 작업을 수행하는 가장 좋은 방법은 키보드 프레임을 잡고 텍스트 뷰에서 textViewDidBeginEditing :이 호출되면 내 scrollview 인세 트를 업데이트하는 것입니다. 여기에 tableview를 사용하지만, 동일한 로직이 scrollview에 적용되어야합니다. 가장 큰 차이점은 스크롤하는 방법입니다. scrollToRowAtIndexPath를 사용하면 scrollRectToVisible을 사용할 것입니다.

//setup keyboard callbacks 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillHideNotification 
               object:nil]; 
} 

- (void)keyboardWillShow:(NSNotification*)aNotification 
{ 
    NSDictionary* info = [aNotification userInfo]; 
    kbFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
} 

//this is called from your UITextViewDelegate when textViewDidBeginEditing: is called 
- (void)updateActiveTextScroll:(UITextView*)textView 
{ 
    activeTextView = textView; 
    UIEdgeInsets inset; 
    UIInterfaceOrientation orient = [[UIApplication sharedApplication] statusBarOrientation]; 
    if(UIInterfaceOrientationIsLandscape(orient)) 
    { 
     inset = UIEdgeInsetsMake(0.0, 0.0, kbFrame.size.width, 0.0); 
    } 
    else 
    { 
     inset = UIEdgeInsetsMake(0.0, 0.0, kbFrame.size.height, 0.0); 
    } 
    myTableView.contentInset = inset; 
    myTableView.scrollIndicatorInsets = inset; 

    [myTableView scrollToRowAtIndexPath:activeNSIndexPath 
         atScrollPosition:UITableViewScrollPositionBottom 
           animated:YES]; 
} 

//dont forget to reset when the keyboard goes away 
- (void)keyboardWillBeHidden:(NSNotification*)aNotification 
{ 
    UIEdgeInsets inset = UIEdgeInsetsZero; 
    myTableView.contentInset = inset; 
    myTableView.scrollIndicatorInsets = inset; 
} 
관련 문제