#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-файлы, чтобы вы могли видеть, о чем я говорю.
Комментарии:
1. Давайте, ребята, помогите мне!!