나는 tableview와 uitextfield가있는 프로젝트에서 일하고 있습니다.
uitextfield가 포커스를 얻거나 잃을 때 다음 방법을 적용하고 있습니다.
-(void)enableInset {
CGFloat offSet = -30.0f;
UIEdgeInsets inset = UIEdgeInsetsMake(placesMapView.frame.size.height - offSet, 0.0f, 0.0f, 00.f);
// Updating the tableView position.
placesTableView.contentInset = inset;
placesTableView.contentOffset = CGPointMake(0.0f, -(placesMapView.frame.size.height - offSet));
placesTableView.scrollIndicatorInsets = inset;
}
과
- (void)disableInset {
CGFloat offset = self.navigationController.navigationBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height;
UIEdgeInsets inset = UIEdgeInsetsMake(offset, 0.0f, 0.0f, 00.f);
placesTableView.contentInset = inset;
placesTableView.contentOffset = CGPointMake(0.0f, -offset);
placesTableView.scrollIndicatorInsets = inset;
}
enableInset 메소드는 viewDidLayoutSubviews에서 호출됩니다. 그런 다음 disableInset 및 enableInset을 호출하면 UITableView를 더 이상 스크롤 할 수 없습니다.
내가 뭘 잘못 했어? 내가 어떤 대답을 찾을 수 있는지 아십니까?
편집 : 도움이된다면 github에 프로젝트를 추가했습니다.
https://github.com/Loadex/PlaceViewer
버그를 재현하려면 : 목록을 스크롤하고 검색 창을 탭한 다음 취소를 누르고 목록을 다시 스크롤 해보십시오.
이상하게 필터 버튼을 클릭하면 UIActionSheet가 닫히면 스크롤이 다시 작동합니다.
문제에 대한 해결책을 찾는 동안 placesTableView의 contentInset 하단 부분이 다른 상태를 통해 계속 변경된다는 것을 알았습니다. 지도를 볼 수있는 초기 상태에서는 0이었고 tableView는 예상대로 작동했습니다. 검색 필드를 탭한 후 키보드가 나타나면 216으로 설정되었습니다. 나는 이것이 tableView와 키보드 (알림 또는 PlacesQueryTableViewController에서 한 작업을 통해) 간의 자동화 된 통신이라고 생각했습니다. 하단 삽입이 키보드가 나타날 때 상단으로 설정되기를 원하기 때문에 괜찮습니다. 자, 여기 버기 부분이 있습니다. 취소 버튼을 눌렀을 때 contentInset.bottom이 -216으로 설정되었습니다.
왜 이런 일이 발생하는지 설명 할 수 없지만 삽입의 자동 변경이 구현되는 방식과 관련이 있다고 생각합니다. 나는 그것이와 같은 tableView.contentInset.bottom -= heightOfKeyboard
일을한다고 생각하며 아마 애니메이션이 끝나기 전이 아니라 끝날 때 일어날 것입니다. 문제의 원인은 애니메이션이 완료되기 전에 그리고 자동 변경이 발생하기 전에 contentInset의 하단을 변경한다는 것입니다. 따라서 사용자가 취소를 탭하자마자 하단을 0으로 설정합니다. 그런 다음 시스템이 들어 와서 키보드의 높이만큼 줄입니다. 216이됩니다. 이것이 제 생각에는 어쨌든 일어나고 있습니다.
이 문제를 해결하려면 contentInset의 하단 부분을 변경하지 말고 상단 부분 만 변경하십시오. placesTableView.contentInset.top
읽기 전용이지만 아래 코드 에서처럼하면 문제를 해결할 수 있습니다. 각 메서드에서 삽입 된 코드와 관련된 두 줄의 코드를 변경했습니다. 내가 뭘했는지 보셨 길 바랍니다.
-(void)enableInset {
NSLog(@"Enabling insets");
// Setting the tableView to overlay the map view
CGFloat offSet = [placestableViewController tableView:placestableViewController.tableView heightForRowAtIndexPath:nil] - 30.0f;
UIEdgeInsets inset = placesTableView.contentInset; // UIEdgeInsetsMake(placesMapView.frame.size.height - offSet, 0.0f, 0.0f, 0.0f);
inset.top = placesMapView.frame.size.height - offSet;
// Updating the tableView position.
placesTableView.contentInset = inset;
placesTableView.contentOffset = CGPointMake(0.0f, -(placesMapView.frame.size.height - offSet));
placesTableView.scrollIndicatorInsets = inset;
placesMapView.hidden = NO;
[placestableViewController loadObjects];}
- (void)disableInset {
NSLog(@"Disable insets");
CGFloat offset = self.navigationController.navigationBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height;
UIEdgeInsets inset = placesTableView.contentInset;// UIEdgeInsetsMake(offset, 0.0f, 0.0f, 0.0f);
inset.top = offset;
placesTableView.contentInset = inset;
placesTableView.contentOffset = CGPointMake(0.0f, -offset);
placesTableView.scrollIndicatorInsets = inset;
// Hidding the map while in search
placesMapView.hidden = YES;}
.
BTW, 다른 상태에서 contentInset 값을 어떻게 찾았는지 알고 싶다면 매우 간단합니다. 내가 한 일은에서 placesTableView의 대리인으로 자신을 설정하는 것이 었습니다 - (void)viewDidLoad
이런 placesTableView.delegate = self;
. 또한 UITableViewDelegate를 준수한다고 말 하도록 @interface
문을 로 변경 @interface KrackMapViewController () <UITableViewDelegate>
해야했습니다. 이제 트릭이 있습니다. UITableViewDelegate는 UIScrollViewDelegate를 따릅니다. 즉, 스크롤 뷰 델리게이트의 메서드를 구현할 수 있습니다. 특히 흥미로운 것은 다음과 같습니다.
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { NSLog(@"Did scroll with insetTop: %f, insetBottom: %f, contentOffset: %f", placesTableView.contentInset.top, placesTableView.contentInset.bottom, placesTableView.contentOffset.y); }
이를 통해 tableView를 드래그하기 시작할 때 알 수 있으며, 거기에서 단순히 다른 매개 변수를 NSLog out합니다.
도움이 되었기를 바랍니다. 이것이 당신에게 효과가 있는지 알려주십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다