[ios] Replace InfoItemViewController with InfoItemView

To simplify logic and increase reusability

Signed-off-by: Kiryl Kaveryn <kirylkaveryn@gmail.com>
This commit is contained in:
Kiryl Kaveryn
2025-06-26 20:34:34 +04:00
committed by Yannik Bloscheck
parent 8e28470490
commit ec6a98a6fd
3 changed files with 144 additions and 197 deletions

View File

@@ -1,4 +1,14 @@
class InfoItemViewController: UIViewController {
final class InfoItemView: UIView {
private enum Constants {
static let imageViewWidth: CGFloat = 56
static let imageViewHeight: CGFloat = 28
static let accessoryButtonSize: CGFloat = 44
static let infoLabelFontSize: CGFloat = 16
static let infoLabelTopBottomSpacing: CGFloat = 10
static let stackViewSpacing: CGFloat = 0
static let viewHeight: CGFloat = 44
}
enum Style {
case regular
case link
@@ -6,9 +16,9 @@ class InfoItemViewController: UIViewController {
typealias TapHandler = () -> Void
@IBOutlet var imageView: UIImageView!
@IBOutlet var infoLabel: UILabel!
@IBOutlet var accessoryButton: UIButton!
let imageView = UIImageView()
let infoLabel = UILabel()
let accessoryButton = UIButton()
private var tapGestureRecognizer: UITapGestureRecognizer!
private var longPressGestureRecognizer: UILongPressGestureRecognizer!
@@ -19,19 +29,51 @@ class InfoItemViewController: UIViewController {
private var style: Style = .regular
override func viewDidLoad() {
super.viewDidLoad()
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setupView()
}
private func setupView() {
tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(onTap))
longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(onLongPress(_:)))
view.addGestureRecognizer(tapGestureRecognizer)
view.addGestureRecognizer(longPressGestureRecognizer)
addGestureRecognizer(tapGestureRecognizer)
addGestureRecognizer(longPressGestureRecognizer)
imageView.contentMode = .scaleAspectFit
accessoryButton.addTarget(self, action: #selector(onAccessoryButtonTap), for: .touchUpInside)
setStyle(style)
addSubview(imageView)
addSubview(infoLabel)
addSubview(accessoryButton)
translatesAutoresizingMaskIntoConstraints = false
imageView.translatesAutoresizingMaskIntoConstraints = false
infoLabel.translatesAutoresizingMaskIntoConstraints = false
accessoryButton.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
heightAnchor.constraint(equalToConstant: Constants.viewHeight),
imageView.leadingAnchor.constraint(equalTo: leadingAnchor),
imageView.centerYAnchor.constraint(equalTo: centerYAnchor),
imageView.widthAnchor.constraint(equalToConstant: Constants.imageViewWidth),
imageView.heightAnchor.constraint(equalToConstant: Constants.imageViewHeight),
infoLabel.leadingAnchor.constraint(equalTo: imageView.trailingAnchor),
infoLabel.centerYAnchor.constraint(equalTo: centerYAnchor),
infoLabel.trailingAnchor.constraint(equalTo: accessoryButton.leadingAnchor),
accessoryButton.trailingAnchor.constraint(equalTo: trailingAnchor),
accessoryButton.centerYAnchor.constraint(equalTo: centerYAnchor),
accessoryButton.widthAnchor.constraint(equalToConstant: Constants.accessoryButtonSize),
accessoryButton.heightAnchor.constraint(equalToConstant: Constants.accessoryButtonSize)
])
}
@objc
@@ -53,11 +95,11 @@ class InfoItemViewController: UIViewController {
func setStyle(_ style: Style) {
switch style {
case .regular:
imageView?.setStyleAndApply(.black)
infoLabel?.setFontStyleAndApply(.blackPrimary)
imageView.setStyleAndApply(.black)
infoLabel.setFontStyleAndApply(.regular16, color: .blackPrimary)
case .link:
imageView?.setStyleAndApply(.blue)
infoLabel?.setFontStyleAndApply(.linkBlue)
imageView.setStyleAndApply(.blue)
infoLabel.setFontStyleAndApply(.regular16, color: .linkBlue)
}
accessoryButton.setStyleAndApply(.black)
self.style = style
@@ -96,44 +138,45 @@ class PlacePageInfoViewController: UIViewController {
private struct Constants {
static let coordFormatIdKey = "PlacePageInfoViewController_coordFormatIdKey"
}
private typealias TapHandler = InfoItemViewController.TapHandler
private typealias Style = InfoItemViewController.Style
private typealias TapHandler = InfoItemView.TapHandler
private typealias Style = InfoItemView.Style
@IBOutlet var stackView: UIStackView!
private lazy var openingHoursView: OpeningHoursViewController = {
private lazy var openingHoursViewController: OpeningHoursViewController = {
storyboard!.instantiateViewController(ofType: OpeningHoursViewController.self)
}()
private var rawOpeningHoursView: InfoItemViewController?
private var phoneViews: [InfoItemViewController] = []
private var websiteView: InfoItemViewController?
private var websiteMenuView: InfoItemViewController?
private var wikipediaView: InfoItemViewController?
private var wikimediaCommonsView: InfoItemViewController?
private var emailView: InfoItemViewController?
private var fediverseView: InfoItemViewController?
private var facebookView: InfoItemViewController?
private var instagramView: InfoItemViewController?
private var twitterView: InfoItemViewController?
private var vkView: InfoItemViewController?
private var lineView: InfoItemViewController?
private var blueskyView: InfoItemViewController?
private var panoramaxView: InfoItemViewController?
private var cuisineView: InfoItemViewController?
private var operatorView: InfoItemViewController?
private var wifiView: InfoItemViewController?
private var atmView: InfoItemViewController?
private var addressView: InfoItemViewController?
private var levelView: InfoItemViewController?
private var coordinatesView: InfoItemViewController?
private var openWithAppView: InfoItemViewController?
private var capacityView: InfoItemViewController?
private var wheelchairView: InfoItemViewController?
private var selfServiceView: InfoItemViewController?
private var outdoorSeatingView: InfoItemViewController?
private var driveThroughView: InfoItemViewController?
private var networkView: InfoItemViewController?
private var rawOpeningHoursView: InfoItemView?
private var phoneViews: [InfoItemView] = []
private var websiteView: InfoItemView?
private var websiteMenuView: InfoItemView?
private var wikipediaView: InfoItemView?
private var wikimediaCommonsView: InfoItemView?
private var emailView: InfoItemView?
private var fediverseView: InfoItemView?
private var facebookView: InfoItemView?
private var instagramView: InfoItemView?
private var twitterView: InfoItemView?
private var vkView: InfoItemView?
private var lineView: InfoItemView?
private var blueskyView: InfoItemView?
private var panoramaxView: InfoItemView?
private var cuisineView: InfoItemView?
private var operatorView: InfoItemView?
private var wifiView: InfoItemView?
private var atmView: InfoItemView?
private var addressView: InfoItemView?
private var levelView: InfoItemView?
private var coordinatesView: InfoItemView?
private var openWithAppView: InfoItemView?
private var capacityView: InfoItemView?
private var wheelchairView: InfoItemView?
private var selfServiceView: InfoItemView?
private var outdoorSeatingView: InfoItemView?
private var driveThroughView: InfoItemView?
private var networkView: InfoItemView?
weak var placePageInfoData: PlacePageInfoData!
weak var delegate: PlacePageInfoViewControllerDelegate?
@@ -144,14 +187,27 @@ class PlacePageInfoViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
stackView.axis = .vertical
stackView.alignment = .fill
stackView.spacing = 0
stackView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(stackView)
NSLayoutConstraint.activate([
stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
stackView.topAnchor.constraint(equalTo: view.topAnchor),
stackView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])
setupViews()
}
// MARK: private
private func setupViews() {
if let openingHours = placePageInfoData.openingHours {
openingHoursView.openingHours = openingHours
addToStack(openingHoursView)
openingHoursViewController.openingHours = openingHours
addChild(openingHoursViewController)
addToStack(openingHoursViewController.view)
openingHoursViewController.didMove(toParent: self)
} else if let openingHoursString = placePageInfoData.openingHoursString {
rawOpeningHoursView = createInfoItem(openingHoursString, icon: UIImage(named: "ic_placepage_open_hours"))
rawOpeningHoursView?.infoLabel.numberOfLines = 0
@@ -182,7 +238,7 @@ class PlacePageInfoViewController: UIViewController {
if let ppOperator = placePageInfoData.ppOperator {
operatorView = createInfoItem(ppOperator, icon: UIImage(named: "ic_placepage_operator"))
}
if let network = placePageInfoData.network {
networkView = createInfoItem(network, icon: UIImage(named: "ic_placepage_network"))
}
@@ -437,7 +493,7 @@ class PlacePageInfoViewController: UIViewController {
style: .link,
tapHandler: { [weak self] in
guard let self, let openWithAppView else { return }
self.delegate?.didPressOpenInApp(from: openWithAppView.view)
self.delegate?.didPressOpenInApp(from: openWithAppView)
})
}
@@ -447,22 +503,20 @@ class PlacePageInfoViewController: UIViewController {
accessoryImage: UIImage? = nil,
tapHandler: TapHandler? = nil,
longPressHandler: TapHandler? = nil,
accessoryImageTapHandler: TapHandler? = nil) -> InfoItemViewController {
let vc = storyboard!.instantiateViewController(ofType: InfoItemViewController.self)
addToStack(vc)
vc.imageView.image = icon
vc.infoLabel.text = info
vc.setStyle(style)
vc.tapHandler = tapHandler
vc.longPressHandler = longPressHandler
vc.setAccessory(image: accessoryImage, tapHandler: accessoryImageTapHandler)
return vc;
accessoryImageTapHandler: TapHandler? = nil) -> InfoItemView {
let view = InfoItemView()
addToStack(view)
view.imageView.image = icon?.withRenderingMode(.alwaysTemplate)
view.infoLabel.text = info
view.setStyle(style)
view.tapHandler = tapHandler
view.longPressHandler = longPressHandler
view.setAccessory(image: accessoryImage, tapHandler: accessoryImageTapHandler)
return view
}
private func addToStack(_ viewController: UIViewController) {
addChild(viewController)
stackView.addArrangedSubviewWithSeparator(viewController.view, insets: UIEdgeInsets(top: 0, left: 56, bottom: 0, right: 0))
viewController.didMove(toParent: self)
private func addToStack(_ view: UIView) {
stackView.addArrangedSubviewWithSeparator(view, insets: UIEdgeInsets(top: 0, left: 56, bottom: 0, right: 0))
}
private static let kHttp = "http://"