Hiển thị thanh tìm kiếm trong thanh điều hướng mà không cần cuộn trên iOS 11


80

Tôi đang đính kèm UISearchController vào thuộc navigationItem.searchControllertính của UITableViewController trên iOS 11. Điều này hoạt động tốt: Tôi có thể sử dụng thanh tìm kiếm kiểu iOS 11 đẹp mắt.

Tuy nhiên, tôi muốn hiển thị thanh tìm kiếm khi khởi chạy. Theo mặc định, người dùng phải cuộn lên trong chế độ xem bảng để xem thanh tìm kiếm. Có ai biết làm thế nào là điều này là có thể?

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Còn lại: tình huống mặc định sau khi khởi chạy. Phải: hiển thị thanh tìm kiếm (bằng cách cuộn lên). Tôi muốn hiển thị thanh tìm kiếm sau khi khởi chạy, như trong ảnh chụp màn hình bên phải.

Tôi đã thấy rằng thanh tìm kiếm có thể được hiển thị bằng cách đặt thuộc tính hidesSearchBarWhenScrollingcủa mục điều hướng của tôi thành false. Tuy nhiên, điều này khiến thanh tìm kiếm luôn hiển thị - ngay cả khi cuộn xuống -, đó không phải là điều tôi muốn.


ở nơi bạn thêm mãhidesSearchBarWhenScrolling
Anbu.Karthik

1
những gì về đặt nó là s firstResponder?
Milan Nosáľ

2
Câu trả lời được chọn bên dưới phù hợp với tôi khi tải, nhưng tôi cũng muốn hiển thị lại Bộ điều khiển tìm kiếm khi cuộn lên trên cùng theo chương trình scrollView.setContentOffset(_:animated). Bất cứ ai có một đề nghị?
Justin Vallely

@Jonathan hidesSearchBarWhenScrolling = falseđặt thanh tìm kiếm trên tiêu đề lớn trong iOS 13. Bất kỳ ý tưởng nào nếu tôi có thể cập nhật điều này bằng cách nào đó?
Bonnke

Câu trả lời:


187

Điều sau làm cho thanh tìm kiếm hiển thị lúc đầu, sau đó cho phép nó ẩn khi cuộn:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = false
    }
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = true
    }
}

Việc sử dụng isActivekhông làm những gì tôi muốn, nó làm cho thanh tìm kiếm hoạt động (hiển thị nút hủy, v.v.), khi tất cả những gì tôi muốn là nó hiển thị.


Cảm ơn, đã làm việc cho tôi. Giải pháp thú vị mặc dù :)
Mikrasya

9
Giải pháp này hoạt động, nhưng có những tác dụng phụ nếu bạn cũng đang hiển thị thanh điều hướng nếu trước đó nó đã bị ẩn (tức là đẩy chế độ xem này w / thanh tìm kiếm lên ngăn xếp điều hướng) Thanh tìm kiếm sẽ xuất hiện tĩnh tại chỗ khi thanh điều hướng hoạt động. Trông thật kinh khủng :(
Matthew Crenshaw

12
Không nếu bạn đặt phần đầu tiên trong viewDidLoadthay vìviewWillAppear
Marc-Alexandre Bérubé

1
Ai đó có thể vui lòng giải thích tại sao điều này hoạt động và tại sao searchController.searchBar.isHidden = falsetrong viewDidLoad thì không? Loại thứ hai có vẻ xa hợp lý hơn đối với tôi
pho_pho

5
Điều này gây ra lỗi hình ảnh trong iOS 13 khi quay trở lại từ màn hình con.
nemissm

5

Bạn có thể đặt thuộc tính isActivethành truesau khi thêm searchController vào navigationItem.

Chỉ như thế này:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    searchController.isActive = true
}

Không có phương pháp setter 'setIsActive:'
Nikolay Krasnov

Bạn nói đúng, @NikolayKrasnov. isActivelà boolean chỉ đọc. Bạn sẽ muốn sử dụng searchController.active = truethay thế.
Mark Jeschke

2

Đối với tôi, nó đã hoạt động sau khi thêm các dòng sau trong viewDidLoad()phương thức:

navigationController?.navigationBar.prefersLargeTitles = true
navigationController!.navigationBar.sizeToFit()

0

Trên iOS 13, câu trả lời của @Jordan Wood không hoạt động. Thay vào đó tôi đã làm:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    UIView.performWithoutAnimation {
        searchController.isActive = true
        searchController.isActive = false
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.