2014-10-04 40 views
19

iOS 8 thêm một tính năng cực kỳ mới mẻ: ẩn thanh điều hướng khi người dùng đang cuộn.Ẩn thanh trạng thái trong khi cuộn

này với một dòng duy nhất trong viewDidload:

navigationController?.hidesBarsOnSwipe = true 

mát, không phải là nó?

Nhưng bây giờ tôi có một vấn đề nhỏ: khi thanh điều hướng bị ẩn, thanh trạng thái vẫn ở đây và chồng chéo nội dung, đó là xấu xí.

Tôi nên làm gì để ẩn nó khi thanh điều hướng bị ẩn?

+0

hey, đã bao giờ bạn tìm hiểu làm thế nào để làm điều này? cảm ơn! – dot

+0

Rất tiếc, bạn có thể thêm +1 không? – jmcastel

+0

Hãy xem câu hỏi của tôi: http://stackoverflow.com/questions/25870382/how-to-prevent-status-bar-from-overlapping-content-with-hidesbarsonswipe-set-on –

Trả lời

0

Tôi dựa vào câu trả lời này trên một số nhận xét về số this post, đó là suy đoán. Tôi không chắc chắn nếu điều này sẽ làm việc, bởi vì Apple không cung cấp cho chúng tôi bất kỳ cách trực tiếp hoặc phương pháp đại biểu cho khi thanh điều hướng ẩn.

Phân lớp UINavigationBar dưới dạng NavigationBar. Thêm một người quan sát sở hữu đối với tài sản hidden của nó như sau:

var hidden: Bool{ 
didSet{ 
    UIApplication.sharedApplication().setStatusBarHidden(self.hidden, animation: .Slide) 
} 
} 

Bạn muốn sau đó đi đến phương pháp viewDidLoad của bạn trong điều khiển giao diện chính của bạn, và thiết lập thuộc tính self.navigationBar của bạn (hoặc self.navigationController.navigationBar, không chắc chắn mà một) đến một instance của lớp NavigationBar mới của bạn.

Lưu ý rằng tôi không thể kiểm tra ngay bây giờ, hãy cho tôi biết cách thức hoạt động của tính năng này.

+0

Nó không. Tôi phải đặt tờ khai ẩn ẩn ở đâu? self.navigationController.navigationBar cho tôi "UINavigationController không có thành viên có tên là navigationBar". self.navigationBar cho tôi "myTableViewController không có thành viên được gọi là navigationBar" – jmcastel

+0

@jmcastel Không UINavigationController có thanh điều hướng không? https://developer.apple.com/library/ios/documentation/Uikit/reference/UINavigationController_Class/index.html#//apple_ref/occ/instp/UINavigationController/navigationBar – erdekhayser

+0

Tôi biết nhưng đó là lỗi; ( – jmcastel

1

này được cố định vấn đề đối với trong Xcode 6,1

navigationController .navigationBar.hidden = true

+1

tôi chỉ muốn ẩn thanh trạng thái khi navigationBar bị ẩn. – jmcastel

10

Override phương pháp sau đây trên UIViewController:

extension MyViewController { 
    override func prefersStatusBarHidden() -> Bool { 
    return barsHidden // this is a custom property 
    } 

    // Override only if you want a different animation than the default 
    override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation { 
    return .Slide 
    } 
} 

Cập nhật barsHidden nơi nào đó trong mã và gọi setNeedsStatusBarAppearanceUpdate()

0

Bạn có thể phát hiện các lần vuốt bằng cách sử dụng UISwipeGestureRecognizer. Tôi đang sử dụng nó trên UIWebView:

Trong viewDidLoad tôi có:

let swipeUp = UISwipeGestureRecognizer(target: self, action: "didSwipe") 
let swipeDown = UISwipeGestureRecognizer(target: self, action: "didSwipe") 
swipeUp.direction = UISwipeGestureRecognizerDirection.Up 
swipeDown.direction = UISwipeGestureRecognizerDirection.Down 
webView.addGestureRecognizer(swipeUp) 
webView.addGestureRecognizer(swipeDown) 
navigationController?.hidesBarsOnSwipe = true 

Tôi cũng có một phần mở rộng để viewController tôi, gọi WebViewViewController:

extension WebViewViewController { 
    override func prefersStatusBarHidden() -> Bool { 
     return hideStatusBar 
    } 

    override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation { 
     return UIStatusBarAnimation.Slide 
    } 
} 

Trên một mức độ lớp trong WebViewViewController của tôi Tôi cũng có:

var hideStatusBar = false 

func didSwipe() { 
    hideStatusBar = true 
} 
0

Được rồi tôi đã dành cả ngày để làm điều này, hy vọng rằng hel này ps một số người ra ngoài. Có một số barHideOnSwipeGestureRecognizer. Vì vậy, bạn có thể làm cho một người nghe cho UIPanGesture tương ứng, lưu ý rằng nếu thanh điều hướng bị ẩn thì nguồn gốc y của nó là -44.0; nếu không, đó là 0 (không phải 20 vì chúng tôi đã ẩn thanh trạng thái!).

Trong điều khiển xem của bạn:

// Declare at beginning 
var curFramePosition: Double! 
var showStatusBar: Bool = true 
self.navigationController?.barHideOnSwipeGestureRecognizer.addTarget(self, action: "didSwipe:") 

... 

override func viewDidLoad(){ 
    self.navigationController?.hidesBarsOnSwipe = true 
    curFramePosition = 0.0 // Not hidden 
    self.navigationController?.barHideOnSwipeGestureRecognizer.addTarget(self, action: "didSwipe:") 
    ... 
} 

func didSwipe(swipe: UIPanGestureRecognizer){ 
    // Visible to hidden 
    if curFramePosition == 0 && self.navigationController?.navigationBar.frame.origin.y == -44 { 
     curFramePosition = -44 
     showStatusBar = false 
     prefersStatusBarHidden() 
     setNeedsStatusBarAppearanceUpdate() 
    } 
    // Hidden to visible 
    else if curFramePosition == -44 && self.navigationController?.navigationBar.frame.origin.y == 0 { 
     curFramePosition = 0 
     showStatusBar = true 
     prefersStatusBarHidden() 
     setNeedsStatusBarAppearanceUpdate() 
    } 
} 

override func prefersStatusBarHidden() -> Bool { 
    if showStatusBar{ 
     return false 
    } 
    return true 
} 
Các vấn đề liên quan