iOS: Позиционирование обзора сбрасывается индикатором точки доступа

Мы показываем прямоугольник с меткой над табличным представлением, когда обнаруживаем ошибку:

введите описание изображения здесь

С помощью этого кода:

    // Fix location of message bar even as user scrolls table - per http://stackoverflow.com/q/7537858/47281
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let newY = self.tableView.contentOffset.y + self.navigationController!.navigationBar.frame.size.height + UIApplication.shared.statusBarFrame.height 
    // Show rectangle using 0 and newY ... 

Он работает хорошо, но в некоторых случаях не работает, например, когда включена личная точка доступа. Между панелью навигации и прямоугольником состояния есть разрыв:

введите описание изображения здесь

Как правильно размещать что-либо под панелью навигации?

В первом случае высота строки состояния равна 20, а во втором - 40. В обоих случаях панель навигации и смещение содержимого одинаковы. Т.е.:

  • Случай № 1: Смещение: -64,0, высота панели навигации: 44,0 Высота строки состояния: 20,0
  • Случай № 2: Смещение: -64,0, высота панели навигации: 44,0 Высота строки состояния: 40,0

Похоже, что смещение не увеличивается из-за изменения высоты в строке состояния.

Обновление: см. (мой) принятый ответ. Я уверен, что есть способ получше ... пожалуйста, добавьте его в тему, если вы его знаете.


person Marcus Leon    schedule 18.04.2017    source источник
comment
установить definePresentationContext = true   -  person Nazmul Hasan    schedule 18.04.2017
comment
У меня такая же проблема .. вы получили ответ без установки рамки?   -  person AbecedarioPoint    schedule 18.06.2018


Ответы (3)


property view.frame может зафиксировать такое изменение. Таким образом, использование view.frame.height для любого размещения может предотвратить репозиционирование.

Как он находит нужную высоту обзора с панелью горячих точек и без нее:

//with hotspot bar
print (view.frame.height) //540.0   
//without hotspot bar   
print (view.frame.height) //560.0

//setting a navigation bar at top using height of view frame
let navigationBar : UINavigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width:view.frame.width, height: view.frame.height/10))
    navigationBar.backgroundColor =  .gray
navigationBar.setItems([UINavigationItem(title: "navigaion bar")], animated: true)    

let statusbar = UITableView()
//placing the status bar below the navigation bar 
statusbar.frame = CGRect(x: 0, y: navigationBar.frame.size.height, width:view.frame.width, height: view.frame.height/10) //any choice for height:
view.addSubview(statusbar)
view.addSubview(navigationBar)
person beginner    schedule 23.09.2018
comment
Добавлены некоторые детали. - person beginner; 23.09.2018
comment
Рад, что это немного пригодилось. - person beginner; 25.09.2018

Вместо того, чтобы позиционировать ваше сообщение со значениями, полученными из фреймов, позиционируйте его с помощью автоматического размещения.

Есть несколько способов реализовать это - один из способов:

//... assuming this is being called from the parent view controller

    //safely unwrap the reference to the navigation controller
    guard let navController = self.navigationController else { return }
    let message = UIView()

    //arbitrary styles for example only
    message.backgroundColor = UIColor.blue
    //set translatesAutoresizingMaskIntoConstraints so constraints will work
    message.translatesAutoresizingMaskIntoConstraints = false

    //create constraints
    let height = NSLayoutConstraint(item: message, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1, constant: 50)
    let equalWidth = NSLayoutConstraint(item: message, attribute: NSLayoutAttribute.width, relatedBy: .equal, toItem: navController.navigationBar, attribute: .width, multiplier: 1.0, constant: 0)
    let alignBottom = NSLayoutConstraint(item: message, attribute: .top, relatedBy: .equal, toItem: navController.navigationBar, attribute: .bottom, multiplier: 1, constant: 0)
    //apply constraints
    message.addConstraint(height)
    navController.view.addSubview(message)
    navController.view.addConstraints([equalWidth, alignBottom])

Это также можно сделать с помощью VFL - но его многословие здесь, возможно, немного излишне.

В противном случае вы можете использовать отличные библиотеки, которые делают его еще более декларативным и сокращают шаблонный набор, например SnapKit.

person syllabix    schedule 18.04.2017
comment
предыдущий код был неверным, я обновил пример, чтобы он работал - person syllabix; 18.04.2017

Мое "решение для бедняков" заключалось в том, чтобы жестко указать 20 в качестве высоты строки состояния:

 var newY = self.tableView.contentOffset.y
 newY += self.navigationController!.navigationBar.frame.size.height
 newY += 20

Должен быть способ получше ... но, похоже, это работает.

person Marcus Leon    schedule 19.04.2017