[ios] iPhone : 기본적으로 UITableView 검색 창 숨기기

Interface Builder를 사용하여 테이블보기를 만들었으며 여기에 라이브러리의 검색 표시 줄과 검색 디스플레이 컨트롤러를 추가하여 검색 기능을 추가했습니다. 그러나 IB는 뷰가 처음 표시 될 때 화면 상단에 막대가 표시되도록 설정했습니다.

검색 창을 기본적으로 숨기지 만 테이블보기로 스크롤 할 수있는 방법을 알고 싶습니다 (예는 Apple의 메일 애플리케이션 참조). 나는 전화 해봤 scrollRectToVisible:animated:에서 viewDidLoad테이블 뷰를 아래로 스크롤 할 수 있지만 아무 소용. 기본적으로 검색 창을 숨기는 선호하는 방법은 무엇입니까?



답변

먼저 UITableView의 tableHeaderView에 UISearchBar를 추가하여 테이블의 내용과 함께 스크롤되고 뷰 상단에 고정되지 않도록합니다.

검색 표시 줄은 테이블보기에서 행으로 계산되지 않으므로 테이블보기의 상단을 첫 번째 행으로 스크롤하면 검색 표시 줄이 ‘숨겨집니다’.

[yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

또는 Swift에서 :

yourTableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Top, animated: false)

데이터를 포함하기 전에 tableview를 스크롤 scrollToRowAtIndexPath하지 마십시오 (주어진 indexPath가 유효한 행을 가리 키지 않는 경우 (즉, tableview가 비어있는 경우) 예외가 발생 함).


답변

UITableView의 하위보기로 UISearchBar를 추가하지 마십시오. 필요하지 않습니다.

UITableView에는 이에 적합한 tableHeaderView 속성이 있습니다.

- (void) viewDidLoad {
    [super viewDidLoad];
    self.searchBar = [[[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)] autorelease];
    self.searchBar.showsCancelButton = YES;
    self.searchBar.delegate = self;
    self.tableView.tableHeaderView = self.searchBar;
}

기본적으로보고 싶지 않은 경우 :

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.tableView setContentOffset:CGPointMake(0, 44)];
}

다시 숨길 수있는 취소 버튼도 있습니다 …. (키보드 제거)

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    [self.tableView setContentOffset:CGPointMake(0, 44) animated:YES];
    [self.searchBar resignFirstResponder];
}


답변

contentOffset은 Tim과 Joe D’ Andrea의 의견에 언급되었지만 검색 창을 숨기는 애니메이션을 추가하여 약간 확장되었습니다. 검색 창이 그냥 사라지는 것은 예상치 못한 일이라는 것을 알았습니다.

iOS 4.0 이상을 대상으로하는 사람들을위한 약간의 업데이트를 시도해보십시오.

[UIView animateWithDuration:0.4 animations:^{
    self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height);
 } completion:nil];

이전 답변 :

[UIView beginAnimations:@"hidesearchbar" context:nil];
[UIView setAnimationDuration:0.4];
[UIView setAnimationBeginsFromCurrentState:YES];

self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height);

[UIView commitAnimations];


답변

이 솔루션에 대한 많은 답변이 있지만 나에게 잘 맞는 것은 없습니다.

이것은 완벽하게 작동합니다. 애니메이션이 없으며 수행됩니다.-viewDidLoad

 - (void)viewDidLoad {
     [super viewDidLoad];
     self.tableView.contentOffset = CGPointMake(0,  self.searchBar.frame.size.height - self.tableView.contentOffset.y);
 }

노트 :

코드는 searchBar @property검색 창에 연결된 이 있다고 가정합니다 . 그렇지 않은 경우 self.searchDisplayController.searchBar대신 사용할 수 있습니다.


답변

Swift 3 이상

내가 했어:

이것을 선언하십시오 var:

    var searchController = UISearchController()

그리고 viewDidLoad()방법

    searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.dimsBackgroundDuringPresentation = true
    searchController.searchBar.placeholder = NSLocalizedString("Search", comment: "")
    definesPresentationContext = true
    tableView.tableHeaderView = searchController.searchBar

    tableView.contentOffset = CGPoint(x: 0, y: searchController.searchBar.frame.size.height)


답변

내 목표는 뷰 컨트롤러가로드 될 때 스토리 보드에서 일반 TableView 스타일의 tableHeaderView에 추가 된 검색 창을 숨기고 사용자가 UITableView 상단에서 아래로 스크롤하면 막대를 표시하는 것이 었습니다. 그래서 저는 Swift를 사용 하고 있으며 확장 기능을 추가했습니다.

extension UITableView {
    func hideSearchBar() {
        if let bar = self.tableHeaderView as? UISearchBar {
            let height = CGRectGetHeight(bar.frame)
            let offset = self.contentOffset.y
            if offset < height {
                self.contentOffset = CGPointMake(0, height)
            }
        }
    }
}

있는 viewDidLoad () 단지 전화 :

self.tableView.hideSearchBar()


답변

iOS 가이 상황에서 삽입을 자동으로 조정하기 때문에 tableView를 채우기에 충분한 행이 없을 때 iOS 8에서 모든 기존 솔루션이 작동하지 않습니다. (충분한 행이 있으면 기존 답변이 좋습니다)

이 문제에 6 시간을 낭비한 후 마침내이 솔루션을 얻었습니다.

간단히 말해서, 셀이 충분하지 않으면 빈 셀을 tableView에 삽입해야하므로 tableView의 콘텐츠 크기가 충분히 커서 iOS가 삽입을 조정하지 않습니다.

Swift에서 한 방법은 다음과 같습니다.

1.) 변수 minimumCellNum를 클래스 속성으로 선언

var minimumCellNum: Int?

(2))을 계산 minimumCellNum하고 집합 tableView.contentOffsetviewWillAppear

let screenHeight = Int(UIScreen.mainScreen().bounds.height)

// 101 = Height of Status Bar(20) + Height of Navigation Bar(44) + Height of Tab Bar(49)
// you may need to subtract the height of other custom views from the screenHeight. For example, the height of your section headers.
self.minimumCellNum = (screenHeight - 103 - heightOfOtherCustomView) / heightOfYourCell
self.tableView.contentOffset = CGPointMake(0, 44)

3.) 안으로 tableView(tableView: UITableView, numberOfRowsInSection section: Int))

let numOfYourRows = YOUR LOGIC
if numOfYourRows > minimumCellNum {
    return numOfYourRows
} else {
    return minimumCellNum!
}

4.) selection속성이 인 빈 셀을 None스토리 보드와tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)

if indexPath.row < numOfYourRows {
    return YOUR CUSTOM CELL
} else {
    let cell = tableView.dequeueReusableCellWithIdentifier("EmptyCell", forIndexPath: indexPath) as! UITableViewCell
    return cell
}

5.) 안으로 tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

if tableView == self.tableView {
    if numOfYourRows < (indexPath.row + 1) {
        return
    }
    YOUR LOGIC OF SELECTING A CELL
}

이것은 완벽한 솔루션은 아니지만 iOS 8에서 실제로 작동하는 유일한 해결 방법입니다. 깔끔한 솔루션이 있는지 알고 싶습니다.