mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-20 13:23:59 +00:00
[ios] Implement New Edit view on the PlacePage screen
To allow change the color and group from directly from the then PP Signed-off-by: Kiryl Kaveryn <kirylkaveryn@gmail.com>
This commit is contained in:
committed by
Yannik Bloscheck
parent
ec6a98a6fd
commit
49d5335e7e
@@ -6,8 +6,8 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
|
|
||||||
@interface PlacePageTrackData (Core)
|
@interface PlacePageTrackData (Core)
|
||||||
|
|
||||||
- (instancetype)initWithTrack:(Track const &)track
|
- (instancetype)initWithRawData:(place_page::Info const &)rawData
|
||||||
onActivePointChanged:(MWMVoidBlock)onActivePointChangedHandler;
|
onActivePointChanged:(MWMVoidBlock)onActivePointChangedHandler;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <UIKit/UIColor.h>
|
||||||
#import "MWMTypes.h"
|
#import "MWMTypes.h"
|
||||||
|
|
||||||
@class TrackInfo;
|
@class TrackInfo;
|
||||||
@@ -10,6 +11,9 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
|
|
||||||
@property(nonatomic, readonly) MWMTrackID trackId;
|
@property(nonatomic, readonly) MWMTrackID trackId;
|
||||||
@property(nonatomic, readonly) MWMMarkGroupID groupId;
|
@property(nonatomic, readonly) MWMMarkGroupID groupId;
|
||||||
|
@property(nonatomic, readonly, nullable) NSString * trackCategory;
|
||||||
|
@property(nonatomic, readonly, nullable) NSString * trackDescription;
|
||||||
|
@property(nonatomic, readonly, nullable) UIColor * color;
|
||||||
@property(nonatomic, readwrite, nonnull) TrackInfo * trackInfo;
|
@property(nonatomic, readwrite, nonnull) TrackInfo * trackInfo;
|
||||||
@property(nonatomic, readwrite, nullable) ElevationProfileData * elevationProfileData;
|
@property(nonatomic, readwrite, nullable) ElevationProfileData * elevationProfileData;
|
||||||
@property(nonatomic, readonly) double activePointDistance;
|
@property(nonatomic, readonly) double activePointDistance;
|
||||||
|
|||||||
@@ -32,14 +32,27 @@
|
|||||||
|
|
||||||
@implementation PlacePageTrackData (Core)
|
@implementation PlacePageTrackData (Core)
|
||||||
|
|
||||||
- (instancetype)initWithTrack:(Track const &)track
|
- (instancetype)initWithRawData:(place_page::Info const &)rawData
|
||||||
onActivePointChanged:(MWMVoidBlock)onActivePointChangedHandler {
|
onActivePointChanged:(MWMVoidBlock)onActivePointChangedHandler {
|
||||||
self = [super init];
|
self = [super init];
|
||||||
if (self) {
|
if (self) {
|
||||||
_trackId = track.GetData().m_id;
|
auto const trackPtr = GetFramework().GetBookmarkManager().GetTrack(rawData.GetTrackId());
|
||||||
_trackInfo = [[TrackInfo alloc] initWithTrackStatistics:track.GetStatistics()];
|
auto const & track = *trackPtr;
|
||||||
|
|
||||||
auto const & bm = GetFramework().GetBookmarkManager();
|
auto const & bm = GetFramework().GetBookmarkManager();
|
||||||
|
|
||||||
|
_trackId = track.GetData().m_id;
|
||||||
|
|
||||||
|
auto const & groupId = track.GetGroupId();
|
||||||
|
if (groupId && bm.HasBmCategory(groupId)) {
|
||||||
|
_groupId = groupId;
|
||||||
|
_trackCategory = [NSString stringWithCString:bm.GetCategoryName(groupId).c_str() encoding:NSUTF8StringEncoding];
|
||||||
|
}
|
||||||
|
|
||||||
|
auto const color = track.GetColor(0);
|
||||||
|
_color = [UIColor colorWithRed:color.GetRedF() green:color.GetGreenF() blue:color.GetBlueF() alpha:1.f];
|
||||||
|
|
||||||
|
_trackDescription = [NSString stringWithCString:track.GetDescription().c_str() encoding:NSUTF8StringEncoding];
|
||||||
|
_trackInfo = [[TrackInfo alloc] initWithTrackStatistics:track.GetStatistics()];
|
||||||
_activePointDistance = bm.GetElevationActivePoint(_trackId);
|
_activePointDistance = bm.GetElevationActivePoint(_trackId);
|
||||||
_myPositionDistance = bm.GetElevationMyPosition(_trackId);
|
_myPositionDistance = bm.GetElevationMyPosition(_trackId);
|
||||||
_onActivePointChangedHandler = onActivePointChangedHandler;
|
_onActivePointChangedHandler = onActivePointChangedHandler;
|
||||||
|
|||||||
@@ -69,12 +69,10 @@ static PlacePageRoadType convertRoadType(RoadWarningMarkType roadType) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rawData().IsTrack()) {
|
if (rawData().IsTrack()) {
|
||||||
auto const & track = GetFramework().GetBookmarkManager().GetTrack(rawData().GetTrackId());
|
|
||||||
__weak auto weakSelf = self;
|
__weak auto weakSelf = self;
|
||||||
_trackData = [[PlacePageTrackData alloc] initWithTrack:*track onActivePointChanged:^(void) {
|
_trackData = [[PlacePageTrackData alloc] initWithRawData:rawData() onActivePointChanged:^(void) {
|
||||||
[weakSelf handleActiveTrackSelectionPointChanged];
|
[weakSelf handleActiveTrackSelectionPointChanged];
|
||||||
}];
|
}];
|
||||||
_isPreviewPlus = track->HasAltitudes();
|
|
||||||
}
|
}
|
||||||
_previewData = [[PlacePagePreviewData alloc] initWithRawData:rawData()];
|
_previewData = [[PlacePagePreviewData alloc] initWithRawData:rawData()];
|
||||||
|
|
||||||
@@ -144,6 +142,11 @@ static PlacePageRoadType convertRoadType(RoadWarningMarkType roadType) {
|
|||||||
}
|
}
|
||||||
if (rawData().IsBookmark()) {
|
if (rawData().IsBookmark()) {
|
||||||
_bookmarkData = [[PlacePageBookmarkData alloc] initWithRawData:rawData()];
|
_bookmarkData = [[PlacePageBookmarkData alloc] initWithRawData:rawData()];
|
||||||
|
} else if (rawData().IsTrack()) {
|
||||||
|
__weak auto weakSelf = self;
|
||||||
|
_trackData = [[PlacePageTrackData alloc] initWithRawData:rawData() onActivePointChanged:^(void) {
|
||||||
|
[weakSelf handleActiveTrackSelectionPointChanged];
|
||||||
|
}];
|
||||||
} else {
|
} else {
|
||||||
_bookmarkData = nil;
|
_bookmarkData = nil;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
protocol PlacePageEditBookmarkOrTrackViewControllerDelegate: AnyObject {
|
protocol PlacePageEditBookmarkOrTrackViewControllerDelegate: AnyObject {
|
||||||
|
func didUpdate(color: UIColor, category: MWMMarkGroupID, for data: PlacePageEditData)
|
||||||
func didPressEdit(_ data: PlacePageEditData)
|
func didPressEdit(_ data: PlacePageEditData)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11,14 +12,10 @@ final class PlacePageEditBookmarkOrTrackViewController: UIViewController {
|
|||||||
|
|
||||||
@IBOutlet var stackView: UIStackView!
|
@IBOutlet var stackView: UIStackView!
|
||||||
@IBOutlet var editView: InfoItemView!
|
@IBOutlet var editView: InfoItemView!
|
||||||
@IBOutlet var topConstraint: NSLayoutConstraint!
|
@IBOutlet var expandableLabelContainer: UIView!
|
||||||
@IBOutlet var expandableLabel: ExpandableLabel! {
|
@IBOutlet var expandableLabel: ExpandableLabel! {
|
||||||
didSet {
|
didSet {
|
||||||
expandableLabel.font = UIFont.regular14()
|
updateExpandableLabelStyle()
|
||||||
expandableLabel.textColor = UIColor.blackPrimaryText()
|
|
||||||
expandableLabel.numberOfLines = 5
|
|
||||||
expandableLabel.expandColor = UIColor.linkBlue()
|
|
||||||
expandableLabel.expandText = L("placepage_more_button")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -27,6 +24,7 @@ final class PlacePageEditBookmarkOrTrackViewController: UIViewController {
|
|||||||
updateViews()
|
updateViews()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
weak var delegate: PlacePageEditBookmarkOrTrackViewControllerDelegate?
|
weak var delegate: PlacePageEditBookmarkOrTrackViewControllerDelegate?
|
||||||
|
|
||||||
override func viewDidLoad() {
|
override func viewDidLoad() {
|
||||||
@@ -39,42 +37,114 @@ final class PlacePageEditBookmarkOrTrackViewController: UIViewController {
|
|||||||
updateViews()
|
updateViews()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
|
||||||
|
super.traitCollectionDidChange(previousTraitCollection)
|
||||||
|
if #available(iOS 13.0, *), traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
|
||||||
|
applyTheme()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Private methods
|
// MARK: - Private methods
|
||||||
|
|
||||||
private func updateViews() {
|
private func updateViews() {
|
||||||
guard let data else { return }
|
guard let data else { return }
|
||||||
|
|
||||||
|
let iconColor: UIColor
|
||||||
|
let category: String?
|
||||||
|
let description: String?
|
||||||
|
let isHtmlDescription: Bool
|
||||||
|
|
||||||
switch data {
|
switch data {
|
||||||
case .bookmark(let bookmark):
|
case .bookmark(let bookmarkData):
|
||||||
|
iconColor = bookmarkData.color.color
|
||||||
|
category = bookmarkData.bookmarkCategory
|
||||||
|
description = bookmarkData.bookmarkDescription
|
||||||
|
isHtmlDescription = bookmarkData.isHtmlDescription
|
||||||
|
case .track(let trackData):
|
||||||
|
iconColor = trackData.color ?? UIColor.buttonRed()
|
||||||
|
category = trackData.trackCategory
|
||||||
|
description = trackData.trackDescription
|
||||||
|
isHtmlDescription = false
|
||||||
|
}
|
||||||
|
|
||||||
editView.isHidden = false
|
let editColorImage = circleImageForColor(iconColor, frameSize: 28, diameter: 22, iconName: "ic_bm_none")
|
||||||
editView.imageView.image = UIImage(resource: .icFolder)
|
editView.iconButton.setImage(editColorImage, for: .normal)
|
||||||
editView.infoLabel.text = bookmark.bookmarkCategory
|
editView.infoLabel.text = category
|
||||||
editView.setStyle(.link)
|
editView.setStyle(.link)
|
||||||
editView.tapHandler = {
|
|
||||||
print("Edit bookmark tapped")
|
|
||||||
}
|
|
||||||
let accessoryImage = circleImageForColor(bookmark.color.color, frameSize: 28, diameter: 22, iconName: "ic_bm_none")
|
|
||||||
editView.setAccessory(image: accessoryImage, tapHandler: {
|
|
||||||
print("Accessory tapped")
|
|
||||||
})
|
|
||||||
|
|
||||||
if let description = bookmark.bookmarkDescription {
|
editView.iconButtonTapHandler = { [weak self] in
|
||||||
if bookmark.isHtmlDescription {
|
guard let self else { return }
|
||||||
setHtmlDescription(description)
|
self.showColorPicker()
|
||||||
topConstraint.constant = 16
|
}
|
||||||
} else {
|
editView.infoLabelTapHandler = { [weak self] in
|
||||||
expandableLabel.text = description
|
guard let self else { return }
|
||||||
topConstraint.constant = description.count > 0 ? 16 : 0
|
self.showGroupPicker()
|
||||||
}
|
}
|
||||||
|
editView.setAccessory(image: UIImage(resource: .ic24PxEdit), tapHandler: { [weak self] in
|
||||||
|
guard let self, let data = self.data else { return }
|
||||||
|
self.delegate?.didPressEdit(data)
|
||||||
|
})
|
||||||
|
|
||||||
|
if let description, !description.isEmpty {
|
||||||
|
expandableLabelContainer.isHidden = false
|
||||||
|
if isHtmlDescription {
|
||||||
|
setHtmlDescription(description)
|
||||||
} else {
|
} else {
|
||||||
topConstraint.constant = 0
|
expandableLabel.text = description
|
||||||
}
|
}
|
||||||
case .track:
|
updateExpandableLabelStyle()
|
||||||
|
} else {
|
||||||
|
expandableLabelContainer.isHidden = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: implement track editing
|
private func updateExpandableLabelStyle() {
|
||||||
|
expandableLabel.font = UIFont.regular14()
|
||||||
|
expandableLabel.textColor = UIColor.blackPrimaryText()
|
||||||
|
expandableLabel.numberOfLines = 5
|
||||||
|
expandableLabel.expandColor = UIColor.linkBlue()
|
||||||
|
expandableLabel.expandText = L("placepage_more_button")
|
||||||
|
}
|
||||||
|
|
||||||
expandableLabel.isHidden = true
|
private func showColorPicker() {
|
||||||
topConstraint.constant = 0
|
guard let data else { return }
|
||||||
|
switch data {
|
||||||
|
case .bookmark(let bookmarkData):
|
||||||
|
ColorPicker.shared.present(from: self, pickerType: .bookmarkColorPicker(bookmarkData.color)) { [weak self] color in
|
||||||
|
self?.update(color: color)
|
||||||
|
}
|
||||||
|
case .track(let trackData):
|
||||||
|
ColorPicker.shared.present(from: self, pickerType: .defaultColorPicker(trackData.color ?? .buttonRed())) { [weak self] color in
|
||||||
|
self?.update(color: color)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func showGroupPicker() {
|
||||||
|
guard let data else { return }
|
||||||
|
let groupId: MWMMarkGroupID
|
||||||
|
let groupName: String?
|
||||||
|
switch data {
|
||||||
|
case .bookmark(let bookmarkData):
|
||||||
|
groupId = bookmarkData.bookmarkGroupId
|
||||||
|
groupName = bookmarkData.bookmarkCategory
|
||||||
|
case .track(let trackData):
|
||||||
|
groupId = trackData.groupId
|
||||||
|
groupName = trackData.trackCategory
|
||||||
|
}
|
||||||
|
let groupViewController = SelectBookmarkGroupViewController(groupName: groupName ?? "", groupId: groupId)
|
||||||
|
let navigationController = UINavigationController(rootViewController: groupViewController)
|
||||||
|
groupViewController.delegate = self
|
||||||
|
present(navigationController, animated: true, completion: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func update(color: UIColor? = nil, category: MWMMarkGroupID? = nil) {
|
||||||
|
guard let data else { return }
|
||||||
|
switch data {
|
||||||
|
case .bookmark(let bookmarkData):
|
||||||
|
delegate?.didUpdate(color: color ?? bookmarkData.color.color, category: category ?? bookmarkData.bookmarkGroupId, for: data)
|
||||||
|
case .track(let trackData):
|
||||||
|
delegate?.didUpdate(color: color ?? trackData.color!, category: category ?? trackData.groupId, for: data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,11 +173,14 @@ final class PlacePageEditBookmarkOrTrackViewController: UIViewController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Actions
|
// MARK: - SelectBookmarkGroupViewControllerDelegate
|
||||||
|
extension PlacePageEditBookmarkOrTrackViewController: SelectBookmarkGroupViewControllerDelegate {
|
||||||
@IBAction func onEdit(_ sender: UIButton) {
|
func bookmarkGroupViewController(_ viewController: SelectBookmarkGroupViewController,
|
||||||
guard let data else { return }
|
didSelect groupTitle: String,
|
||||||
delegate?.didPressEdit(data)
|
groupId: MWMMarkGroupID) {
|
||||||
|
viewController.dismiss(animated: true)
|
||||||
|
update(category: groupId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
final class InfoItemView: UIView {
|
final class InfoItemView: UIView {
|
||||||
private enum Constants {
|
private enum Constants {
|
||||||
static let imageViewWidth: CGFloat = 56
|
static let viewHeight: CGFloat = 44
|
||||||
static let imageViewHeight: CGFloat = 28
|
static let stackViewSpacing: CGFloat = 0
|
||||||
static let accessoryButtonSize: CGFloat = 44
|
static let iconButtonSize: CGFloat = 56
|
||||||
|
static let iconButtonEdgeInsets = UIEdgeInsets(top: 8, left: 0, bottom: 8, right: 0)
|
||||||
static let infoLabelFontSize: CGFloat = 16
|
static let infoLabelFontSize: CGFloat = 16
|
||||||
static let infoLabelTopBottomSpacing: CGFloat = 10
|
static let infoLabelTopBottomSpacing: CGFloat = 10
|
||||||
static let stackViewSpacing: CGFloat = 0
|
static let accessoryButtonSize: CGFloat = 44
|
||||||
static let viewHeight: CGFloat = 44
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Style {
|
enum Style {
|
||||||
@@ -16,15 +16,13 @@ final class InfoItemView: UIView {
|
|||||||
|
|
||||||
typealias TapHandler = () -> Void
|
typealias TapHandler = () -> Void
|
||||||
|
|
||||||
let imageView = UIImageView()
|
let iconButton = UIButton()
|
||||||
let infoLabel = UILabel()
|
let infoLabel = UILabel()
|
||||||
let accessoryButton = UIButton()
|
let accessoryButton = UIButton()
|
||||||
|
|
||||||
private var tapGestureRecognizer: UITapGestureRecognizer!
|
var infoLabelTapHandler: TapHandler?
|
||||||
private var longPressGestureRecognizer: UILongPressGestureRecognizer!
|
var infoLabelLongPressHandler: TapHandler?
|
||||||
|
var iconButtonTapHandler: TapHandler?
|
||||||
var tapHandler: TapHandler?
|
|
||||||
var longPressHandler: TapHandler?
|
|
||||||
var accessoryImageTapHandler: TapHandler?
|
var accessoryImageTapHandler: TapHandler?
|
||||||
|
|
||||||
private var style: Style = .regular
|
private var style: Style = .regular
|
||||||
@@ -32,59 +30,77 @@ final class InfoItemView: UIView {
|
|||||||
override init(frame: CGRect) {
|
override init(frame: CGRect) {
|
||||||
super.init(frame: frame)
|
super.init(frame: frame)
|
||||||
setupView()
|
setupView()
|
||||||
|
layout()
|
||||||
}
|
}
|
||||||
|
|
||||||
required init?(coder: NSCoder) {
|
required init?(coder: NSCoder) {
|
||||||
super.init(coder: coder)
|
super.init(coder: coder)
|
||||||
setupView()
|
setupView()
|
||||||
|
layout()
|
||||||
}
|
}
|
||||||
|
|
||||||
private func setupView() {
|
private func setupView() {
|
||||||
tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(onTap))
|
addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(onInfoLabelTap)))
|
||||||
longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(onLongPress(_:)))
|
addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(onInfoLabelLongPress(_:))))
|
||||||
addGestureRecognizer(tapGestureRecognizer)
|
|
||||||
addGestureRecognizer(longPressGestureRecognizer)
|
infoLabel.lineBreakMode = .byTruncatingTail
|
||||||
|
infoLabel.numberOfLines = 1
|
||||||
|
infoLabel.allowsDefaultTighteningForTruncation = true
|
||||||
|
infoLabel.isUserInteractionEnabled = false
|
||||||
|
|
||||||
|
iconButton.imageView?.contentMode = .scaleAspectFit
|
||||||
|
iconButton.addTarget(self, action: #selector(onIconButtonTap), for: .touchUpInside)
|
||||||
|
iconButton.contentEdgeInsets = Constants.iconButtonEdgeInsets
|
||||||
|
|
||||||
imageView.contentMode = .scaleAspectFit
|
|
||||||
accessoryButton.addTarget(self, action: #selector(onAccessoryButtonTap), for: .touchUpInside)
|
accessoryButton.addTarget(self, action: #selector(onAccessoryButtonTap), for: .touchUpInside)
|
||||||
|
}
|
||||||
|
|
||||||
addSubview(imageView)
|
private func layout() {
|
||||||
|
addSubview(iconButton)
|
||||||
addSubview(infoLabel)
|
addSubview(infoLabel)
|
||||||
addSubview(accessoryButton)
|
addSubview(accessoryButton)
|
||||||
|
|
||||||
translatesAutoresizingMaskIntoConstraints = false
|
translatesAutoresizingMaskIntoConstraints = false
|
||||||
imageView.translatesAutoresizingMaskIntoConstraints = false
|
iconButton.translatesAutoresizingMaskIntoConstraints = false
|
||||||
infoLabel.translatesAutoresizingMaskIntoConstraints = false
|
infoLabel.translatesAutoresizingMaskIntoConstraints = false
|
||||||
accessoryButton.translatesAutoresizingMaskIntoConstraints = false
|
accessoryButton.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
|
||||||
NSLayoutConstraint.activate([
|
NSLayoutConstraint.activate([
|
||||||
heightAnchor.constraint(equalToConstant: Constants.viewHeight),
|
heightAnchor.constraint(equalToConstant: Constants.viewHeight),
|
||||||
|
|
||||||
imageView.leadingAnchor.constraint(equalTo: leadingAnchor),
|
iconButton.leadingAnchor.constraint(equalTo: leadingAnchor),
|
||||||
imageView.centerYAnchor.constraint(equalTo: centerYAnchor),
|
iconButton.centerYAnchor.constraint(equalTo: centerYAnchor),
|
||||||
imageView.widthAnchor.constraint(equalToConstant: Constants.imageViewWidth),
|
iconButton.widthAnchor.constraint(equalToConstant: Constants.iconButtonSize),
|
||||||
imageView.heightAnchor.constraint(equalToConstant: Constants.imageViewHeight),
|
iconButton.topAnchor.constraint(equalTo: topAnchor),
|
||||||
|
iconButton.bottomAnchor.constraint(equalTo: bottomAnchor),
|
||||||
|
|
||||||
infoLabel.leadingAnchor.constraint(equalTo: imageView.trailingAnchor),
|
infoLabel.leadingAnchor.constraint(equalTo: iconButton.trailingAnchor),
|
||||||
infoLabel.centerYAnchor.constraint(equalTo: centerYAnchor),
|
infoLabel.topAnchor.constraint(equalTo: topAnchor),
|
||||||
|
infoLabel.bottomAnchor.constraint(equalTo: bottomAnchor),
|
||||||
infoLabel.trailingAnchor.constraint(equalTo: accessoryButton.leadingAnchor),
|
infoLabel.trailingAnchor.constraint(equalTo: accessoryButton.leadingAnchor),
|
||||||
|
|
||||||
accessoryButton.trailingAnchor.constraint(equalTo: trailingAnchor),
|
accessoryButton.trailingAnchor.constraint(equalTo: trailingAnchor),
|
||||||
accessoryButton.centerYAnchor.constraint(equalTo: centerYAnchor),
|
accessoryButton.centerYAnchor.constraint(equalTo: centerYAnchor),
|
||||||
accessoryButton.widthAnchor.constraint(equalToConstant: Constants.accessoryButtonSize),
|
accessoryButton.widthAnchor.constraint(equalToConstant: Constants.accessoryButtonSize),
|
||||||
accessoryButton.heightAnchor.constraint(equalToConstant: Constants.accessoryButtonSize)
|
accessoryButton.topAnchor.constraint(equalTo: topAnchor),
|
||||||
|
accessoryButton.bottomAnchor.constraint(equalTo: bottomAnchor)
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
private func onTap() {
|
private func onInfoLabelTap() {
|
||||||
tapHandler?()
|
infoLabelTapHandler?()
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
private func onLongPress(_ sender: UILongPressGestureRecognizer) {
|
private func onInfoLabelLongPress(_ sender: UILongPressGestureRecognizer) {
|
||||||
guard sender.state == .began else { return }
|
guard sender.state == .began else { return }
|
||||||
longPressHandler?()
|
infoLabelLongPressHandler?()
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc
|
||||||
|
private func onIconButtonTap() {
|
||||||
|
iconButtonTapHandler?()
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc
|
@objc
|
||||||
@@ -95,10 +111,10 @@ final class InfoItemView: UIView {
|
|||||||
func setStyle(_ style: Style) {
|
func setStyle(_ style: Style) {
|
||||||
switch style {
|
switch style {
|
||||||
case .regular:
|
case .regular:
|
||||||
imageView.setStyleAndApply(.black)
|
iconButton.setStyleAndApply(.black)
|
||||||
infoLabel.setFontStyleAndApply(.regular16, color: .blackPrimary)
|
infoLabel.setFontStyleAndApply(.regular16, color: .blackPrimary)
|
||||||
case .link:
|
case .link:
|
||||||
imageView.setStyleAndApply(.blue)
|
iconButton.setStyleAndApply(.blue)
|
||||||
infoLabel.setFontStyleAndApply(.regular16, color: .linkBlue)
|
infoLabel.setFontStyleAndApply(.regular16, color: .linkBlue)
|
||||||
}
|
}
|
||||||
accessoryButton.setStyleAndApply(.black)
|
accessoryButton.setStyleAndApply(.black)
|
||||||
@@ -499,6 +515,7 @@ class PlacePageInfoViewController: UIViewController {
|
|||||||
|
|
||||||
private func createInfoItem(_ info: String,
|
private func createInfoItem(_ info: String,
|
||||||
icon: UIImage?,
|
icon: UIImage?,
|
||||||
|
tapIconHandler: TapHandler? = nil,
|
||||||
style: Style = .regular,
|
style: Style = .regular,
|
||||||
accessoryImage: UIImage? = nil,
|
accessoryImage: UIImage? = nil,
|
||||||
tapHandler: TapHandler? = nil,
|
tapHandler: TapHandler? = nil,
|
||||||
@@ -506,11 +523,12 @@ class PlacePageInfoViewController: UIViewController {
|
|||||||
accessoryImageTapHandler: TapHandler? = nil) -> InfoItemView {
|
accessoryImageTapHandler: TapHandler? = nil) -> InfoItemView {
|
||||||
let view = InfoItemView()
|
let view = InfoItemView()
|
||||||
addToStack(view)
|
addToStack(view)
|
||||||
view.imageView.image = icon?.withRenderingMode(.alwaysTemplate)
|
view.iconButton.setImage(icon?.withRenderingMode(.alwaysTemplate), for: .normal)
|
||||||
|
view.iconButtonTapHandler = tapIconHandler
|
||||||
view.infoLabel.text = info
|
view.infoLabel.text = info
|
||||||
view.setStyle(style)
|
view.setStyle(style)
|
||||||
view.tapHandler = tapHandler
|
view.infoLabelTapHandler = tapHandler
|
||||||
view.longPressHandler = longPressHandler
|
view.infoLabelLongPressHandler = longPressHandler
|
||||||
view.setAccessory(image: accessoryImage, tapHandler: accessoryImageTapHandler)
|
view.setAccessory(image: accessoryImage, tapHandler: accessoryImageTapHandler)
|
||||||
return view
|
return view
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1126,21 +1126,33 @@
|
|||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="iB6-kj-Bi1">
|
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="iB6-kj-Bi1">
|
||||||
<rect key="frame" x="16" y="16" width="343" height="184"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="200"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="wB7-XJ-Nck" userLabel="Edit View" customClass="InfoItemView" customModule="CoMaps" customModuleProvider="target">
|
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="wB7-XJ-Nck" userLabel="Edit View" customClass="InfoItemView" customModule="CoMaps" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="343" height="44"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||||
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="height" constant="44" id="Dh1-Jl-owY"/>
|
<constraint firstAttribute="height" constant="44" id="Dh1-Jl-owY"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
<view contentMode="scaleToFill" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="5nz-eA-gNS" customClass="ExpandableLabel" customModule="CoMaps" customModuleProvider="target">
|
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6GV-eD-5Hj" userLabel="Expandable Label Container">
|
||||||
<rect key="frame" x="0.0" y="44" width="343" height="140"/>
|
<rect key="frame" x="0.0" y="44" width="375" height="156"/>
|
||||||
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
<subviews>
|
||||||
<userDefinedRuntimeAttributes>
|
<view contentMode="scaleToFill" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="5nz-eA-gNS" customClass="ExpandableLabel" customModule="CoMaps" customModuleProvider="target">
|
||||||
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="Background"/>
|
<rect key="frame" x="16" y="8" width="343" height="140"/>
|
||||||
</userDefinedRuntimeAttributes>
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
|
<userDefinedRuntimeAttributes>
|
||||||
|
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="Background"/>
|
||||||
|
</userDefinedRuntimeAttributes>
|
||||||
|
</view>
|
||||||
|
</subviews>
|
||||||
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="bottom" secondItem="5nz-eA-gNS" secondAttribute="bottom" constant="8" id="7cq-aw-oEp"/>
|
||||||
|
<constraint firstAttribute="trailing" secondItem="5nz-eA-gNS" secondAttribute="trailing" constant="16" id="8bV-Qg-RLL"/>
|
||||||
|
<constraint firstItem="5nz-eA-gNS" firstAttribute="top" secondItem="6GV-eD-5Hj" secondAttribute="top" constant="8" id="beB-db-IK0"/>
|
||||||
|
<constraint firstItem="5nz-eA-gNS" firstAttribute="leading" secondItem="6GV-eD-5Hj" secondAttribute="leading" constant="16" id="vKl-QO-4lm"/>
|
||||||
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
</subviews>
|
</subviews>
|
||||||
</stackView>
|
</stackView>
|
||||||
@@ -1148,10 +1160,10 @@
|
|||||||
<viewLayoutGuide key="safeArea" id="mWF-en-dQX"/>
|
<viewLayoutGuide key="safeArea" id="mWF-en-dQX"/>
|
||||||
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="iB6-kj-Bi1" firstAttribute="top" secondItem="bRD-Uv-Uak" secondAttribute="top" constant="16" id="Afw-Mq-NV9"/>
|
<constraint firstItem="iB6-kj-Bi1" firstAttribute="top" secondItem="bRD-Uv-Uak" secondAttribute="top" id="Afw-Mq-NV9"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="iB6-kj-Bi1" secondAttribute="bottom" id="QQY-yn-M6D"/>
|
<constraint firstAttribute="bottom" secondItem="iB6-kj-Bi1" secondAttribute="bottom" id="QQY-yn-M6D"/>
|
||||||
<constraint firstItem="iB6-kj-Bi1" firstAttribute="leading" secondItem="bRD-Uv-Uak" secondAttribute="leading" constant="16" id="tLm-VN-6Uh"/>
|
<constraint firstItem="iB6-kj-Bi1" firstAttribute="leading" secondItem="bRD-Uv-Uak" secondAttribute="leading" id="tLm-VN-6Uh"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="iB6-kj-Bi1" secondAttribute="trailing" constant="16" id="wOt-k9-l2q"/>
|
<constraint firstAttribute="trailing" secondItem="iB6-kj-Bi1" secondAttribute="trailing" id="wOt-k9-l2q"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<userDefinedRuntimeAttributes>
|
<userDefinedRuntimeAttributes>
|
||||||
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="Background"/>
|
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="Background"/>
|
||||||
@@ -1161,8 +1173,8 @@
|
|||||||
<connections>
|
<connections>
|
||||||
<outlet property="editView" destination="wB7-XJ-Nck" id="iPO-d0-Pw4"/>
|
<outlet property="editView" destination="wB7-XJ-Nck" id="iPO-d0-Pw4"/>
|
||||||
<outlet property="expandableLabel" destination="5nz-eA-gNS" id="iui-Iu-EiB"/>
|
<outlet property="expandableLabel" destination="5nz-eA-gNS" id="iui-Iu-EiB"/>
|
||||||
|
<outlet property="expandableLabelContainer" destination="6GV-eD-5Hj" id="JFo-mK-5MC"/>
|
||||||
<outlet property="stackView" destination="iB6-kj-Bi1" id="CSH-xH-X4b"/>
|
<outlet property="stackView" destination="iB6-kj-Bi1" id="CSH-xH-X4b"/>
|
||||||
<outlet property="topConstraint" destination="Afw-Mq-NV9" id="Oth-ao-05T"/>
|
|
||||||
</connections>
|
</connections>
|
||||||
</viewController>
|
</viewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="fcE-Xu-odc" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="fcE-Xu-odc" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||||
@@ -1393,13 +1405,13 @@
|
|||||||
<image name="ic_arrow_gray_down" width="28" height="28"/>
|
<image name="ic_arrow_gray_down" width="28" height="28"/>
|
||||||
<image name="ic_placepage_open_hours" width="28" height="28"/>
|
<image name="ic_placepage_open_hours" width="28" height="28"/>
|
||||||
<systemColor name="separatorColor">
|
<systemColor name="separatorColor">
|
||||||
<color red="0.23529411764705882" green="0.23529411764705882" blue="0.2627450980392157" alpha="0.28999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
|
<color red="0.23529411759999999" green="0.23529411759999999" blue="0.26274509800000001" alpha="0.28999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
</systemColor>
|
</systemColor>
|
||||||
<systemColor name="systemBackgroundColor">
|
<systemColor name="systemBackgroundColor">
|
||||||
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
</systemColor>
|
</systemColor>
|
||||||
<systemColor name="systemRedColor">
|
<systemColor name="systemRedColor">
|
||||||
<color red="1" green="0.23137254901960785" blue="0.18823529411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color red="1" green="0.23137254900000001" blue="0.18823529410000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
</systemColor>
|
</systemColor>
|
||||||
</resources>
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
|
|||||||
@@ -210,6 +210,16 @@ extension PlacePageInteractor: PlacePageButtonsViewControllerDelegate {
|
|||||||
// MARK: - PlacePageEditBookmarkOrTrackViewControllerDelegate
|
// MARK: - PlacePageEditBookmarkOrTrackViewControllerDelegate
|
||||||
|
|
||||||
extension PlacePageInteractor: PlacePageEditBookmarkOrTrackViewControllerDelegate {
|
extension PlacePageInteractor: PlacePageEditBookmarkOrTrackViewControllerDelegate {
|
||||||
|
func didUpdate(color: UIColor, category: MWMMarkGroupID, for data: PlacePageEditData) {
|
||||||
|
switch data {
|
||||||
|
case .bookmark(let bookmarkData):
|
||||||
|
let bookmarkColor = BookmarkColor.bookmarkColor(from: color) ?? bookmarkData.color
|
||||||
|
MWMPlacePageManagerHelper.updateBookmark(placePageData, color: bookmarkColor, category: category)
|
||||||
|
case .track(let trackData):
|
||||||
|
MWMPlacePageManagerHelper.updateTrack(placePageData, color: color, category: category)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func didPressEdit(_ data: PlacePageEditData) {
|
func didPressEdit(_ data: PlacePageEditData) {
|
||||||
switch data {
|
switch data {
|
||||||
case .bookmark:
|
case .bookmark:
|
||||||
|
|||||||
@@ -72,8 +72,10 @@ class PlacePageTrackLayout: IPlacePageLayout {
|
|||||||
var viewControllers = [UIViewController]()
|
var viewControllers = [UIViewController]()
|
||||||
|
|
||||||
viewControllers.append(editTrackViewController)
|
viewControllers.append(editTrackViewController)
|
||||||
editTrackViewController.view.isHidden = false
|
if let trackData = placePageData.trackData {
|
||||||
editTrackViewController.data = .track(trackData)
|
editTrackViewController.view.isHidden = false
|
||||||
|
editTrackViewController.data = .track(trackData)
|
||||||
|
}
|
||||||
|
|
||||||
placePageData.onBookmarkStatusUpdate = { [weak self] in
|
placePageData.onBookmarkStatusUpdate = { [weak self] in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
|
|||||||
@@ -28,13 +28,6 @@ final class PlacePageTrackRecordingLayout: IPlacePageLayout {
|
|||||||
return PlacePageHeaderBuilder.build(data: placePageData, delegate: interactor, headerType: .fixed)
|
return PlacePageHeaderBuilder.build(data: placePageData, delegate: interactor, headerType: .fixed)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
lazy var editTrackViewController: PlacePageEditBookmarkOrTrackViewController = {
|
|
||||||
let vc = storyboard.instantiateViewController(ofType: PlacePageEditBookmarkOrTrackViewController.self)
|
|
||||||
vc.view.isHidden = true
|
|
||||||
vc.delegate = interactor
|
|
||||||
return vc
|
|
||||||
}()
|
|
||||||
|
|
||||||
lazy var elevationProfileViewController: ElevationProfileViewController? = {
|
lazy var elevationProfileViewController: ElevationProfileViewController? = {
|
||||||
guard let trackData = placePageData.trackData else {
|
guard let trackData = placePageData.trackData else {
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -180,6 +180,14 @@ using namespace storage;
|
|||||||
[data updateBookmarkStatus];
|
[data updateBookmarkStatus];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)updateBookmark:(PlacePageData *)data color:(MWMBookmarkColor)color category:(MWMMarkGroupID)category {
|
||||||
|
MWMBookmarksManager * bookmarksManager = [MWMBookmarksManager sharedManager];
|
||||||
|
auto const & markId = data.bookmarkData.bookmarkId;
|
||||||
|
[bookmarksManager updateBookmark:markId setGroupId:category title:data.previewData.title color:color description:data.bookmarkData.bookmarkDescription];
|
||||||
|
[MWMFrameworkHelper updatePlacePageData];
|
||||||
|
[data updateBookmarkStatus];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)removeBookmark:(PlacePageData *)data
|
- (void)removeBookmark:(PlacePageData *)data
|
||||||
{
|
{
|
||||||
auto &f = GetFramework();
|
auto &f = GetFramework();
|
||||||
@@ -188,6 +196,14 @@ using namespace storage;
|
|||||||
[data updateBookmarkStatus];
|
[data updateBookmarkStatus];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)updateTrack:(PlacePageData *)data color:(UIColor *)color category:(MWMMarkGroupID)category {
|
||||||
|
MWMBookmarksManager * bookmarksManager = [MWMBookmarksManager sharedManager];
|
||||||
|
auto const & trackId = data.trackData.trackId;
|
||||||
|
[bookmarksManager updateTrack:trackId setGroupId:category color:color title:data.previewData.title];
|
||||||
|
[MWMFrameworkHelper updatePlacePageData];
|
||||||
|
[data updateBookmarkStatus];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)removeTrack:(PlacePageData *)data
|
- (void)removeTrack:(PlacePageData *)data
|
||||||
{
|
{
|
||||||
auto &f = GetFramework();
|
auto &f = GetFramework();
|
||||||
|
|||||||
@@ -30,7 +30,9 @@
|
|||||||
+ (void)openCatalogSingleItem:(PlacePageData *)data atIndex:(NSInteger)index;
|
+ (void)openCatalogSingleItem:(PlacePageData *)data atIndex:(NSInteger)index;
|
||||||
+ (void)openCatalogMoreItems:(PlacePageData *)data;
|
+ (void)openCatalogMoreItems:(PlacePageData *)data;
|
||||||
+ (void)addBookmark:(PlacePageData *)data;
|
+ (void)addBookmark:(PlacePageData *)data;
|
||||||
|
+ (void)updateBookmark:(PlacePageData *)data color:(MWMBookmarkColor)color category:(MWMMarkGroupID)category;
|
||||||
+ (void)removeBookmark:(PlacePageData *)data;
|
+ (void)removeBookmark:(PlacePageData *)data;
|
||||||
|
+ (void)updateTrack:(PlacePageData *)data color:(UIColor *)color category:(MWMMarkGroupID)category;
|
||||||
+ (void)removeTrack:(PlacePageData *)data;
|
+ (void)removeTrack:(PlacePageData *)data;
|
||||||
+ (void)editBookmark:(PlacePageData *)data;
|
+ (void)editBookmark:(PlacePageData *)data;
|
||||||
+ (void)editTrack:(PlacePageData *)data;
|
+ (void)editTrack:(PlacePageData *)data;
|
||||||
|
|||||||
@@ -36,7 +36,9 @@
|
|||||||
- (void)openCatalogSingleItem:(PlacePageData *)data atIndex:(NSInteger)index;
|
- (void)openCatalogSingleItem:(PlacePageData *)data atIndex:(NSInteger)index;
|
||||||
- (void)openCatalogMoreItems:(PlacePageData *)data;
|
- (void)openCatalogMoreItems:(PlacePageData *)data;
|
||||||
- (void)addBookmark:(PlacePageData *)data;
|
- (void)addBookmark:(PlacePageData *)data;
|
||||||
|
- (void)updateBookmark:(PlacePageData *)data color:(MWMBookmarkColor)color category:(MWMMarkGroupID)category;
|
||||||
- (void)removeBookmark:(PlacePageData *)data;
|
- (void)removeBookmark:(PlacePageData *)data;
|
||||||
|
- (void)updateTrack:(PlacePageData *)data color:(UIColor *)color category:(MWMMarkGroupID)category;
|
||||||
- (void)removeTrack:(PlacePageData *)data;
|
- (void)removeTrack:(PlacePageData *)data;
|
||||||
- (void)editBookmark:(PlacePageData *)data;
|
- (void)editBookmark:(PlacePageData *)data;
|
||||||
- (void)editTrack:(PlacePageData *)data;
|
- (void)editTrack:(PlacePageData *)data;
|
||||||
@@ -160,10 +162,18 @@
|
|||||||
[[MWMMapViewControlsManager manager].placePageManager addBookmark:data];
|
[[MWMMapViewControlsManager manager].placePageManager addBookmark:data];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (void)updateBookmark:(PlacePageData *)data color:(MWMBookmarkColor)color category:(MWMMarkGroupID)category {
|
||||||
|
[[MWMMapViewControlsManager manager].placePageManager updateBookmark:data color:color category:category];
|
||||||
|
}
|
||||||
|
|
||||||
+ (void)removeBookmark:(PlacePageData *)data {
|
+ (void)removeBookmark:(PlacePageData *)data {
|
||||||
[[MWMMapViewControlsManager manager].placePageManager removeBookmark:data];
|
[[MWMMapViewControlsManager manager].placePageManager removeBookmark:data];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (void)updateTrack:(PlacePageData *)data color:(UIColor *)color category:(MWMMarkGroupID)category {
|
||||||
|
[[MWMMapViewControlsManager manager].placePageManager updateTrack:data color:color category:category];
|
||||||
|
}
|
||||||
|
|
||||||
+ (void)removeTrack:(PlacePageData *)data {
|
+ (void)removeTrack:(PlacePageData *)data {
|
||||||
[[MWMMapViewControlsManager manager].placePageManager removeTrack:data];
|
[[MWMMapViewControlsManager manager].placePageManager removeTrack:data];
|
||||||
}
|
}
|
||||||
|
|||||||
80
iphone/Maps/UI/PlacePage/Views/InfoView.swift
Normal file
80
iphone/Maps/UI/PlacePage/Views/InfoView.swift
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
final class InfoView: UIView {
|
||||||
|
|
||||||
|
private let stackView = UIStackView()
|
||||||
|
private let imageView = UIImageView()
|
||||||
|
private let titleLabel = UILabel()
|
||||||
|
private lazy var imageViewWidthConstrain = imageView.widthAnchor.constraint(equalToConstant: 0)
|
||||||
|
|
||||||
|
init() {
|
||||||
|
super.init(frame: .zero)
|
||||||
|
self.setupView()
|
||||||
|
self.layoutViews()
|
||||||
|
}
|
||||||
|
|
||||||
|
convenience init(image: UIImage?, title: String) {
|
||||||
|
self.init()
|
||||||
|
self.set(image: image, title: title)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
|
||||||
|
super.traitCollectionDidChange(previousTraitCollection)
|
||||||
|
if #available(iOS 13.0, *), traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
|
||||||
|
imageView.applyTheme()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(*, unavailable)
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
private func setupView() {
|
||||||
|
setStyle(.background)
|
||||||
|
|
||||||
|
stackView.axis = .horizontal
|
||||||
|
stackView.distribution = .fill
|
||||||
|
stackView.alignment = .center
|
||||||
|
stackView.spacing = 16
|
||||||
|
|
||||||
|
titleLabel.setFontStyle(.regular16, color: .blackPrimary)
|
||||||
|
titleLabel.lineBreakMode = .byWordWrapping
|
||||||
|
titleLabel.numberOfLines = .zero
|
||||||
|
|
||||||
|
imageView.setStyle(.black)
|
||||||
|
imageView.contentMode = .scaleAspectFit
|
||||||
|
}
|
||||||
|
|
||||||
|
private func layoutViews() {
|
||||||
|
addSubview(stackView)
|
||||||
|
stackView.addArrangedSubview(imageView)
|
||||||
|
stackView.addArrangedSubview(titleLabel)
|
||||||
|
|
||||||
|
stackView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
imageView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
titleLabel.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
imageView.setContentHuggingPriority(.defaultHigh, for: .vertical)
|
||||||
|
imageView.setContentHuggingPriority(.defaultHigh, for: .horizontal)
|
||||||
|
titleLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)
|
||||||
|
NSLayoutConstraint.activate([
|
||||||
|
stackView.leadingAnchor.constraint(equalTo: leadingAnchor),
|
||||||
|
stackView.trailingAnchor.constraint(equalTo: trailingAnchor),
|
||||||
|
stackView.topAnchor.constraint(equalTo: topAnchor),
|
||||||
|
stackView.bottomAnchor.constraint(equalTo: bottomAnchor),
|
||||||
|
imageView.heightAnchor.constraint(equalToConstant: 24),
|
||||||
|
imageViewWidthConstrain
|
||||||
|
])
|
||||||
|
updateImageWidth()
|
||||||
|
}
|
||||||
|
|
||||||
|
private func updateImageWidth() {
|
||||||
|
imageViewWidthConstrain.constant = imageView.image == nil ? 0 : 24
|
||||||
|
imageView.isHidden = imageView.image == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Public
|
||||||
|
func set(image: UIImage?, title: String) {
|
||||||
|
imageView.image = image
|
||||||
|
titleLabel.text = title
|
||||||
|
updateImageWidth()
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user