[iOS] Sightseeing subscription screen
https://jira.mail.ru/browse/MAPSME-12085
|
@ -0,0 +1,41 @@
|
|||
import UIKit
|
||||
|
||||
class BookmarksSubscriptionButton: UIButton {
|
||||
private let descriptionLabel = UILabel()
|
||||
private let priceLabel = UILabel()
|
||||
|
||||
override func awakeFromNib() {
|
||||
addSubview(descriptionLabel)
|
||||
addSubview(priceLabel)
|
||||
|
||||
descriptionLabel.translatesAutoresizingMaskIntoConstraints = false
|
||||
priceLabel.translatesAutoresizingMaskIntoConstraints = false
|
||||
|
||||
priceLabel.font = UIFont.semibold16()
|
||||
priceLabel.textAlignment = .right;
|
||||
descriptionLabel.font = UIFont.semibold16()
|
||||
|
||||
descriptionLabel.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
|
||||
descriptionLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 16).isActive = true
|
||||
priceLabel.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
|
||||
priceLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -16).isActive = true
|
||||
|
||||
setTitle("", for: .normal)
|
||||
}
|
||||
|
||||
override func setTitleColor(_ color: UIColor?, for state: UIControlState) {
|
||||
super.setTitleColor(color, for: state)
|
||||
descriptionLabel.textColor = color
|
||||
priceLabel.textColor = color
|
||||
}
|
||||
|
||||
override func setTitle(_ title: String?, for state: UIControlState) {
|
||||
super.setTitle("", for: state);
|
||||
}
|
||||
|
||||
func config(title: String, price: String, enabled: Bool) {
|
||||
descriptionLabel.text = title
|
||||
priceLabel.text = price
|
||||
self.isEnabled = enabled
|
||||
}
|
||||
}
|
|
@ -1,90 +0,0 @@
|
|||
class BookmarksSubscriptionCellViewController: UIViewController {
|
||||
@IBOutlet private var subtitleLabel: UILabel!
|
||||
@IBOutlet private var titleLabel: UILabel!
|
||||
@IBOutlet private var priceLabel: UILabel!
|
||||
@IBOutlet private var discountView: UIView!
|
||||
@IBOutlet private var discountLabel: UILabel!
|
||||
@IBOutlet private var imageView: UIImageView!
|
||||
@IBOutlet private var containerView: UIView!
|
||||
@IBOutlet private var contentView: UIView!
|
||||
|
||||
private(set) var isSelected = false
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
if !UIColor.isNightMode() {
|
||||
setupShadow(containerView, color: .shadowColorBlue())
|
||||
setupShadow(discountView, color: .shadowColorPurple())
|
||||
}
|
||||
contentView.layer.borderColor = UIColor.subscriptionCellBorder().cgColor
|
||||
setSelected(false, animated: false)
|
||||
}
|
||||
|
||||
func setSelected(_ selected: Bool, animated: Bool = false) {
|
||||
isSelected = selected
|
||||
let setSelectedClosure = { [unowned self] in
|
||||
self.titleLabel.textColor = selected ? .subscriptionCellTitle() : .blackSecondaryText()
|
||||
self.subtitleLabel.textColor = selected ? .linkBlue() : .blackSecondaryText()
|
||||
self.priceLabel.textColor = selected ? .subscriptionCellTitle() : .blackSecondaryText()
|
||||
self.contentView.backgroundColor = selected ? .subscriptionCellBackground() : .clear
|
||||
self.containerView.backgroundColor = selected ? .white() : .clear
|
||||
}
|
||||
|
||||
if animated {
|
||||
UIView.animate(withDuration: kDefaultAnimationDuration) {
|
||||
setSelectedClosure()
|
||||
}
|
||||
animateBorder(contentView, show: !selected)
|
||||
if !UIColor.isNightMode() {
|
||||
animateShadow(containerView, opacity: selected ? 0.5 : 0)
|
||||
animateShadow(discountView, opacity: selected ? 0.62 : 0)
|
||||
}
|
||||
} else {
|
||||
setSelectedClosure()
|
||||
contentView.layer.borderWidth = selected ? 0 : 1
|
||||
if !UIColor.isNightMode() {
|
||||
containerView.layer.shadowOpacity = selected ? 0.5 : 0
|
||||
discountView.layer.shadowOpacity = selected ? 0.62 : 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func config(title: String, subtitle: String, price: String, image: UIImage, discount: String? = nil) {
|
||||
titleLabel.text = title
|
||||
subtitleLabel.text = subtitle
|
||||
priceLabel.text = price
|
||||
imageView.image = image
|
||||
|
||||
guard let discount = discount else {
|
||||
discountView.isHidden = true
|
||||
return
|
||||
}
|
||||
|
||||
discountLabel.text = discount
|
||||
discountView.isHidden = false
|
||||
}
|
||||
|
||||
private func setupShadow(_ view: UIView, color: UIColor) {
|
||||
view.layer.shadowRadius = 4
|
||||
view.layer.shadowOffset = CGSize(width: 0, height: 2)
|
||||
view.layer.shadowColor = color.cgColor
|
||||
}
|
||||
|
||||
private func animateShadow(_ view: UIView, opacity: Float) {
|
||||
let shadowOpacityKey = "shadowOpacity"
|
||||
let animation = CABasicAnimation(keyPath: shadowOpacityKey)
|
||||
animation.fromValue = view.layer.shadowOpacity
|
||||
animation.duration = kDefaultAnimationDuration
|
||||
view.layer.add(animation, forKey: shadowOpacityKey)
|
||||
view.layer.shadowOpacity = opacity
|
||||
}
|
||||
|
||||
private func animateBorder(_ view: UIView, show: Bool) {
|
||||
let borderWidthKey = "borderWidth"
|
||||
let animation = CABasicAnimation(keyPath: borderWidthKey)
|
||||
animation.fromValue = view.layer.borderWidth
|
||||
animation.duration = kDefaultAnimationDuration
|
||||
view.layer.add(animation, forKey: borderWidthKey)
|
||||
view.layer.borderWidth = show ? 1 : 0
|
||||
}
|
||||
}
|
|
@ -1,149 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina6_1" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="BookmarksSubscriptionCellViewController" customModule="maps_me" customModuleProvider="target">
|
||||
<connections>
|
||||
<outlet property="containerView" destination="5im-1k-ZSt" id="KFK-PM-Aq7"/>
|
||||
<outlet property="contentView" destination="MkX-w4-BJH" id="wvB-ug-ZxF"/>
|
||||
<outlet property="discountLabel" destination="Udv-PO-OUs" id="TWf-Rw-Mdg"/>
|
||||
<outlet property="discountView" destination="T1l-r7-y0s" id="QwX-Ie-Awz"/>
|
||||
<outlet property="imageView" destination="seQ-P4-q7a" id="c98-Ed-EYY"/>
|
||||
<outlet property="priceLabel" destination="udg-sP-X24" id="Rxw-0m-IGk"/>
|
||||
<outlet property="subtitleLabel" destination="sD6-bq-sR9" id="RqJ-a5-WGF"/>
|
||||
<outlet property="titleLabel" destination="RSU-fu-mKp" id="GRu-u9-L94"/>
|
||||
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
|
||||
</connections>
|
||||
</placeholder>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
|
||||
<rect key="frame" x="0.0" y="0.0" width="166" height="254"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="brj-0e-hWP">
|
||||
<rect key="frame" x="0.0" y="0.0" width="166" height="254"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5im-1k-ZSt">
|
||||
<rect key="frame" x="0.0" y="23" width="166" height="231"/>
|
||||
<subviews>
|
||||
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MkX-w4-BJH">
|
||||
<rect key="frame" x="3" y="3" width="160" height="225"/>
|
||||
<subviews>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="bookmarksSubscriptionYear" translatesAutoresizingMaskIntoConstraints="NO" id="seQ-P4-q7a">
|
||||
<rect key="frame" x="0.0" y="0.0" width="160" height="90"/>
|
||||
</imageView>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Annual" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="17" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="RSU-fu-mKp">
|
||||
<rect key="frame" x="12" y="92" width="136" height="26"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="21"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="12 month unlimited guides" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sD6-bq-sR9">
|
||||
<rect key="frame" x="12" y="123" width="136" height="33.5"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="$29.99" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="udg-sP-X24">
|
||||
<rect key="frame" x="12" y="192" width="60" height="21"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="seQ-P4-q7a" secondAttribute="trailing" id="3OW-ye-Bgc"/>
|
||||
<constraint firstAttribute="trailing" secondItem="RSU-fu-mKp" secondAttribute="trailing" constant="12" id="FXV-bc-was"/>
|
||||
<constraint firstItem="udg-sP-X24" firstAttribute="leading" secondItem="MkX-w4-BJH" secondAttribute="leading" constant="12" id="Gfz-tP-WVx"/>
|
||||
<constraint firstItem="sD6-bq-sR9" firstAttribute="top" secondItem="RSU-fu-mKp" secondAttribute="bottom" constant="5" id="SLD-GM-dh0"/>
|
||||
<constraint firstItem="seQ-P4-q7a" firstAttribute="top" secondItem="MkX-w4-BJH" secondAttribute="top" id="T6I-jw-sah"/>
|
||||
<constraint firstAttribute="bottom" secondItem="udg-sP-X24" secondAttribute="bottom" constant="12" id="UqO-55-UZx"/>
|
||||
<constraint firstItem="sD6-bq-sR9" firstAttribute="leading" secondItem="MkX-w4-BJH" secondAttribute="leading" constant="12" id="XOh-t3-MhF"/>
|
||||
<constraint firstAttribute="trailing" secondItem="sD6-bq-sR9" secondAttribute="trailing" constant="12" id="bLV-g1-tND"/>
|
||||
<constraint firstItem="seQ-P4-q7a" firstAttribute="leading" secondItem="MkX-w4-BJH" secondAttribute="leading" id="fVs-iN-QlK"/>
|
||||
<constraint firstItem="RSU-fu-mKp" firstAttribute="leading" secondItem="MkX-w4-BJH" secondAttribute="leading" constant="12" id="gfN-Wt-ehy"/>
|
||||
<constraint firstItem="RSU-fu-mKp" firstAttribute="top" secondItem="MkX-w4-BJH" secondAttribute="top" constant="92" id="no0-Lz-cuL"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
|
||||
<integer key="value" value="7"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<gestureRecognizers/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="MkX-w4-BJH" secondAttribute="bottom" constant="3" id="HD7-Dy-l0d"/>
|
||||
<constraint firstItem="MkX-w4-BJH" firstAttribute="top" secondItem="5im-1k-ZSt" secondAttribute="top" constant="3" id="Jyz-d9-hWa"/>
|
||||
<constraint firstAttribute="trailing" secondItem="MkX-w4-BJH" secondAttribute="trailing" constant="3" id="R83-rm-27x"/>
|
||||
<constraint firstItem="MkX-w4-BJH" firstAttribute="leading" secondItem="5im-1k-ZSt" secondAttribute="leading" constant="3" id="cKq-HI-5nL"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
|
||||
<integer key="value" value="10"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="T1l-r7-y0s">
|
||||
<rect key="frame" x="0.0" y="0.0" width="116" height="35"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SAVE $38" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="12" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Udv-PO-OUs">
|
||||
<rect key="frame" x="4" y="7" width="108" height="21"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="0.63921568630000003" green="0.20784313730000001" blue="0.95686274510000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="35" id="1hc-rF-WeJ"/>
|
||||
<constraint firstAttribute="width" constant="116" id="MmH-NQ-a79"/>
|
||||
<constraint firstItem="Udv-PO-OUs" firstAttribute="centerY" secondItem="T1l-r7-y0s" secondAttribute="centerY" id="Rc1-MY-abl"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Udv-PO-OUs" secondAttribute="trailing" constant="4" id="Ugx-X0-X5n"/>
|
||||
<constraint firstItem="Udv-PO-OUs" firstAttribute="leading" secondItem="T1l-r7-y0s" secondAttribute="leading" constant="4" id="ftl-Dn-UeW"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
|
||||
<integer key="value" value="6"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="T1l-r7-y0s" firstAttribute="top" secondItem="brj-0e-hWP" secondAttribute="top" id="8fR-FO-nnO"/>
|
||||
<constraint firstAttribute="trailing" secondItem="5im-1k-ZSt" secondAttribute="trailing" id="9A1-Mp-LlU"/>
|
||||
<constraint firstAttribute="width" constant="166" id="XlP-bR-oy4"/>
|
||||
<constraint firstItem="5im-1k-ZSt" firstAttribute="top" secondItem="brj-0e-hWP" secondAttribute="top" constant="23" id="dYu-M1-Tnx"/>
|
||||
<constraint firstAttribute="bottom" secondItem="5im-1k-ZSt" secondAttribute="bottom" id="kDE-4I-7LZ"/>
|
||||
<constraint firstItem="5im-1k-ZSt" firstAttribute="leading" secondItem="brj-0e-hWP" secondAttribute="leading" id="kyQ-R7-x0Y"/>
|
||||
<constraint firstItem="T1l-r7-y0s" firstAttribute="leading" secondItem="brj-0e-hWP" secondAttribute="leading" id="pAD-k1-weD"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="brj-0e-hWP" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="2LO-Qg-bMl"/>
|
||||
<constraint firstItem="brj-0e-hWP" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="AoM-wo-8Fy"/>
|
||||
<constraint firstAttribute="bottom" secondItem="brj-0e-hWP" secondAttribute="bottom" id="EKl-sH-rak"/>
|
||||
<constraint firstAttribute="trailing" secondItem="brj-0e-hWP" secondAttribute="trailing" id="z6f-Go-kJT"/>
|
||||
</constraints>
|
||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
||||
<viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
|
||||
<point key="canvasLocation" x="137.68115942028987" y="-20.758928571428569"/>
|
||||
</view>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="bookmarksSubscriptionYear" width="160" height="90"/>
|
||||
</resources>
|
||||
</document>
|
|
@ -1,19 +1,21 @@
|
|||
import SafariServices
|
||||
|
||||
@objc class BookmarksSubscriptionViewController: MWMViewController {
|
||||
@IBOutlet private var annualView: UIView!
|
||||
@IBOutlet private var monthlyView: UIView!
|
||||
@IBOutlet private var gradientView: GradientView!
|
||||
@IBOutlet private var scrollView: UIScrollView!
|
||||
@IBOutlet private var continueButton: UIButton!
|
||||
@IBOutlet var loadingView: UIView!
|
||||
|
||||
private let annualViewController = BookmarksSubscriptionCellViewController()
|
||||
private let monthlyViewController = BookmarksSubscriptionCellViewController()
|
||||
//MARK: outlets
|
||||
@IBOutlet private var annualSubscriptionButton: BookmarksSubscriptionButton!
|
||||
@IBOutlet private var annualDiscountView: UIView!
|
||||
@IBOutlet private var annualDiscountLabel: UILabel!
|
||||
@IBOutlet private var monthlySubscriptionButton: BookmarksSubscriptionButton!
|
||||
@IBOutlet private var loadingView: UIView!
|
||||
|
||||
//MARK: locals
|
||||
private var priceFormatter: NumberFormatter?
|
||||
private var monthlySubscription: ISubscription?
|
||||
private var annualSubscription: ISubscription?
|
||||
private var selectedSubscription: ISubscription?
|
||||
|
||||
//MARK: dependency
|
||||
private let subscriptionManager: ISubscriptionManager = InAppPurchase.bookmarksSubscriptionManager
|
||||
private let bookmarksManager: MWMBookmarksManager = MWMBookmarksManager.shared()
|
||||
|
||||
@objc var onSubscribe: MWMVoidBlock?
|
||||
@objc var onCancel: MWMVoidBlock?
|
||||
|
@ -29,7 +31,7 @@ import SafariServices
|
|||
|
||||
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
|
||||
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
|
||||
InAppPurchase.bookmarksSubscriptionManager.addListener(self)
|
||||
subscriptionManager.addListener(self)
|
||||
}
|
||||
|
||||
required init?(coder aDecoder: NSCoder) {
|
||||
|
@ -37,53 +39,40 @@ import SafariServices
|
|||
}
|
||||
|
||||
deinit {
|
||||
InAppPurchase.bookmarksSubscriptionManager.removeListener(self)
|
||||
subscriptionManager.removeListener(self)
|
||||
}
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
gradientView.isHidden = UIColor.isNightMode()
|
||||
|
||||
addChildViewController(annualViewController)
|
||||
annualView.addSubview(annualViewController.view)
|
||||
annualViewController.view.alignToSuperview()
|
||||
annualViewController.didMove(toParentViewController: self)
|
||||
|
||||
addChildViewController(monthlyViewController)
|
||||
monthlyView.addSubview(monthlyViewController.view)
|
||||
monthlyViewController.view.alignToSuperview()
|
||||
monthlyViewController.didMove(toParentViewController: self)
|
||||
|
||||
annualViewController.config(title: L("annual_subscription_title"),
|
||||
subtitle: L("annual_subscription_message"),
|
||||
price: "...",
|
||||
image: UIImage(named: "bookmarksSubscriptionYear")!,
|
||||
discount: "...")
|
||||
monthlyViewController.config(title: L("montly_subscription_title"),
|
||||
subtitle: L("montly_subscription_message"),
|
||||
price: "...",
|
||||
image: UIImage(named: "bookmarksSubscriptionMonth")!)
|
||||
annualViewController.setSelected(true, animated: false)
|
||||
continueButton.setTitle(L("current_location_unknown_continue_button").uppercased(), for: .normal)
|
||||
continueButton.isEnabled = false
|
||||
scrollView.isUserInteractionEnabled = false
|
||||
|
||||
annualSubscriptionButton.config(title: L("annual_subscription_title"),
|
||||
price: "...",
|
||||
enabled: false)
|
||||
monthlySubscriptionButton.config(title: L("montly_subscription_title"),
|
||||
price: "...",
|
||||
enabled: false)
|
||||
|
||||
if !UIColor.isNightMode() {
|
||||
annualDiscountView.layer.shadowRadius = 4
|
||||
annualDiscountView.layer.shadowOffset = CGSize(width: 0, height: 2)
|
||||
annualDiscountView.layer.shadowColor = UIColor.blackHintText().cgColor
|
||||
annualDiscountView.layer.shadowOpacity = 0.62
|
||||
}
|
||||
annualDiscountView.isHidden = true
|
||||
|
||||
Statistics.logEvent(kStatInappShow, withParameters: [kStatVendor: MWMPurchaseManager.bookmarksSubscriptionVendorId(),
|
||||
kStatPurchase: MWMPurchaseManager.bookmarksSubscriptionServerId(),
|
||||
kStatProduct: BOOKMARKS_SUBSCRIPTION_YEARLY_PRODUCT_ID,
|
||||
kStatFrom: source], with: .realtime)
|
||||
InAppPurchase.bookmarksSubscriptionManager.getAvailableSubscriptions { [weak self] (subscriptions, error) in
|
||||
subscriptionManager.getAvailableSubscriptions { [weak self] (subscriptions, error) in
|
||||
guard let subscriptions = subscriptions, subscriptions.count == 2 else {
|
||||
MWMAlertViewController.activeAlert().presentInfoAlert(L("price_error_title"),
|
||||
text: L("price_error_subtitle"))
|
||||
self?.onCancel?()
|
||||
return
|
||||
}
|
||||
|
||||
self?.monthlySubscription = subscriptions[0]
|
||||
self?.annualSubscription = subscriptions[1]
|
||||
self?.selectedSubscription = self?.annualSubscription
|
||||
|
||||
let s = subscriptions[0]
|
||||
let formatter = NumberFormatter()
|
||||
|
@ -96,49 +85,30 @@ import SafariServices
|
|||
let twelveMonthPrice = monthlyPrice.multiplying(by: 12)
|
||||
let discount = twelveMonthPrice.subtracting(annualPrice).dividing(by: twelveMonthPrice).multiplying(by: 100)
|
||||
|
||||
self?.monthlyViewController.config(title: L("montly_subscription_title"),
|
||||
subtitle: L("montly_subscription_message"),
|
||||
price: formatter.string(from: monthlyPrice) ?? "",
|
||||
image: UIImage(named: "bookmarksSubscriptionMonth")!)
|
||||
self?.annualViewController.config(title: L("annual_subscription_title"),
|
||||
subtitle: L("annual_subscription_message"),
|
||||
price: formatter.string(from: annualPrice) ?? "",
|
||||
image: UIImage(named: "bookmarksSubscriptionYear")!,
|
||||
discount: "- \(discount.rounding(accordingToBehavior: nil).intValue) %")
|
||||
self?.continueButton.isEnabled = true
|
||||
self?.scrollView.isUserInteractionEnabled = true
|
||||
self?.annualSubscriptionButton.config(title: L("annual_subscription_title"),
|
||||
price: formatter.string(from: annualPrice) ?? "",
|
||||
enabled: true)
|
||||
self?.monthlySubscriptionButton.config(title: L("montly_subscription_title"),
|
||||
price: formatter.string(from: monthlyPrice) ?? "",
|
||||
enabled: true)
|
||||
self?.annualDiscountView.isHidden = false
|
||||
self?.annualDiscountLabel.text = "- \(discount.rounding(accordingToBehavior: nil).intValue) %"
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func onAnnualViewTap(_ sender: UITapGestureRecognizer) {
|
||||
guard !annualViewController.isSelected else {
|
||||
return
|
||||
}
|
||||
selectedSubscription = annualSubscription
|
||||
annualViewController.setSelected(true, animated: true)
|
||||
monthlyViewController.setSelected(false, animated: true)
|
||||
scrollView.scrollRectToVisible(annualView.convert(annualView.bounds, to: scrollView), animated: true)
|
||||
Statistics.logEvent(kStatInappSelect, withParameters: [kStatProduct: selectedSubscription!.productId,
|
||||
kStatPurchase: MWMPurchaseManager.bookmarksSubscriptionServerId()])
|
||||
@IBAction func onAnnualButtonTap(_ sender: UIButton) {
|
||||
purchase(sender: sender, subscription: annualSubscription)
|
||||
}
|
||||
|
||||
@IBAction func onMonthlyViewTap(_ sender: UITapGestureRecognizer) {
|
||||
guard !monthlyViewController.isSelected else {
|
||||
return
|
||||
}
|
||||
selectedSubscription = monthlySubscription
|
||||
annualViewController.setSelected(false, animated: true)
|
||||
monthlyViewController.setSelected(true, animated: true)
|
||||
scrollView.scrollRectToVisible(monthlyView.convert(monthlyView.bounds, to: scrollView), animated: true)
|
||||
Statistics.logEvent(kStatInappSelect, withParameters: [kStatProduct: selectedSubscription!.productId,
|
||||
kStatPurchase: MWMPurchaseManager.bookmarksSubscriptionServerId()])
|
||||
@IBAction func onMonthlyButtonTap(_ sender: UIButton) {
|
||||
purchase(sender: sender, subscription: monthlySubscription)
|
||||
}
|
||||
|
||||
@IBAction func onContinue(_ sender: UIButton) {
|
||||
private func purchase(sender: UIButton, subscription: ISubscription?) {
|
||||
signup(anchor: sender) { [weak self] success in
|
||||
guard success else { return }
|
||||
self?.loadingView.isHidden = false
|
||||
MWMBookmarksManager.shared().ping { success in
|
||||
self?.bookmarksManager.ping { success in
|
||||
guard success else {
|
||||
self?.loadingView.isHidden = true
|
||||
let errorDialog = BookmarksSubscriptionFailViewController { [weak self] in
|
||||
|
@ -148,11 +118,11 @@ import SafariServices
|
|||
return
|
||||
}
|
||||
|
||||
guard let subscription = self?.selectedSubscription else {
|
||||
guard let subscription = subscription else {
|
||||
return
|
||||
}
|
||||
|
||||
InAppPurchase.bookmarksSubscriptionManager.subscribe(to: subscription)
|
||||
self?.subscriptionManager.subscribe(to: subscription)
|
||||
}
|
||||
}
|
||||
Statistics.logEvent(kStatInappPay, withParameters: [kStatPurchase: MWMPurchaseManager.bookmarksSubscriptionServerId()],
|
||||
|
@ -164,7 +134,7 @@ import SafariServices
|
|||
signup(anchor: sender) { [weak self] (success) in
|
||||
guard success else { return }
|
||||
self?.loadingView.isHidden = false
|
||||
InAppPurchase.bookmarksSubscriptionManager.restore { result in
|
||||
self?.subscriptionManager.restore { result in
|
||||
self?.loadingView.isHidden = true
|
||||
let alertText: String
|
||||
switch result {
|
||||
|
@ -223,7 +193,7 @@ extension BookmarksSubscriptionViewController: SubscriptionManagerListener {
|
|||
|
||||
func didSubscribe(_ subscription: ISubscription) {
|
||||
MWMPurchaseManager.setBookmarksSubscriptionActive(true)
|
||||
MWMBookmarksManager.shared().resetInvalidCategories()
|
||||
bookmarksManager.resetInvalidCategories()
|
||||
}
|
||||
|
||||
func didDefer(_ subscription: ISubscription) {
|
||||
|
|
|
@ -1,23 +1,20 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina5_5" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina5_5" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="BookmarksSubscriptionViewController" customModule="maps_me" customModuleProvider="target">
|
||||
<connections>
|
||||
<outlet property="annualView" destination="Bae-oL-ekX" id="l9n-u0-LNW"/>
|
||||
<outlet property="continueButton" destination="neX-0h-hs4" id="kQw-7y-Igs"/>
|
||||
<outlet property="gradientView" destination="BcI-3g-iCI" id="Rmd-LB-Rl5"/>
|
||||
<outlet property="annualDiscountLabel" destination="YH0-h4-ZEb" id="onk-lS-6im"/>
|
||||
<outlet property="annualDiscountView" destination="8Qf-I6-xXL" id="CNZ-eh-LJj"/>
|
||||
<outlet property="annualSubscriptionButton" destination="neX-0h-hs4" id="I6s-8S-Qks"/>
|
||||
<outlet property="loadingView" destination="BHb-cU-Ze3" id="bfe-6a-BJf"/>
|
||||
<outlet property="monthlyView" destination="Jpy-cA-wCv" id="6yi-OC-MrD"/>
|
||||
<outlet property="scrollView" destination="q5w-jW-Chn" id="dMR-TM-gMC"/>
|
||||
<outlet property="monthlySubscriptionButton" destination="sj5-ey-SEv" id="nUs-dU-WOI"/>
|
||||
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
|
||||
</connections>
|
||||
</placeholder>
|
||||
|
@ -26,122 +23,237 @@
|
|||
<rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="BcI-3g-iCI" customClass="GradientView" customModule="maps_me" customModuleProvider="target">
|
||||
<scrollView multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" contentInsetAdjustmentBehavior="always" translatesAutoresizingMaskIntoConstraints="NO" id="0eE-hs-sId">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="startColor">
|
||||
<color key="value" red="0.81568627450980391" green="0.92156862745098034" blue="1" alpha="0.70424871575342463" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="endColor">
|
||||
<color key="value" white="1" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<scrollView multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0eE-hs-sId">
|
||||
<rect key="frame" x="0.0" y="20" width="414" height="716"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Eiz-QQ-h0b">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="677.66666666666663"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="1015"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Unlimited access to 5000+ guides!" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bOS-sQ-rkD">
|
||||
<rect key="frame" x="16" y="24.000000000000004" width="382" height="57.333333333333343"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="24"/>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="bookmarksSubscriptionHeader" translatesAutoresizingMaskIntoConstraints="NO" id="Y38-kF-ZnW">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="212"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="212" id="YbO-Ju-JzM"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Sightseeing" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bOS-sQ-rkD">
|
||||
<rect key="frame" x="24" y="232" width="366" height="33.666666666666686"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="28"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="bold24"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="subscription_screen_native_title_version_2"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="bold28"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="linkBlue"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="sightseeing_subscription_header_sightseeing"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Every kind of journey. Whether alone or with friends, hiking or sunbathing" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vzD-qz-Fwt">
|
||||
<rect key="frame" x="16" y="97.333333333333329" width="382" height="33.666666666666671"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Subscription" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vzD-qz-Fwt">
|
||||
<rect key="frame" x="24" y="269.66666666666669" width="366" height="33.666666666666686"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="28"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular14"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="bold28"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="subscription_screen_native_message_version_2"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="sightseeing_subscription_header_subscription"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
<scrollView multipleTouchEnabled="YES" contentMode="scaleToFill" bounces="NO" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" bouncesZoom="NO" translatesAutoresizingMaskIntoConstraints="NO" id="q5w-jW-Chn">
|
||||
<rect key="frame" x="33" y="165" width="348" height="254"/>
|
||||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="equalSpacing" spacing="16" translatesAutoresizingMaskIntoConstraints="NO" id="PSz-Kf-Ihe">
|
||||
<rect key="frame" x="16" y="327.33333333333331" width="382" height="192.99999999999994"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="GGO-lU-mzy">
|
||||
<rect key="frame" x="0.0" y="0.0" width="348" height="254"/>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6wz-nj-9Hk">
|
||||
<rect key="frame" x="0.0" y="0.0" width="382" height="50"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Bae-oL-ekX">
|
||||
<rect key="frame" x="0.0" y="0.0" width="166" height="254"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="bookmarksSubscriptionBullet" translatesAutoresizingMaskIntoConstraints="NO" id="v8f-bu-XRf">
|
||||
<rect key="frame" x="0.0" y="0.0" width="16" height="16"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="166" id="VWj-No-rzW"/>
|
||||
<constraint firstAttribute="height" constant="16" id="9uz-Gn-4dK"/>
|
||||
<constraint firstAttribute="width" constant="16" id="v33-uE-cyp"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outletCollection property="gestureRecognizers" destination="CPT-bP-cim" appends="YES" id="1dj-wC-eaz"/>
|
||||
</connections>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Jpy-cA-wCv">
|
||||
<rect key="frame" x="182" y="0.0" width="166" height="254"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="166" id="RXq-j7-sUf"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outletCollection property="gestureRecognizers" destination="6bt-Wj-I8y" appends="YES" id="CUa-Ee-sVX"/>
|
||||
</connections>
|
||||
</view>
|
||||
</imageView>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="700+ cities and 100+ countries" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0Yb-rS-wW6">
|
||||
<rect key="frame" x="32" y="-4" width="350" height="50"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium17"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="sightseeing_subscription_message"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="Bae-oL-ekX" secondAttribute="bottom" id="72v-2J-b39"/>
|
||||
<constraint firstItem="Bae-oL-ekX" firstAttribute="leading" secondItem="GGO-lU-mzy" secondAttribute="leading" id="9Xb-Ed-LrY"/>
|
||||
<constraint firstItem="Jpy-cA-wCv" firstAttribute="top" secondItem="GGO-lU-mzy" secondAttribute="top" id="AcV-qq-Sad"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Jpy-cA-wCv" secondAttribute="trailing" id="PHw-4l-fxy"/>
|
||||
<constraint firstAttribute="bottom" secondItem="Jpy-cA-wCv" secondAttribute="bottom" id="Uy5-XO-hD6"/>
|
||||
<constraint firstItem="Jpy-cA-wCv" firstAttribute="leading" secondItem="Bae-oL-ekX" secondAttribute="trailing" constant="16" id="qkv-Ia-8dz"/>
|
||||
<constraint firstItem="Bae-oL-ekX" firstAttribute="top" secondItem="GGO-lU-mzy" secondAttribute="top" id="x9A-wI-c5M"/>
|
||||
<constraint firstItem="v8f-bu-XRf" firstAttribute="leading" secondItem="6wz-nj-9Hk" secondAttribute="leading" id="6qd-3D-YnN"/>
|
||||
<constraint firstItem="0Yb-rS-wW6" firstAttribute="leading" secondItem="v8f-bu-XRf" secondAttribute="trailing" constant="16" id="ZXr-Ei-8iB"/>
|
||||
<constraint firstAttribute="trailing" secondItem="0Yb-rS-wW6" secondAttribute="trailing" id="d33-Y9-0BY"/>
|
||||
<constraint firstAttribute="height" secondItem="0Yb-rS-wW6" secondAttribute="height" id="jW8-zs-I4k"/>
|
||||
<constraint firstItem="v8f-bu-XRf" firstAttribute="top" secondItem="6wz-nj-9Hk" secondAttribute="top" id="o1E-GY-Jsr"/>
|
||||
<constraint firstItem="0Yb-rS-wW6" firstAttribute="top" secondItem="v8f-bu-XRf" secondAttribute="top" constant="-4" id="vYU-Ps-E1X"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mF9-z9-HWN">
|
||||
<rect key="frame" x="0.0" y="66" width="382" height="61"/>
|
||||
<subviews>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="bookmarksSubscriptionBullet" translatesAutoresizingMaskIntoConstraints="NO" id="FOL-e3-sHY">
|
||||
<rect key="frame" x="0.0" y="0.0" width="16" height="16"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="16" id="IZr-8y-6VR"/>
|
||||
<constraint firstAttribute="width" constant="16" id="W4F-Fw-jXu"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Detailed descriptions" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="f3W-d3-0t1">
|
||||
<rect key="frame" x="32" y="-4" width="350" height="61"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium17"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="sightseeing_subscription_message_2"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="FOL-e3-sHY" firstAttribute="leading" secondItem="mF9-z9-HWN" secondAttribute="leading" id="Bxw-V5-GPB"/>
|
||||
<constraint firstItem="FOL-e3-sHY" firstAttribute="top" secondItem="mF9-z9-HWN" secondAttribute="top" id="Efh-b4-3CU"/>
|
||||
<constraint firstItem="f3W-d3-0t1" firstAttribute="top" secondItem="FOL-e3-sHY" secondAttribute="top" constant="-4" id="GDe-wG-JEm"/>
|
||||
<constraint firstItem="f3W-d3-0t1" firstAttribute="leading" secondItem="FOL-e3-sHY" secondAttribute="trailing" constant="16" id="Tpf-lQ-ASZ"/>
|
||||
<constraint firstAttribute="trailing" secondItem="f3W-d3-0t1" secondAttribute="trailing" id="Ua8-y7-ggf"/>
|
||||
<constraint firstAttribute="height" secondItem="f3W-d3-0t1" secondAttribute="height" id="Zwn-Ri-YNB"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mtL-ar-cGM">
|
||||
<rect key="frame" x="0.0" y="143" width="382" height="50"/>
|
||||
<subviews>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="bookmarksSubscriptionBullet" translatesAutoresizingMaskIntoConstraints="NO" id="PSK-Ys-mFZ">
|
||||
<rect key="frame" x="0.0" y="0.0" width="16" height="16"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="16" id="FPa-mC-5hG"/>
|
||||
<constraint firstAttribute="height" constant="16" id="xzI-O9-glP"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Rich content: photos and tracks" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ahr-bo-V6W">
|
||||
<rect key="frame" x="32" y="-4" width="350" height="50"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium17"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="sightseeing_subscription_message_3"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="ahr-bo-V6W" firstAttribute="top" secondItem="PSK-Ys-mFZ" secondAttribute="top" constant="-4" id="25q-3a-RFA"/>
|
||||
<constraint firstItem="ahr-bo-V6W" firstAttribute="leading" secondItem="PSK-Ys-mFZ" secondAttribute="trailing" constant="16" id="FKU-iT-1dV"/>
|
||||
<constraint firstItem="PSK-Ys-mFZ" firstAttribute="top" secondItem="mtL-ar-cGM" secondAttribute="top" id="IuY-vv-OCR"/>
|
||||
<constraint firstAttribute="trailing" secondItem="ahr-bo-V6W" secondAttribute="trailing" id="bLU-Eh-O9Y"/>
|
||||
<constraint firstAttribute="height" secondItem="ahr-bo-V6W" secondAttribute="height" id="bb7-EL-YyX"/>
|
||||
<constraint firstItem="PSK-Ys-mFZ" firstAttribute="leading" secondItem="mtL-ar-cGM" secondAttribute="leading" id="fEj-Bj-7VH"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="GGO-lU-mzy" firstAttribute="leading" secondItem="q5w-jW-Chn" secondAttribute="leading" id="0go-36-y89"/>
|
||||
<constraint firstItem="GGO-lU-mzy" firstAttribute="height" secondItem="q5w-jW-Chn" secondAttribute="height" id="Hu0-Yv-PbT"/>
|
||||
<constraint firstAttribute="height" constant="254" id="KST-Zr-MUU"/>
|
||||
<constraint firstAttribute="bottom" secondItem="GGO-lU-mzy" secondAttribute="bottom" id="Nt2-u8-Jy8"/>
|
||||
<constraint firstItem="GGO-lU-mzy" firstAttribute="width" secondItem="q5w-jW-Chn" secondAttribute="width" priority="750" id="TCc-RX-U0D"/>
|
||||
<constraint firstAttribute="trailing" secondItem="GGO-lU-mzy" secondAttribute="trailing" id="bZ7-83-JVY"/>
|
||||
<constraint firstItem="GGO-lU-mzy" firstAttribute="top" secondItem="q5w-jW-Chn" secondAttribute="top" id="bqg-vJ-nua"/>
|
||||
<constraint firstItem="mF9-z9-HWN" firstAttribute="width" secondItem="PSz-Kf-Ihe" secondAttribute="width" id="XnH-V7-TZc"/>
|
||||
<constraint firstItem="6wz-nj-9Hk" firstAttribute="width" secondItem="PSz-Kf-Ihe" secondAttribute="width" id="iKl-Zj-mQ5"/>
|
||||
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="80" id="pJI-V4-7Ss"/>
|
||||
<constraint firstItem="mtL-ar-cGM" firstAttribute="width" secondItem="PSz-Kf-Ihe" secondAttribute="width" id="z7N-mA-IV4"/>
|
||||
</constraints>
|
||||
</scrollView>
|
||||
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="neX-0h-hs4" userLabel="Continue">
|
||||
<rect key="frame" x="50" y="453" width="314" height="50"/>
|
||||
<color key="backgroundColor" red="0.1176470588" green="0.58823529409999997" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="welcome_storyboard.button_next2"/>
|
||||
</stackView>
|
||||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="16" translatesAutoresizingMaskIntoConstraints="NO" id="pHi-wc-Fah">
|
||||
<rect key="frame" x="20" y="564.33333333333337" width="374" height="144"/>
|
||||
<subviews>
|
||||
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="neX-0h-hs4" userLabel="Continue" customClass="BookmarksSubscriptionButton" customModule="maps_me" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="374" height="64"/>
|
||||
<color key="backgroundColor" red="0.1176470588" green="0.58823529409999997" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="welcome_storyboard.button_subscription_annual"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="64" id="fov-Od-QwC"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
|
||||
<state key="normal" title="!! Annual">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</state>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="textColorHighlightedName" value="white"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium14"/>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
|
||||
<integer key="value" value="6"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="white"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="linkBlue"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundHighlightedColorName" value="linkBlueHighlighted"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="onAnnualButtonTap:" destination="-1" eventType="touchUpInside" id="KEE-ZN-J9Y"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sj5-ey-SEv" userLabel="Continue" customClass="BookmarksSubscriptionButton" customModule="maps_me" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="80" width="374" height="64"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="welcome_storyboard.button_subscription_monthly"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="64" id="uHO-Gb-tBx"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
|
||||
<state key="normal" title="!! Monthly">
|
||||
<color key="titleColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</state>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="textColorHighlightedName" value="white"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium14"/>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
|
||||
<integer key="value" value="6"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="blackHintText"/>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="layer.borderWidth">
|
||||
<integer key="value" value="1"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="borderColorName" value="blackHintText"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundHighlightedColorName" value="blackDividers"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="onMonthlyButtonTap:" destination="-1" eventType="touchUpInside" id="Uc2-Qk-Flp"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
</stackView>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8Qf-I6-xXL">
|
||||
<rect key="frame" x="28" y="541.33333333333337" width="68.333333333333329" height="35"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="- $38" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="12" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="YH0-h4-ZEb">
|
||||
<rect key="frame" x="10.000000000000004" y="6.6666666666666305" width="48.333333333333343" height="21.666666666666671"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="boolean" keyPath="keyPath" value="YES"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="0.63921568630000003" green="0.20784313730000001" blue="0.95686274510000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="50" id="fov-Od-QwC"/>
|
||||
<constraint firstItem="YH0-h4-ZEb" firstAttribute="leading" secondItem="8Qf-I6-xXL" secondAttribute="leading" constant="10" id="C0N-aA-9E7"/>
|
||||
<constraint firstAttribute="trailing" secondItem="YH0-h4-ZEb" secondAttribute="trailing" constant="10" id="Dp8-du-XOO"/>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="20" id="HAR-vc-83l"/>
|
||||
<constraint firstItem="YH0-h4-ZEb" firstAttribute="centerY" secondItem="8Qf-I6-xXL" secondAttribute="centerY" id="fDL-BG-gMf"/>
|
||||
<constraint firstAttribute="height" constant="35" id="jRh-2M-BXj"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
|
||||
<state key="normal" title="CONTINUE">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</state>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="textColorHighlightedName" value="white"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium14"/>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
|
||||
<integer key="value" value="6"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="white"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="linkBlue"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundHighlightedColorName" value="linkBlueHighlighted"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="discountBackground"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="onContinue:" destination="-1" eventType="touchUpInside" id="aAu-Te-fXW"/>
|
||||
</connections>
|
||||
</button>
|
||||
</view>
|
||||
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="a64-qc-DrZ" userLabel="Restore">
|
||||
<rect key="frame" x="50" y="511" width="314" height="50"/>
|
||||
<rect key="frame" x="50" y="718.33333333333337" width="314" height="50"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="welcome_storyboard.button_next2"/>
|
||||
<constraints>
|
||||
|
@ -162,7 +274,7 @@
|
|||
</connections>
|
||||
</button>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="justified" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tWZ-GP-RxW">
|
||||
<rect key="frame" x="20" y="569" width="374" height="64.666666666666629"/>
|
||||
<rect key="frame" x="20" y="776.33333333333337" width="374" height="64.666666666666629"/>
|
||||
<string key="text">Payment will be charged to your iTunes account at confirmation of purchase. The subscription will automatically renew unless auto-renew is turned off at least 24 hours before the end of the current period. Your account will be charged according to your plan for renewal within 24 hours prior to the end of the current period. You can manage or turn off auto-renew in your Apple ID account settings at any time of your purchase.</string>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="9"/>
|
||||
<color key="textColor" white="0.0" alpha="0.31555008561643838" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
|
@ -174,7 +286,7 @@
|
|||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="awa-we-Pjk" userLabel="TermsOfUse">
|
||||
<rect key="frame" x="20" y="633.66666666666663" width="66" height="44"/>
|
||||
<rect key="frame" x="20" y="841" width="66" height="44"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="welcome_storyboard.button_next2"/>
|
||||
<constraints>
|
||||
|
@ -195,7 +307,7 @@
|
|||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" horizontalCompressionResistancePriority="749" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="60B-kT-Eev" userLabel="PrivacyPolicy">
|
||||
<rect key="frame" x="325" y="633.66666666666663" width="69" height="44"/>
|
||||
<rect key="frame" x="325" y="841" width="69" height="44"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="welcome_storyboard.button_next2"/>
|
||||
<constraints>
|
||||
|
@ -215,17 +327,27 @@
|
|||
<action selector="onPrivacy:" destination="-1" eventType="touchUpInside" id="ySf-IG-mMz"/>
|
||||
</connections>
|
||||
</button>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="bookmarksSubscriptionFooter" translatesAutoresizingMaskIntoConstraints="NO" id="GUc-JW-T3W">
|
||||
<rect key="frame" x="0.0" y="786.33333333333337" width="414" height="228.66666666666663"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" secondItem="GUc-JW-T3W" secondAttribute="height" multiplier="375:207" id="yvv-rm-Tjg"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MPt-NS-DbA">
|
||||
<rect key="frame" x="0.0" y="1015" width="414" height="736"/>
|
||||
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="bookmarkSubscriptionFooterBackground"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="v0Z-5m-unD">
|
||||
<rect key="frame" x="362" y="0.0" width="44" height="44"/>
|
||||
<rect key="frame" x="362" y="4" width="44" height="44"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="44" id="9dL-YL-GLY"/>
|
||||
<constraint firstAttribute="width" constant="44" id="tIs-g1-eI6"/>
|
||||
</constraints>
|
||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<state key="normal" image="bookmarksSubscriptionClose"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="tintColorName" value="linkBlue"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="onClose:" destination="-1" eventType="touchUpInside" id="VMj-IW-RNx"/>
|
||||
</connections>
|
||||
|
@ -233,43 +355,61 @@
|
|||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="bOS-sQ-rkD" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="16" id="2dJ-3J-bOG"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="q5w-jW-Chn" secondAttribute="trailing" constant="13" id="3OB-ln-ZP1"/>
|
||||
<constraint firstAttribute="trailing" secondItem="vzD-qz-Fwt" secondAttribute="trailing" constant="16" id="3Xf-Bz-ISk"/>
|
||||
<constraint firstItem="MPt-NS-DbA" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" id="1QZ-Ze-yR5"/>
|
||||
<constraint firstItem="bOS-sQ-rkD" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="24" id="2dJ-3J-bOG"/>
|
||||
<constraint firstAttribute="trailing" secondItem="vzD-qz-Fwt" secondAttribute="trailing" constant="24" id="3Xf-Bz-ISk"/>
|
||||
<constraint firstAttribute="trailing" secondItem="GUc-JW-T3W" secondAttribute="trailing" id="5eY-po-9Sf"/>
|
||||
<constraint firstItem="awa-we-Pjk" firstAttribute="top" secondItem="tWZ-GP-RxW" secondAttribute="bottom" id="7ey-rc-AJD"/>
|
||||
<constraint firstItem="vzD-qz-Fwt" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="16" id="819-Wz-tmt"/>
|
||||
<constraint firstItem="q5w-jW-Chn" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="13" id="9kc-0C-7dp"/>
|
||||
<constraint firstItem="vzD-qz-Fwt" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="24" id="819-Wz-tmt"/>
|
||||
<constraint firstItem="pHi-wc-Fah" firstAttribute="top" secondItem="8Qf-I6-xXL" secondAttribute="bottom" constant="-12" id="Av2-tQ-YYz"/>
|
||||
<constraint firstAttribute="bottom" secondItem="GUc-JW-T3W" secondAttribute="bottom" id="DbY-me-8DS"/>
|
||||
<constraint firstItem="Y38-kF-ZnW" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" id="Egn-no-uGA"/>
|
||||
<constraint firstItem="60B-kT-Eev" firstAttribute="top" secondItem="tWZ-GP-RxW" secondAttribute="bottom" id="HNk-gd-Qc6"/>
|
||||
<constraint firstAttribute="trailing" secondItem="a64-qc-DrZ" secondAttribute="trailing" constant="50" id="INc-Pv-5M3"/>
|
||||
<constraint firstItem="bOS-sQ-rkD" firstAttribute="top" secondItem="Eiz-QQ-h0b" secondAttribute="top" constant="24" id="JTG-8l-iqj"/>
|
||||
<constraint firstItem="8Qf-I6-xXL" firstAttribute="leading" secondItem="pHi-wc-Fah" secondAttribute="leading" constant="8" id="Ifx-No-gEE"/>
|
||||
<constraint firstItem="pHi-wc-Fah" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="20" id="J0P-76-RPl"/>
|
||||
<constraint firstItem="awa-we-Pjk" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="20" id="Loh-WS-cJr"/>
|
||||
<constraint firstItem="a64-qc-DrZ" firstAttribute="top" secondItem="pHi-wc-Fah" secondAttribute="bottom" constant="10" id="N8l-CI-D02"/>
|
||||
<constraint firstItem="Y38-kF-ZnW" firstAttribute="top" secondItem="Eiz-QQ-h0b" secondAttribute="top" id="NJc-wc-d8G"/>
|
||||
<constraint firstItem="GUc-JW-T3W" firstAttribute="centerX" secondItem="Eiz-QQ-h0b" secondAttribute="centerX" id="NUr-Gl-90a"/>
|
||||
<constraint firstAttribute="trailing" secondItem="tWZ-GP-RxW" secondAttribute="trailing" constant="20" id="OFb-vM-2cl"/>
|
||||
<constraint firstAttribute="bottom" secondItem="60B-kT-Eev" secondAttribute="bottom" constant="130" id="Oal-d1-061"/>
|
||||
<constraint firstItem="a64-qc-DrZ" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="50" id="R8g-2f-TIi"/>
|
||||
<constraint firstItem="q5w-jW-Chn" firstAttribute="centerX" secondItem="Eiz-QQ-h0b" secondAttribute="centerX" id="RqB-aN-G6b"/>
|
||||
<constraint firstItem="neX-0h-hs4" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="50" id="SOV-6g-yrG"/>
|
||||
<constraint firstAttribute="trailing" secondItem="bOS-sQ-rkD" secondAttribute="trailing" constant="16" id="UBz-JQ-dSq"/>
|
||||
<constraint firstAttribute="trailing" secondItem="neX-0h-hs4" secondAttribute="trailing" constant="50" id="UTD-bj-67L"/>
|
||||
<constraint firstAttribute="trailing" secondItem="pHi-wc-Fah" secondAttribute="trailing" constant="20" id="SMh-T1-d1h"/>
|
||||
<constraint firstAttribute="trailing" secondItem="bOS-sQ-rkD" secondAttribute="trailing" constant="24" id="UBz-JQ-dSq"/>
|
||||
<constraint firstAttribute="trailing" secondItem="v0Z-5m-unD" secondAttribute="trailing" constant="8" id="aj5-SM-A2m"/>
|
||||
<constraint firstItem="60B-kT-Eev" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="awa-we-Pjk" secondAttribute="trailing" constant="16" id="bOW-rf-yBR"/>
|
||||
<constraint firstItem="neX-0h-hs4" firstAttribute="top" secondItem="q5w-jW-Chn" secondAttribute="bottom" constant="34" id="cZ6-hC-ePD"/>
|
||||
<constraint firstItem="q5w-jW-Chn" firstAttribute="top" secondItem="vzD-qz-Fwt" secondAttribute="bottom" constant="34" id="esu-FS-r9d"/>
|
||||
<constraint firstItem="vzD-qz-Fwt" firstAttribute="top" secondItem="bOS-sQ-rkD" secondAttribute="bottom" constant="16" id="f5X-2e-9pD"/>
|
||||
<constraint firstItem="PSz-Kf-Ihe" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="16" id="cbD-Jg-kMl"/>
|
||||
<constraint firstItem="vzD-qz-Fwt" firstAttribute="top" secondItem="bOS-sQ-rkD" secondAttribute="bottom" constant="4" id="f5X-2e-9pD"/>
|
||||
<constraint firstItem="tWZ-GP-RxW" firstAttribute="top" secondItem="a64-qc-DrZ" secondAttribute="bottom" constant="8" id="fUL-gY-evu"/>
|
||||
<constraint firstItem="a64-qc-DrZ" firstAttribute="top" secondItem="neX-0h-hs4" secondAttribute="bottom" constant="8" id="gEf-O0-spw"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Y38-kF-ZnW" secondAttribute="trailing" id="g3S-MI-Ade"/>
|
||||
<constraint firstAttribute="trailing" secondItem="MPt-NS-DbA" secondAttribute="trailing" id="h6E-wP-Tod"/>
|
||||
<constraint firstItem="pHi-wc-Fah" firstAttribute="top" secondItem="PSz-Kf-Ihe" secondAttribute="bottom" constant="44" id="hJY-HS-z7Q"/>
|
||||
<constraint firstAttribute="trailing" secondItem="PSz-Kf-Ihe" secondAttribute="trailing" constant="16" id="jgx-hb-G4E"/>
|
||||
<constraint firstItem="tWZ-GP-RxW" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" constant="20" id="km3-TI-Nnc"/>
|
||||
<constraint firstItem="v0Z-5m-unD" firstAttribute="top" secondItem="Eiz-QQ-h0b" secondAttribute="top" id="lx8-MC-GlM"/>
|
||||
<constraint firstItem="v0Z-5m-unD" firstAttribute="top" secondItem="Eiz-QQ-h0b" secondAttribute="top" constant="4" id="qdm-IQ-Y6J"/>
|
||||
<constraint firstItem="GUc-JW-T3W" firstAttribute="leading" secondItem="Eiz-QQ-h0b" secondAttribute="leading" id="rj2-o4-Jw3"/>
|
||||
<constraint firstItem="PSz-Kf-Ihe" firstAttribute="top" secondItem="vzD-qz-Fwt" secondAttribute="bottom" constant="24" id="syy-VW-Tlt"/>
|
||||
<constraint firstItem="MPt-NS-DbA" firstAttribute="top" secondItem="Eiz-QQ-h0b" secondAttribute="bottom" id="vy8-dM-4jS"/>
|
||||
<constraint firstAttribute="trailing" secondItem="60B-kT-Eev" secondAttribute="trailing" constant="20" id="wEX-hK-g2z"/>
|
||||
<constraint firstAttribute="bottom" secondItem="awa-we-Pjk" secondAttribute="bottom" id="yuL-cU-wGM"/>
|
||||
<constraint firstItem="bOS-sQ-rkD" firstAttribute="top" secondItem="Y38-kF-ZnW" secondAttribute="bottom" constant="20" id="xYU-mb-XeF"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="bookmarkSubscriptionBackground"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="Eiz-QQ-h0b" firstAttribute="top" secondItem="0eE-hs-sId" secondAttribute="top" id="9jr-XF-OP2"/>
|
||||
<constraint firstItem="Eiz-QQ-h0b" firstAttribute="leading" secondItem="0eE-hs-sId" secondAttribute="leading" id="DjF-kC-58d"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Eiz-QQ-h0b" secondAttribute="trailing" id="GL8-iC-MmT"/>
|
||||
<constraint firstItem="MPt-NS-DbA" firstAttribute="height" secondItem="0eE-hs-sId" secondAttribute="height" id="Hu8-4c-2lH"/>
|
||||
<constraint firstAttribute="bottom" secondItem="Eiz-QQ-h0b" secondAttribute="bottom" id="amI-MH-1yy"/>
|
||||
<constraint firstItem="Eiz-QQ-h0b" firstAttribute="width" secondItem="0eE-hs-sId" secondAttribute="width" id="ke9-ke-QPG"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="bookmarkSubscriptionScrollBackground"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</scrollView>
|
||||
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="BHb-cU-Ze3">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
|
||||
|
@ -284,7 +424,6 @@
|
|||
<constraint firstItem="XZg-yN-Jtv" firstAttribute="centerX" secondItem="BHb-cU-Ze3" secondAttribute="centerX" id="Ade-4z-Spa"/>
|
||||
<constraint firstItem="XZg-yN-Jtv" firstAttribute="centerY" secondItem="BHb-cU-Ze3" secondAttribute="centerY" id="CQX-i5-ZcY"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="Nh0-0H-Zgm"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="toastBackground"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
|
@ -292,20 +431,16 @@
|
|||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="BcI-3g-iCI" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="1cC-us-Ehh"/>
|
||||
<constraint firstItem="fnl-2z-Ty3" firstAttribute="trailing" secondItem="0eE-hs-sId" secondAttribute="trailing" id="7gZ-TD-rRu"/>
|
||||
<constraint firstItem="0eE-hs-sId" firstAttribute="top" secondItem="fnl-2z-Ty3" secondAttribute="top" id="Avd-W3-cXU"/>
|
||||
<constraint firstAttribute="trailing" secondItem="BcI-3g-iCI" secondAttribute="trailing" id="IKZ-OT-jxC"/>
|
||||
<constraint firstAttribute="bottom" secondItem="BcI-3g-iCI" secondAttribute="bottom" id="SHg-Ke-dap"/>
|
||||
<constraint firstAttribute="trailing" secondItem="0eE-hs-sId" secondAttribute="trailing" id="7gZ-TD-rRu"/>
|
||||
<constraint firstItem="0eE-hs-sId" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="Avd-W3-cXU"/>
|
||||
<constraint firstAttribute="bottom" secondItem="BHb-cU-Ze3" secondAttribute="bottom" id="X6W-ia-1Mi"/>
|
||||
<constraint firstAttribute="trailing" secondItem="BHb-cU-Ze3" secondAttribute="trailing" id="dNr-7E-k98"/>
|
||||
<constraint firstItem="BcI-3g-iCI" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="doL-Dw-bDS"/>
|
||||
<constraint firstItem="BHb-cU-Ze3" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="ipn-ug-1wp"/>
|
||||
<constraint firstItem="fnl-2z-Ty3" firstAttribute="bottom" secondItem="0eE-hs-sId" secondAttribute="bottom" id="ku8-zI-AI4"/>
|
||||
<constraint firstItem="0eE-hs-sId" firstAttribute="leading" secondItem="fnl-2z-Ty3" secondAttribute="leading" id="sv4-ek-sAP"/>
|
||||
<constraint firstAttribute="bottom" secondItem="0eE-hs-sId" secondAttribute="bottom" id="ku8-zI-AI4"/>
|
||||
<constraint firstItem="0eE-hs-sId" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="sv4-ek-sAP"/>
|
||||
<constraint firstAttribute="top" secondItem="BHb-cU-Ze3" secondAttribute="top" id="vTu-oZ-veb"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
|
||||
<viewLayoutGuide key="safeArea" id="k4r-ns-RCJ"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
|
@ -323,6 +458,9 @@
|
|||
</tapGestureRecognizer>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="bookmarksSubscriptionBullet" width="16" height="16"/>
|
||||
<image name="bookmarksSubscriptionClose" width="24" height="24"/>
|
||||
<image name="bookmarksSubscriptionFooter" width="375" height="208"/>
|
||||
<image name="bookmarksSubscriptionHeader" width="375" height="212.33332824707031"/>
|
||||
</resources>
|
||||
</document>
|
||||
|
|
|
@ -1,11 +1,9 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
|
@ -91,6 +89,9 @@
|
|||
</constraints>
|
||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
||||
<viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<point key="canvasLocation" x="47.200000000000003" y="143.02848575712144"/>
|
||||
</view>
|
||||
</objects>
|
||||
|
|
|
@ -26,7 +26,7 @@ class PaidRouteViewController: MWMViewController {
|
|||
|
||||
private var product: IStoreProduct?
|
||||
private var subscription: ISubscription?
|
||||
private let subscriptionManager: SubscriptionManager
|
||||
private let subscriptionManager: ISubscriptionManager
|
||||
|
||||
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
|
||||
get { return [.portrait] }
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
+ (UIColor *)subscriptionCellBorder;
|
||||
+ (UIColor *)subscriptionCellBackground;
|
||||
+ (UIColor *)subscriptionCellTitle;
|
||||
+ (UIColor *)discountBackground;
|
||||
+ (UIColor *)bookmarkSubscriptionScrollBackground;
|
||||
+ (UIColor *)bookmarkSubscriptionBackground;
|
||||
+ (UIColor *)bookmarkSubscriptionFooterBackground;
|
||||
|
||||
+ (UIColor *)colorWithName:(NSString *)colorName;
|
||||
+ (UIColor *)colorFromHexString:(NSString *)hexString;
|
||||
|
|
|
@ -52,7 +52,11 @@ NSDictionary<NSString *, UIColor *> * night = @{
|
|||
@"toastBackground": [UIColor colorWithWhite:0. alpha:alpha87],
|
||||
@"statusBarBackground": [UIColor colorWithWhite:0. alpha:alpha32],
|
||||
@"bannerBackground" : [UIColor colorWithRed:scaled(71) green:scaled(75) blue:scaled(79) alpha:alpha100],
|
||||
@"border" : [UIColor colorWithWhite:1. alpha:alpha04]
|
||||
@"border" : [UIColor colorWithWhite:1. alpha:alpha04],
|
||||
@"discountBackground" : [UIColor colorWithRed:scaled(240) green:scaled(100) blue:scaled(60) alpha:alpha100],
|
||||
@"bookmarkSubscriptionBackground" : [UIColor colorWithRed:scaled(60.) green:scaled(64.) blue:scaled(68.) alpha:alpha100],
|
||||
@"bookmarkSubscriptionScrollBackground" : [UIColor colorWithRed:scaled(137) green:scaled(217) blue:scaled(255) alpha:alpha100],
|
||||
@"bookmarkSubscriptionFooterBackground" : [UIColor colorWithRed:scaled(47) green:scaled(58) blue:scaled(73) alpha:alpha100],
|
||||
};
|
||||
|
||||
NSDictionary<NSString *, UIColor *> * day = @{
|
||||
|
@ -101,7 +105,11 @@ NSDictionary<NSString *, UIColor *> * day = @{
|
|||
@"toastBackground" : [UIColor colorWithWhite:1. alpha:alpha87],
|
||||
@"statusBarBackground" : [UIColor colorWithWhite:1. alpha:alpha36],
|
||||
@"bannerBackground" : [UIColor colorWithRed:scaled(249) green:scaled(251) blue:scaled(231) alpha:alpha100],
|
||||
@"border" : [UIColor colorWithWhite:0. alpha:alpha04]
|
||||
@"border" : [UIColor colorWithWhite:0. alpha:alpha04],
|
||||
@"discountBackground" : [UIColor colorWithRed:scaled(240) green:scaled(100) blue:scaled(60) alpha:alpha100],
|
||||
@"bookmarkSubscriptionBackground" : [UIColor colorWithRed:scaled(240) green:scaled(252) blue:scaled(255) alpha:alpha100],
|
||||
@"bookmarkSubscriptionScrollBackground" : [UIColor colorWithRed:scaled(137) green:scaled(217) blue:scaled(255) alpha:alpha100],
|
||||
@"bookmarkSubscriptionFooterBackground" : [UIColor colorWithRed:scaled(47) green:scaled(58) blue:scaled(73) alpha:alpha100],
|
||||
};
|
||||
|
||||
UIColor * color(SEL cmd)
|
||||
|
@ -416,4 +424,24 @@ UIColor * color(SEL cmd)
|
|||
}
|
||||
|
||||
|
||||
+ (UIColor *)discountBackground
|
||||
{
|
||||
return color(_cmd);
|
||||
}
|
||||
|
||||
+ (UIColor *)bookmarkSubscriptionScrollBackground
|
||||
{
|
||||
return color(_cmd);
|
||||
}
|
||||
|
||||
+ (UIColor *)bookmarkSubscriptionBackground
|
||||
{
|
||||
return color(_cmd);
|
||||
}
|
||||
|
||||
+ (UIColor *)bookmarkSubscriptionFooterBackground
|
||||
{
|
||||
return color(_cmd);
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
+ (UIFont *)bold48;
|
||||
+ (UIFont *)italic16;
|
||||
+ (UIFont *)semibold14;
|
||||
+ (UIFont *)semibold16;
|
||||
|
||||
+ (UIFont *)fontWithName:(NSString *)fontName;
|
||||
|
||||
|
|
|
@ -47,6 +47,7 @@ NSString * const kLightFontName = @"HelveticaNeue-Light";
|
|||
+ (UIFont *)bold48 { return [UIFont boldSystemFontOfSize:48]; }
|
||||
+ (UIFont *)italic16 { return [UIFont italicSystemFontOfSize:16]; }
|
||||
+ (UIFont *)semibold14 { return [UIFont systemFontOfSize:14 weight:UIFontWeightSemibold]; }
|
||||
+ (UIFont *)semibold16 { return [UIFont systemFontOfSize:16 weight:UIFontWeightSemibold]; }
|
||||
+ (UIFont *)fontWithName:(NSString *)fontName
|
||||
{
|
||||
#pragma clang diagnostic push
|
||||
|
|
|
@ -10,4 +10,8 @@
|
|||
self.tintColor = [UIColor colorWithName:colorName];
|
||||
}
|
||||
|
||||
- (void) setBorderColorName:(NSString*) colorName {
|
||||
self.layer.borderColor = [UIColor colorWithName:colorName].CGColor;
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -27,13 +27,13 @@ final class InAppPurchase: NSObject {
|
|||
return InAppBilling()
|
||||
}
|
||||
|
||||
@objc static var adsRemovalSubscriptionManager: SubscriptionManager = {
|
||||
@objc static var adsRemovalSubscriptionManager: ISubscriptionManager = {
|
||||
return SubscriptionManager(productIds: MWMPurchaseManager.productIds(),
|
||||
serverId: MWMPurchaseManager.adsRemovalServerId(),
|
||||
vendorId: MWMPurchaseManager.adsRemovalVendorId())
|
||||
} ()
|
||||
|
||||
@objc static var bookmarksSubscriptionManager: SubscriptionManager = {
|
||||
@objc static var bookmarksSubscriptionManager: ISubscriptionManager = {
|
||||
return SubscriptionManager(productIds: MWMPurchaseManager.bookmakrsProductIds(),
|
||||
serverId: MWMPurchaseManager.bookmarksSubscriptionServerId(),
|
||||
vendorId: MWMPurchaseManager.bookmarksSubscriptionVendorId())
|
||||
|
|
|
@ -1,3 +1,16 @@
|
|||
@objc protocol ISubscriptionManager: class{
|
||||
typealias SuscriptionsCompletion = ([ISubscription]?, Error?) -> Void
|
||||
typealias ValidationCompletion = (MWMValidationResult) -> Void
|
||||
|
||||
@objc static func canMakePayments() -> Bool
|
||||
@objc func getAvailableSubscriptions(_ completion: @escaping SuscriptionsCompletion)
|
||||
@objc func subscribe(to subscription: ISubscription)
|
||||
@objc func addListener(_ listener: SubscriptionManagerListener)
|
||||
@objc func removeListener(_ listener: SubscriptionManagerListener)
|
||||
@objc func validate(completion: ValidationCompletion?)
|
||||
@objc func restore(_ callback: @escaping ValidationCompletion)
|
||||
}
|
||||
|
||||
@objc protocol SubscriptionManagerListener: AnyObject {
|
||||
func didFailToSubscribe(_ subscription: ISubscription, error: Error?)
|
||||
func didSubscribe(_ subscription: ISubscription)
|
||||
|
@ -6,10 +19,7 @@
|
|||
func didValidate(_ isValid: Bool)
|
||||
}
|
||||
|
||||
class SubscriptionManager: NSObject {
|
||||
typealias SuscriptionsCompletion = ([ISubscription]?, Error?) -> Void
|
||||
typealias ValidationCompletion = (MWMValidationResult) -> Void
|
||||
|
||||
class SubscriptionManager: NSObject, ISubscriptionManager {
|
||||
private let paymentQueue = SKPaymentQueue.default()
|
||||
private var productsRequest: SKProductsRequest?
|
||||
private var subscriptionsComplection: SuscriptionsCompletion?
|
||||
|
|
After Width: | Height: | Size: 309 B |
After Width: | Height: | Size: 535 B |
After Width: | Height: | Size: 746 B |
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "Combined Shape.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "Combined Shape@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "Combined Shape@3x.png",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "Mask Group.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "Mask Group@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "Mask Group@3x.png",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 86 KiB |
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "Group 9.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "Group 9@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"filename" : "Group 9@3x.png",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
BIN
iphone/Maps/Images.xcassets/BookmarksSubscription/bookmarksSubscriptionHeader.imageset/Group 9.png
vendored
Normal file
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 115 KiB |
After Width: | Height: | Size: 187 KiB |
|
@ -366,8 +366,6 @@
|
|||
470F5A5C2181DE7500754295 /* PaidRouteViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 470F5A5A2181DE7400754295 /* PaidRouteViewController.xib */; };
|
||||
470F5A7D2189BB2F00754295 /* PaidRoutePurchase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470F5A7C2189BB2F00754295 /* PaidRoutePurchase.swift */; };
|
||||
470F5A7F2189C30800754295 /* InAppPurchase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470F5A7E2189C30800754295 /* InAppPurchase.swift */; };
|
||||
4710366522D3764600585272 /* BookmarksSubscriptionCellViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4710366322D3764600585272 /* BookmarksSubscriptionCellViewController.swift */; };
|
||||
4710366622D3764600585272 /* BookmarksSubscriptionCellViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4710366422D3764600585272 /* BookmarksSubscriptionCellViewController.xib */; };
|
||||
4716EABA21A325310029B886 /* IPaidRouteStatistics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4716EAB921A325310029B886 /* IPaidRouteStatistics.swift */; };
|
||||
4716EAC121A6E0570029B886 /* BookmarksVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4716EAC021A6E0570029B886 /* BookmarksVC.xib */; };
|
||||
4719A643219CB61D009F9AA7 /* BillingPendingTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4719A642219CB61D009F9AA7 /* BillingPendingTransaction.swift */; };
|
||||
|
@ -576,6 +574,7 @@
|
|||
6B653B951C7F2DE4007BEFC5 /* cuisine-strings in Resources */ = {isa = PBXBuildFile; fileRef = 6B653B931C7F2DE4007BEFC5 /* cuisine-strings */; };
|
||||
6B9978361C89A316003B8AA0 /* editor.config in Resources */ = {isa = PBXBuildFile; fileRef = 6B9978341C89A316003B8AA0 /* editor.config */; };
|
||||
7BD07E4A8D71CA41F082BEC7 /* Pods_MAPS_ME.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58E5736C23FC4E77509C9946 /* Pods_MAPS_ME.framework */; };
|
||||
99865A1B234F629100127532 /* BookmarksSubscriptionButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99865A1A234F629100127532 /* BookmarksSubscriptionButton.swift */; };
|
||||
A630D1EA207CA95900976DEA /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = A630D1E8207CA95900976DEA /* Localizable.stringsdict */; };
|
||||
B32FE74020D2844600EF7446 /* DownloadedBookmarksViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B32FE73E20D2844600EF7446 /* DownloadedBookmarksViewController.swift */; };
|
||||
B32FE74120D2844600EF7446 /* DownloadedBookmarksViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = B32FE73F20D2844600EF7446 /* DownloadedBookmarksViewController.xib */; };
|
||||
|
@ -1461,8 +1460,6 @@
|
|||
470F5A5A2181DE7400754295 /* PaidRouteViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PaidRouteViewController.xib; sourceTree = "<group>"; };
|
||||
470F5A7C2189BB2F00754295 /* PaidRoutePurchase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaidRoutePurchase.swift; sourceTree = "<group>"; };
|
||||
470F5A7E2189C30800754295 /* InAppPurchase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InAppPurchase.swift; sourceTree = "<group>"; };
|
||||
4710366322D3764600585272 /* BookmarksSubscriptionCellViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarksSubscriptionCellViewController.swift; sourceTree = "<group>"; };
|
||||
4710366422D3764600585272 /* BookmarksSubscriptionCellViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BookmarksSubscriptionCellViewController.xib; sourceTree = "<group>"; };
|
||||
4716EAB921A325310029B886 /* IPaidRouteStatistics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPaidRouteStatistics.swift; sourceTree = "<group>"; };
|
||||
4716EAC021A6E0570029B886 /* BookmarksVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BookmarksVC.xib; sourceTree = "<group>"; };
|
||||
4716EACA21B01C270029B886 /* MWMUGCReviewSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMUGCReviewSource.h; sourceTree = "<group>"; };
|
||||
|
@ -1642,6 +1639,7 @@
|
|||
8D1107310486CEB800E47090 /* MAPSME.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = MAPSME.plist; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
|
||||
978D4A30199A11E600D72CA7 /* faq.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = faq.html; path = ../../data/faq.html; sourceTree = "<group>"; };
|
||||
97A5967E19B9CD47007A963F /* copyright.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = copyright.html; path = ../../data/copyright.html; sourceTree = "<group>"; };
|
||||
99865A1A234F629100127532 /* BookmarksSubscriptionButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarksSubscriptionButton.swift; sourceTree = "<group>"; };
|
||||
9DF04B231B71010E00DACAF1 /* 02_droidsans-fallback.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "02_droidsans-fallback.ttf"; path = "../../data/02_droidsans-fallback.ttf"; sourceTree = "<group>"; };
|
||||
A367C93A1B17334800E2B6E7 /* resources-default */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "resources-default"; path = "../../data/resources-default"; sourceTree = "<group>"; };
|
||||
A630D1E9207CA95900976DEA /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ar; path = ar.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
|
||||
|
@ -3717,8 +3715,7 @@
|
|||
45AC339022C4F57C004DC574 /* MWMUTM.h */,
|
||||
4728F68E22CE430800E00028 /* BookmarksSubscriptionViewController.swift */,
|
||||
4728F68F22CE430800E00028 /* BookmarksSubscriptionViewController.xib */,
|
||||
4710366322D3764600585272 /* BookmarksSubscriptionCellViewController.swift */,
|
||||
4710366422D3764600585272 /* BookmarksSubscriptionCellViewController.xib */,
|
||||
99865A1A234F629100127532 /* BookmarksSubscriptionButton.swift */,
|
||||
CD4A1F19230EADC100F2A6B6 /* CatalogConnectionErrorView.swift */,
|
||||
CD4A1F1B230EB43B00F2A6B6 /* CatalogConnectionErrorView.xib */,
|
||||
47E6688923196F0000057733 /* UIViewController+Subscription.swift */,
|
||||
|
@ -4926,7 +4923,6 @@
|
|||
F61757F11FC731F5000AD0D0 /* DiscoveryOnlineTemplateCell.xib in Resources */,
|
||||
6741A95B1BF340DE002C974C /* 06_code2000.ttf in Resources */,
|
||||
F603E05E1FDE9703006B84D6 /* DiscoverySearchCollectionHolderCell.xib in Resources */,
|
||||
4710366622D3764600585272 /* BookmarksSubscriptionCellViewController.xib in Resources */,
|
||||
6741A99F1BF340DE002C974C /* 07_roboto_medium.ttf in Resources */,
|
||||
F6E2FE6D1E097BA00083EBEC /* _MWMOHHeaderCell.xib in Resources */,
|
||||
F6E2FE701E097BA00083EBEC /* _MWMOHSubCell.xib in Resources */,
|
||||
|
@ -5432,6 +5428,7 @@
|
|||
34574A671E3B85F80061E839 /* ThemeManager.swift in Sources */,
|
||||
34BF0CC71C31304A00D097EB /* MWMAuthorizationCommon.mm in Sources */,
|
||||
34AB664D1FC5AA330078E451 /* RouteManagerFooterView.swift in Sources */,
|
||||
99865A1B234F629100127532 /* BookmarksSubscriptionButton.swift in Sources */,
|
||||
3DD1A20B22D8D93500B158F4 /* MWMPromoAfterBooking.mm in Sources */,
|
||||
F6E2FD771E097BA00083EBEC /* MWMMapDownloaderDataSource.mm in Sources */,
|
||||
6741A9E01BF340DE002C974C /* MWMDownloaderDialogHeader.mm in Sources */,
|
||||
|
@ -5711,7 +5708,6 @@
|
|||
47E3C72F2111F472008B3B27 /* CoverVerticalModalTransitioning.swift in Sources */,
|
||||
471C448C2322A7C800C307EC /* BookmarksSubscriptionGoToCatalogViewController.swift in Sources */,
|
||||
346DB83D1E5C4F6700E3123E /* GalleryModel.swift in Sources */,
|
||||
4710366522D3764600585272 /* BookmarksSubscriptionCellViewController.swift in Sources */,
|
||||
34E776101F14B165003040B3 /* VisibleArea.swift in Sources */,
|
||||
330473EA21F7440C00DC4AEA /* MWMHotelParams.mm in Sources */,
|
||||
47C8789922DF622400A772DA /* BookmarksSubscriptionFailViewController.swift in Sources */,
|
||||
|
|