Большие заголовки с UITableView и UIImage в качестве фона

#ios #swift #uitableview #uinavigationbar #programmatically

#iOS #swift #uitableview #панель навигации #программно

Вопрос:

Я создаю финансовое приложение. У меня есть UINavigationController, обернутый вокруг UIViewController. Большие заголовки на панели навигации включены. Я использую UITableView в качестве скроллера и UIImageView с изображением png в качестве фона. Теперь, когда я прокручиваю UITableView вниз, я ожидаю, что большие заголовки сменятся на обычные заголовки. Кстати, моя панель навигации несколько прозрачна. Я даже не пытаюсь спросить вас, ребята, как исправить переход от больших заголовков к обычным заголовкам на панели навигации, поскольку я уверен, что никто не знает, как это сделать. По крайней мере, ни одно из исправлений, которые предлагались здесь в течение 7 лет, не могло исправить это для меня. И, как я узнал здесь: https://www.reddit.com/r/iOSProgramming/comments/7k60dl/ios11_large_titles_not_shrinking_tip /, тот, кто все еще пытается разобраться в этой проблеме, должен просто отказаться от всех надежд. НЕВОЗМОЖНО ПОМЕСТИТЬ UIIMAGEVIEWE ЗА ТАБЛИЧНЫМ ПРЕДСТАВЛЕНИЕМ И ОЖИДАТЬ, ЧТО ПЕРЕХОД БОЛЬШИХ ЗАГОЛОВКОВ БУДЕТ РАБОТАТЬ НОРМАЛЬНО.

Поэтому я прикрепил таблицу к основному представлению и применил фон непосредственно к таблице. Переход начал работать, но очень медленно и с икотой. Но проблема не в этом. Поскольку у меня прозрачная панель навигации, я хочу, чтобы фон занимал весь экран, а UITableView был прикреплен к безопасной области сверху, чтобы ничего не было за панелью навигации.

Вот где загадка. Если я прикреплю фоновое изображение к таблице и закреплю таблицу в безопасной области, всякий раз, когда я прокручиваю вниз, большие заголовки уменьшаются, но фоновое изображение растягивается, как Stretch Armstrong. Это выглядит глупо. Но если я прикреплю табличное представление к супер-представлению, прокручиваемый контент отображается на панели навигации.

Вопрос: Как мне прикрепить таблицу к безопасной области, но сделать так, чтобы фон расширялся до super view, а переход между большими заголовками и обычными заголовками оставался на месте? Чтобы содержимое не отображалось за прозрачной панелью навигации. Вот мой viewDidLoad:

     override func viewDidLoad() {
    super.viewDidLoad()
    
    view.addSubview(masterTableViewAsViewScroller)
    masterTableViewAsViewScroller.delegate = self
    masterTableViewAsViewScroller.dataSource = self
    
    let masterTableViewBackground = UIImageView(image: UIImage(named: "moneyBg"))
    masterTableViewBackground.frame = self.masterTableViewAsViewScroller.frame
    self.masterTableViewAsViewScroller.backgroundView = masterTableViewBackground;
    masterTableViewAsViewScroller.pin(to: view)

    title = "Some Title"
    navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
    navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
    let image = UIImage.imageFromColor(color: UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.4))
    self.navigationController?.navigationBar.setBackgroundImage(image, for: UIBarMetrics.default)
    self.navigationController?.navigationBar.barStyle = .default
}
  

Кроме того, мои расширения, которые помещены в отдельный файл swift:

 import UIKit

extension UIView {
func pin(to superView: UIView) {
    translatesAutoresizingMaskIntoConstraints                             = false
    topAnchor.constraint(equalTo: superView.topAnchor).isActive           = true
    leadingAnchor.constraint(equalTo: superView.leadingAnchor).isActive   = true
    trailingAnchor.constraint(equalTo: superView.trailingAnchor).isActive = true
    bottomAnchor.constraint(equalTo: superView.bottomAnchor).isActive     = true
    }
}

extension UIImage{
    static func imageFromColor(color: UIColor) -> UIImage {
    let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
    UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
    color.setFill()
    UIRectFill(rect)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image! } }
  

Кстати, это повтор для закрепления безопасной области, которую я использую:

         if #available(iOS 11, *) {
          let guide = view.safeAreaLayoutGuide
          NSLayoutConstraint.activate([
            masterTableViewBackground.topAnchor.constraint(equalToSystemSpacingBelow: guide.topAnchor, multiplier: 1.0),
            guide.bottomAnchor.constraint(equalToSystemSpacingBelow:     masterTableViewBackground.bottomAnchor, multiplier: 1.0)
       ])
    } else {
       let standardSpacing: CGFloat = 8.0
       NSLayoutConstraint.activate([
        masterTableViewBackground.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: standardSpacing),
       bottomLayoutGuide.topAnchor.constraint(equalTo: masterTableViewBackground.bottomAnchor, constant: standardSpacing)
       ])
    }
  

Я добавляю GIF-файлы, чтобы вы могли видеть, о чем я говорю.

Gif1

Gif2

Комментарии:

1. Давайте, ребята, помогите мне!!