2016-12-08 1 views
10

근본 원인은 estimatedRowHeight이 기본이되는 UIScrollView.contentOffset에 대한 가정을하는 데 사용된다고 생각하지만 이는 추정치이므로 항상 정의에 따라 잘못 될 것입니다. 실제 행 높이는 셀 내용과 장치 방향에 따라 완전히 다릅니다.이 tableView textField 자동 레이아웃 오류는 어떻게 해결할 수 있습니까?

더 가까운 추정치를 제공하기 위해 estimatedHeightForRowAtIndexPath을 구현한다고해도 글리치는 여전히 존재합니다.

그래서 처음부터 시작하여 아래로 스크롤하면 TableView가 contentOffset을 셀 위치와 동기화하여 유지하면서 실제 셀 높이를 인식하므로 모두 잘됩니다. 그러나 모든 실제 셀 높이를 변경하면 UITableView이 동기화되지 않으므로 스크롤 할 위치를 알 수 없습니다.

는하지만 거기에, 때로는 UITextField 세포가 다른 세포의 상단에 종료됩니다 너무 일어나고 심지어 낯선 것들, 그리고

어쨌든 나는 간단한 예까지 모든 삶은 한 ... 거기에 붙어 상태로 유지됩니다. 아이폰 다음 소프트웨어 키보드를 사용 시뮬레이터를 사용하는 경우

https://github.com/trapper-/autolayout-glitch

  • 테스트합니다.
  • 스크롤링, 필드 선택 및 회전과 관련된 많은 시각적 결함을 볼 수 있습니다.
  • 간단한 반복 가능한 예입니다.
  • 아래로 스크롤하십시오.
  • UITextField's의 마지막 쌍 중 하나를 선택하여 UITableView이 스크롤해야 필드를 볼 수 있습니다.
  • 기기를 회전합니다.
+0

이상적은 아니지만 tableView 인스턴스의 reloadData 호출이 도움이됩니다. 너 해봤 니? –

+0

Autolayout은 UITableView와 잘 작동하지 않습니다. CollectionView 사용을 고려하십시오. 이것은 UITableView의 한계에 관한 훌륭한 글입니다 : https://pspdfkit.com/blog/2017/the-case-for-deprecating-uitableview/ –

+0

'UICollectionView'에는 이러한 종류의 글리치가 없다고 말하고 있습니까? 그렇다면 그것은 훌륭한 해결책이 될 것입니다. – trapper

답변

1

비슷한 문제를 겪었 기 때문에 몇 분 동안 코드로 놀랐습니다. 나는 내가 도울 수 있기를 바랬지 만, 완전히 고치지는 않았다.

제가 제공 할 수있는 것은 일부를으로 진행한다는 것입니다.

장치가 회전하면 UIViewcontroller 메서드를 구현하여 발생해야 할 상황을 알려야합니다. 이런 일이 발생하면 보이는 행을 캐시에서 제거하십시오. 그런 다음 테이블을 다시로드하고 표시되는 행으로 스크롤하십시오.

그것은 다음과 같습니다

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    // Save the visible row position 
    self.visibleRows = [self.tableView indexPathsForVisibleRows]; 
} 

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    [self.tableView reloadData]; 
    // Scroll to the saved position prior to screen rotate 
    [self.tableView scrollToRowAtIndexPath:[self.visibleRows objectAtIndex:0] atScrollPosition:UITableViewScrollPositionBottom animated:NO]; 
} 

visibleRows 당신의 ViewController에 배열 @property입니다.

이는 rightish 장소로 이동했다 (나는 당신이 실제로 사용자가 조작 된 개별 셀을 저장하는 경우,이 오른쪽 셀에 당신에게 모든 시간을 100 % 얻을 것이라고 생각한다.

이 무슨 짓을 몇 가지 장치 회전을 사용하여 춤추는 UITextFields가 잘못 배치되는 경우가 있습니다 (0120).

다시 말해서 솔루션이 아닙니다.하지만 본 내용을 공유하고 싶었 기 때문에 해결책을 찾는데 도움이됩니다. .

행운을 빌어 요!

+0

눈에 보이는 행 추적에 관한 나쁜 생각은 아니지만 scrollToRowAtIndexPath 메소드에도 많은 문제가 있습니다. 스크롤 할 곳을 알지 못합니다. 즉, indexPath를 올바른 contentOffset으로 올바르게 변환하지 않습니다. – trapper

+0

그래, 나는 그 세포가 처음부터 다람쥐처럼 뻗어있다는 사실과 관련이 있다고 생각한다. –

0

나는 당신의 문제는 라인입니다 확신한다 :

self.tableView.estimatedRowHeight = 44; 

이이 추정 높이의 주위에 몇 가지 최적화를하고있는 tableview 발생합니다. 나는 이것이 텍스트 필드가 선택되었을 때 왜 깨지는지를 잘 알지 못했습니다. 실제로 각 행의 높이를 명시 적으로 계산하면이 문제는 사라집니다 (이 예는 대략적인 예일 뿐이므로 실제 구현에 대해 좀 더 생각해 봐야합니다.)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (indexPath.row % 2) { 

     return 44.f; 

    } else { 

     NSString *text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; 

     CGRect frame = [text boundingRectWithSize:CGSizeMake(350.f, CGFLOAT_MAX) 
              options:NSStringDrawingUsesLineFragmentOrigin 
             attributes:@{ NSFontAttributeName:[UIFont systemFontOfSize:14.f] } 
              context:nil]; 

     return frame.size.height; 
    } 
} 
0

그 프로젝트를 살펴 보았습니다. 일부 문제를 완화하기위한 최선의 제안은 예상 높이 계산을 향상시키는 것이 었습니다. 텍스트 뷰 셀이 커질 것으로 예상되는 높이가 셀의 평균 높이에 더 가까울 필요가 있으므로 회전시 야생 크기 조정이 적습니다.

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath (NSIndexPath *)indexPath 
{ 
    if (indexPath.row % 2) { 
     return 44.0f; 
    } else { 
     return 175.0f; 
    } 
} 

는 지금의 UITextField와 이상한 문제에 관해서는, 나는, 당신은 UITextField에 셀이 재사용 된 경우에도 첫 번째로 반응이 아직도 경우하므로 이러한 세포, 심지어 회전에 재사용되고 있음을 고려할 필요가 있다고 생각 키보드가 텍스트 필드를 추적하는 데 문제가있는 곳입니다.

당신은 셀에 태그를 설정하여이 결과를 확인하고 무작위과 같이 회전에 순서를 변경하는 방법을 볼 수 있습니다 :

NSString* cellID = @"TextFieldCell"; 
TextFieldCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath]; 
NSLog(@"cell %@, changing to %@", @(cell.tag), @(indexPath.row)); 
cell.tag = indexPath.row; 
return cell; 

그것을위한 나의 제안 1)에서 텍스트 필드를 사용하지 않는 중 하나입니다 표보기 셀 또는 2) 사용자가 스크롤 항목에 텍스트를 입력 할 수있는 새로운 방법을 생각해보십시오. 예를 들어, 테이블 뷰 위에 뷰의 텍스트 필드 복사본을 놓고 텍스트를 입력하는 동안 수동으로 관리 한 다음 텍스트가 완료되면 텍스트를 셀에 다시 복사합니다. 3) 옵션 3은 키보드 관리자 라이브러리가 도움이되는지 확인하려고하는 것입니다. 나는 IQKeyboardManager을 사용하는 것을 정말 좋아합니다. 키보드 관리를 해결하는 데 정말 편리합니다.

관련 문제