2013-03-19 3 views
1

정적 사용자 정의 UITableViewCell이있는 UITableView이 있습니다. 반환 키를 누른 후 다음 응답자가 키보드에 숨겨지고있는 것처럼 현재 텍스트 필드를 스크롤해야합니다. 세트. 나는 scrollToRowAtIndexPath:atScrollPosition:animated:을 사용할 필요가 있다는 것을 압니다. 텍스트 상자 중 하나를 스크롤하는 방법은 무엇입니까? 다음 UITableViewController 클래스를 구현하여 당신을 위해이 문제를 처리 특정 UITextField가 포함 된 UITableViewCell로 스크롤

나는이 자신을 스크롤해야합니다 알고 있지만 UIViewControllerUITableViewController에서 파생 된 경우 (애플이 상태로는해야한다) UITextFieldDelegate, UIScrollViewDelegate 등 내 어플은 변경으로이 일을 중지 UIViewController에서 파생되고보기 컨트롤러의 UIView 위에 테이블보기를 추가하십시오. 따라서 기본적으로 UITableViewController의 기능이 누락되었습니다. 다른 이유로 인해 UIViewControler에서 파생되도록 선택했기 때문입니다.

답변

1

저는 항상이 작업을 수행합니다.

-(void)startEdit:(UITextField *)textField { 
    self.prevOffset = self.tableView.contentOffset.y; //I like storing the current offset so I can restore it when the text stops editing, you don't have to do this. 
    int offSet = [textField superview].frame.origin.y; //this gets the y coordinate of the cell the textField is in. If the table is not at 0,0, you also need to add [[textField superview] superview].frame.origin.y; 
    offSet-=(self.view.frame.size.height-KEYBOARD_HEIGHT)/2; //where KEYBOARD_HEIGHT is 216 in portrait and 160 in landscape; 
    if (offSet<0) offSet = 0; 
    [UIView animateWithDuration:0.3 animations:^{ 
     [self.tableView setContentOffset:CGPointMake(0,offSet)];}]; 
} 

나뿐만 아니라 다른 많은 것들을,하지만 그들이 믿지 : 나는 그것을 할 방법은 내가 텍스트 필드에 대한 UIControlEventEditingDidBegin에서 호출하는 방법이 있고, 그 방법에 내가있다 내 응용 프로그램에만 해당됩니다.

오프셋을 0보다 큰 경우 먼저 내가 그 일을하기 전에 갑자기 scrollViews가 있었기 때문에 contentInset을 UIEdgeInsetsMake (0,0, KEYBOARD_HEIGHT, 0)로 설정했습니다.

또한 원래 오프셋 (self.prevOffset)과 프레임의 높이가 콘텐츠 크기보다 큰 경우 (오프셋이 너무 낮게 설정된 다음 점프로 설정되기 때문에 점프가 발생 함) prevOffset을 MAX로 설정합니다 0, contentSize.height-frame.size.height).

이러한 것들은 꼭 필요한 것은 아니지만 점프하고있는 Scroll/TableViews를 가져와 사용해보십시오.

+0

완벽한 @Jsdoders에게 감사드립니다. – MrBeanzy

0

UITableViewController에는 이미 헤더 필드에 대리인 프로토콜이 있습니다. 클래스가 더 이상 UITableViewController가 아니므로, UITableView의 위임 프로토콜 헤더를 .h 파일에 수동으로 추가해야합니다.

UITableView가있는 사용자 지정보기 컨트롤러를 만들 때 위젯 메서드를 얻기 위해 UITableViewController로 시작하지만 UITableViewController를 UIViewController로 변경하고 대리자 프로토콜을 수동으로 추가합니다. 헤더.

원하는 경우 UITableViewController.h를보고 대리인 프로토콜을 통해 복사 할 수 있습니다. 참고로

그들은 :

<UITableViewDelegate, UITableViewDataSource> 

그래서 .H 파일은 다음과 유사하게 나타납니다

@interface MyTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

또한,에 컨트롤러의 대표를 설정하는 것을 잊지 마세요 인터페이스 빌더의 파일 소유자 또는 코드의 self.

0

자유롭게 사용할 수있는 Sensible TableView 프레임 워크와 같은 프레임 워크를 사용하는 것이 훨씬 쉽습니다. 이러한 프레임 워크는 일반적으로 모든 데이터 입력 셀을 즉시 제공하며 사용자를 대신하여 모든 스크롤/크기 조정 작업을 처리합니다.

관련 문제