Compare commits
50 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3c2848ffd1 | |||
| f162d50891 | |||
| 9f34fcb70c | |||
| fed617321f | |||
| 139082d366 | |||
| ca43421a8f | |||
| 08975badd3 | |||
| 72759913ae | |||
| 410f53dc1c | |||
| 7916101d7b | |||
| 17313e2bd3 | |||
| fc09d21272 | |||
| 1b85dfa196 | |||
| 830bceb3cb | |||
| 8b467a2b59 | |||
| 7656a3f287 | |||
| aa2f484b6b | |||
| fd21f9adb7 | |||
| ffb3e42939 | |||
| a59bacaf89 | |||
| ab373c569a | |||
| 29c7b63352 | |||
| 45a2479733 | |||
| 36ec1c3d12 | |||
| 59832f0e4b | |||
| f77b041bce | |||
| 07ddae83a0 | |||
| 7ae64d9350 | |||
| 51b9c84daa | |||
| 211dcf48a6 | |||
| e3ae3d440e | |||
| 87b208dc1b | |||
| 9449d4d9d6 | |||
| 5249c14314 | |||
| f95ba4f1e4 | |||
| ad9dfd7f5a | |||
| 6d7e1a010b | |||
| 262727193c | |||
| a17e142cfa | |||
| 99591d784f | |||
| c4ff71566c | |||
| 1418eeda0f | |||
| 8aeab6b534 | |||
| 45ef8d369f | |||
| 8e4786465a | |||
| 353468f82a | |||
| f2c2dec7e9 | |||
| f71316aded | |||
| 5a6ac33d30 | |||
| 2efe85d480 |
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'ContainerControllerSwift'
|
||||
s.version = '1.0.6'
|
||||
s.version = '1.1.3'
|
||||
s.summary = 'This is a swipe-panel from application: https://www.apple.com/ios/maps/'
|
||||
|
||||
# This description is used to generate tags and improve search results.
|
||||
@@ -28,14 +28,13 @@ TODO: Add long description of the pod here.
|
||||
s.author = { 'mrustaa' => 'rustamburger@gmail.com' }
|
||||
s.source = { :git => 'https://github.com/mrustaa/ContainerController.git', :tag => s.version.to_s }
|
||||
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
|
||||
s.swift-version = "5.0"
|
||||
s.swift_version = "5.0"
|
||||
|
||||
# s.ios.deployment_target = '13.0'
|
||||
s.platform = :ios, "13.0"
|
||||
|
||||
s.source_files = 'ContainerControllerSwift/*.{swift}'
|
||||
s.source_files = 'ContainerControllerSwift/ContainerTable/*.{swift}'
|
||||
s.source_files = 'ContainerControllerSwift/ContainerCollection/*.{swift}'
|
||||
s.source_files = 'ContainerControllerSwift/**/*.{swift}'
|
||||
|
||||
s.framework = "UIKit"
|
||||
# s.ios.framework = 'UIKit'
|
||||
# s.resource_bundles = {
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
#
|
||||
# Be sure to run `pod lib lint ContainerControllerSwift.podspec' to ensure this is a
|
||||
# valid spec before submitting.
|
||||
#
|
||||
# Any lines starting with a # are optional, but their use is encouraged
|
||||
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
|
||||
#
|
||||
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'ContainerControllerSwift'
|
||||
s.version = '1.0.2'
|
||||
s.summary = 'This is a swipe-panel from application: https://www.apple.com/ios/maps/'
|
||||
|
||||
# This description is used to generate tags and improve search results.
|
||||
# * Think: What does it do? Why did you write it? What is the focus?
|
||||
# * Try to keep it short, snappy and to the point.
|
||||
# * Write the description between the DESC delimiters below.
|
||||
# * Finally, don't worry about the indent, CocoaPods strips it!
|
||||
|
||||
s.description = <<-DESC
|
||||
TODO: Add long description of the pod here.
|
||||
'This is a swipe-panel from application: https://www.apple.com/ios/maps/'
|
||||
DESC
|
||||
|
||||
s.homepage = 'https://github.com/mrustaa/ContainerController'
|
||||
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
|
||||
s.license = { :type => 'MIT', :file => 'LICENSE' }
|
||||
s.author = { 'rustamburger@gmail.com' => 'rustamburger@gmail.com' }
|
||||
s.source = { :git => 'https://github.com/mrustaa/ContainerController.git', :tag => s.version.to_s }
|
||||
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
|
||||
|
||||
s.swift_version = '5.2.4'
|
||||
s.ios.deployment_target = '13.0'
|
||||
|
||||
s.source_files = 'ContainerControllerSwift/*.{swift}'
|
||||
s.source_files = 'ContainerControllerSwift/**/*.{swift}'
|
||||
|
||||
# s.resource_bundles = {
|
||||
# 'ContainerControllerSwift' => ['ContainerControllerSwift/Assets/*.png']
|
||||
# }
|
||||
|
||||
# s.public_header_files = 'Pod/Classes/**/*.h'
|
||||
# s.frameworks = 'UIKit', 'MapKit'
|
||||
# s.dependency 'AFNetworking', '~> 2.3'
|
||||
end
|
||||
@@ -1,27 +0,0 @@
|
||||
//
|
||||
// TableAdapterCellData.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by Рустам Мотыгуллин on 17/04/2020.
|
||||
// Copyright © 2020 mrusta. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
open class TableAdapterCellData: NSObject {
|
||||
|
||||
// public let cellIdentifier: String
|
||||
//
|
||||
// public init(cellIdentifier: String? = UUID().uuidString) {
|
||||
// self.cellIdentifier = cellIdentifier ?? UUID().uuidString
|
||||
// }
|
||||
|
||||
open func cellHeight() -> CGFloat {
|
||||
return UITableView.automaticDimension
|
||||
}
|
||||
|
||||
open func canEditing() -> Bool {
|
||||
return false
|
||||
}
|
||||
|
||||
}
|
||||
@@ -15,7 +15,7 @@
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "607FACCF1AFB9204008FA782"
|
||||
BuildableName = "ContainerControllerSwift_Example.app"
|
||||
BuildableName = "ContainerController.app"
|
||||
BlueprintName = "ContainerControllerSwift_Example"
|
||||
ReferencedContainer = "container:ContainerControllerSwift.xcodeproj">
|
||||
</BuildableReference>
|
||||
@@ -45,7 +45,7 @@
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "607FACCF1AFB9204008FA782"
|
||||
BuildableName = "ContainerControllerSwift_Example.app"
|
||||
BuildableName = "ContainerController.app"
|
||||
BlueprintName = "ContainerControllerSwift_Example"
|
||||
ReferencedContainer = "container:ContainerControllerSwift.xcodeproj">
|
||||
</BuildableReference>
|
||||
@@ -78,7 +78,7 @@
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "607FACCF1AFB9204008FA782"
|
||||
BuildableName = "ContainerControllerSwift_Example.app"
|
||||
BuildableName = "ContainerController.app"
|
||||
BlueprintName = "ContainerControllerSwift_Example"
|
||||
ReferencedContainer = "container:ContainerControllerSwift.xcodeproj">
|
||||
</BuildableReference>
|
||||
@@ -95,7 +95,7 @@
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "607FACCF1AFB9204008FA782"
|
||||
BuildableName = "ContainerControllerSwift_Example.app"
|
||||
BuildableName = "ContainerController.app"
|
||||
BlueprintName = "ContainerControllerSwift_Example"
|
||||
ReferencedContainer = "container:ContainerControllerSwift.xcodeproj">
|
||||
</BuildableReference>
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "group:..">
|
||||
</FileRef>
|
||||
<FileRef
|
||||
location = "group:ContainerControllerSwift.xcodeproj">
|
||||
</FileRef>
|
||||
|
||||
@@ -1,46 +1,42 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES">
|
||||
<device id="retina4_0" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
|
||||
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<view contentMode="scaleToFill" id="iN0-l3-epB">
|
||||
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text=" Copyright (c) 2015 CocoaPods. All rights reserved." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
|
||||
<rect key="frame" x="20" y="439" width="441" height="21"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ContainerControllerSwift" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
|
||||
<rect key="frame" x="20" y="140" width="441" height="43"/>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ContainerController Swift" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
|
||||
<rect key="frame" x="20" y="169" width="280" height="43"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="screenLandscape5.png" translatesAutoresizingMaskIntoConstraints="NO" id="c2h-J4-UI4">
|
||||
<rect key="frame" x="15" y="60" width="290" height="508"/>
|
||||
</imageView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
|
||||
<constraint firstItem="c2h-J4-UI4" firstAttribute="height" secondItem="iN0-l3-epB" secondAttribute="height" multiplier="0.894089" id="6Pl-Y0-TbW"/>
|
||||
<constraint firstItem="c2h-J4-UI4" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="15" id="8cY-so-aq9"/>
|
||||
<constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
|
||||
<constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/>
|
||||
<constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/>
|
||||
<constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/>
|
||||
<constraint firstAttribute="trailing" secondItem="c2h-J4-UI4" secondAttribute="trailing" constant="15" id="Tlx-R0-BaC"/>
|
||||
<constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
|
||||
<constraint firstAttribute="bottom" secondItem="c2h-J4-UI4" secondAttribute="bottom" id="nuV-b0-dKE"/>
|
||||
</constraints>
|
||||
<nil key="simulatedStatusBarMetrics"/>
|
||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
||||
<point key="canvasLocation" x="548" y="455"/>
|
||||
<point key="canvasLocation" x="544.79999999999995" y="453.69458128078821"/>
|
||||
</view>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="screenLandscape5.png" width="685.5" height="302.5"/>
|
||||
</resources>
|
||||
</document>
|
||||
|
||||
@@ -1,30 +1,58 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="vXZ-lx-hvc">
|
||||
<device id="retina4_7" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="aV9-EX-QWJ">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--View Controller-->
|
||||
<scene sceneID="ufC-wZ-h7g">
|
||||
<scene sceneID="tne-QT-ifu">
|
||||
<objects>
|
||||
<viewController id="vXZ-lx-hvc" customClass="ViewController" customModule="ContainerControllerSwift_Example" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<layoutGuides>
|
||||
<viewControllerLayoutGuide type="top" id="jyV-Pf-zRb"/>
|
||||
<viewControllerLayoutGuide type="bottom" id="2fi-mo-0CV"/>
|
||||
</layoutGuides>
|
||||
<view key="view" contentMode="scaleToFill" id="kh9-bI-dsS">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<viewController id="BYZ-38-t0r" customClass="ViewController" customModule="ContainerControllerSwift_Example" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="623"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="UYm-tY-WGa" customClass="TableAdapterView" customModule="ContainerControllerSwift">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="623"/>
|
||||
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
|
||||
</tableView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
|
||||
<constraints>
|
||||
<constraint firstItem="6Tk-OE-BBY" firstAttribute="bottom" secondItem="UYm-tY-WGa" secondAttribute="bottom" id="Usw-ep-vba"/>
|
||||
<constraint firstItem="UYm-tY-WGa" firstAttribute="top" secondItem="6Tk-OE-BBY" secondAttribute="top" id="qmS-hQ-rSa"/>
|
||||
<constraint firstItem="6Tk-OE-BBY" firstAttribute="trailing" secondItem="UYm-tY-WGa" secondAttribute="trailing" id="vQK-T0-eQf"/>
|
||||
<constraint firstItem="UYm-tY-WGa" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" id="wXp-OO-MUn"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
|
||||
</view>
|
||||
<navigationItem key="navigationItem" id="x48-lm-dG7"/>
|
||||
<connections>
|
||||
<outlet property="tableView" destination="UYm-tY-WGa" id="djd-oP-Z2M"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="132" y="137.18140929535232"/>
|
||||
</scene>
|
||||
<!--Navigation Controller-->
|
||||
<scene sceneID="2WA-6t-2aK">
|
||||
<objects>
|
||||
<navigationController id="aV9-EX-QWJ" sceneMemberID="viewController">
|
||||
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" translucent="NO" id="QWK-gZ-mYK">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</navigationBar>
|
||||
<connections>
|
||||
<segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="SPa-ED-zkK"/>
|
||||
</connections>
|
||||
</navigationController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="Uhq-S7-WHN" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="-631" y="137"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Example Add Collection View Controller-->
|
||||
<scene sceneID="0f9-5i-ygC">
|
||||
<objects>
|
||||
<viewController storyboardIdentifier="ExampleAddCollectionViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="p3c-kf-PfN" customClass="ExampleAddCollectionViewController" customModule="ContainerController" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="jmi-Lo-St4">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<viewLayoutGuide key="safeArea" id="QCP-uk-H24"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="Uzt-sR-4xA" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="781.15942028985512" y="43.526785714285715"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
||||
@@ -0,0 +1,116 @@
|
||||
//
|
||||
// ExampleAddCollectionViewController.swift
|
||||
// ContainerControllerSwift
|
||||
//
|
||||
// Created by mrustaa on 09.06.2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
class ExampleAddCollectionViewController: StoryboardController {
|
||||
|
||||
var container: ContainerController!
|
||||
|
||||
// MARK: - Init
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
|
||||
let layoutC = ContainerLayout()
|
||||
layoutC.positions = ContainerPosition(top: 100, middle: 250, bottom: 70)
|
||||
container = ContainerController(addTo: self, layout: layoutC)
|
||||
container.view.cornerRadius = 15
|
||||
container.view.addShadow()
|
||||
container.add(scrollView: addCollectionView())
|
||||
}
|
||||
|
||||
override func viewWillAppear(_ animated: Bool) {
|
||||
super.viewWillAppear(animated)
|
||||
|
||||
container.move(type: .middle)
|
||||
}
|
||||
|
||||
func addCollectionView() -> UICollectionView {
|
||||
|
||||
let layout = UICollectionViewFlowLayout()
|
||||
|
||||
let padding: CGFloat = 15
|
||||
layout.sectionInset = UIEdgeInsets(top: padding, left: padding, bottom: padding, right: padding)
|
||||
layout.minimumLineSpacing = padding
|
||||
layout.minimumInteritemSpacing = padding
|
||||
|
||||
let colletion = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
|
||||
colletion.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell")
|
||||
colletion.backgroundColor = .clear
|
||||
colletion.delegate = self
|
||||
colletion.dataSource = self
|
||||
return colletion
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Scroll Delegate
|
||||
|
||||
extension ExampleAddCollectionViewController: UIScrollViewDelegate {
|
||||
|
||||
func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
||||
container.scrollViewDidScroll(scrollView)
|
||||
}
|
||||
|
||||
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
|
||||
container.scrollViewWillBeginDragging(scrollView)
|
||||
}
|
||||
|
||||
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
|
||||
container.scrollViewDidEndDecelerating(scrollView)
|
||||
}
|
||||
|
||||
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
|
||||
container.scrollViewDidEndDragging(scrollView, willDecelerate: decelerate)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// MARK: - Collection DataSource
|
||||
|
||||
extension ExampleAddCollectionViewController: UICollectionViewDataSource {
|
||||
|
||||
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
||||
return 17
|
||||
}
|
||||
|
||||
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
||||
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
|
||||
|
||||
let randomInt = Int.random(in: 0..<6)
|
||||
|
||||
var color: UIColor = .systemBlue
|
||||
|
||||
switch randomInt {
|
||||
case 0: color = .systemBlue
|
||||
case 1: color = .systemRed
|
||||
case 2: color = .systemGray
|
||||
case 3: color = .systemGreen
|
||||
case 4: color = .systemYellow
|
||||
case 5: color = .systemOrange
|
||||
default: break
|
||||
}
|
||||
|
||||
cell.backgroundColor = color
|
||||
cell.layer.cornerRadius = 12
|
||||
return cell
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Collection Layout
|
||||
|
||||
extension ExampleAddCollectionViewController: UICollectionViewDelegateFlowLayout {
|
||||
|
||||
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
|
||||
let size = ((ContainerDevice.width / 2) - 1) - 22
|
||||
return CGSize(width: size, height: size)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Example Add Table View Controller-->
|
||||
<scene sceneID="0f9-5i-ygC">
|
||||
<objects>
|
||||
<viewController storyboardIdentifier="ExampleAddTableViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="p3c-kf-PfN" customClass="ExampleAddTableViewController" customModule="ContainerController" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="jmi-Lo-St4">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<viewLayoutGuide key="safeArea" id="QCP-uk-H24"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="Uzt-sR-4xA" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="781.15942028985512" y="43.526785714285715"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
||||
@@ -0,0 +1,92 @@
|
||||
//
|
||||
// ExampleAddTableViewController.swift
|
||||
// ContainerControllerSwift
|
||||
//
|
||||
// Created by mrustaa on 09.06.2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
class ExampleAddTableViewController: StoryboardController {
|
||||
|
||||
var container: ContainerController!
|
||||
|
||||
// MARK: - Init
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
let layout = ContainerLayout()
|
||||
layout.backgroundShadowShow = true
|
||||
layout.positions = ContainerPosition(top: 70, middle: 250, bottom: 100)
|
||||
container = ContainerController(addTo: self, layout: layout)
|
||||
container.view.cornerRadius = 15
|
||||
container.view.addShadow()
|
||||
container.add(scrollView: addTableView())
|
||||
}
|
||||
|
||||
override func viewWillAppear(_ animated: Bool) {
|
||||
super.viewWillAppear(animated)
|
||||
|
||||
container.move(type: .top)
|
||||
}
|
||||
|
||||
func addTableView() -> UITableView {
|
||||
|
||||
let tableView = UITableView()
|
||||
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
|
||||
tableView.delegate = self
|
||||
tableView.dataSource = self
|
||||
return tableView
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Scroll Delegate
|
||||
|
||||
extension ExampleAddTableViewController: UIScrollViewDelegate {
|
||||
|
||||
func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
||||
container.scrollViewDidScroll(scrollView)
|
||||
}
|
||||
|
||||
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
|
||||
container.scrollViewWillBeginDragging(scrollView)
|
||||
}
|
||||
|
||||
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
|
||||
container.scrollViewDidEndDecelerating(scrollView)
|
||||
}
|
||||
|
||||
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
|
||||
container.scrollViewDidEndDragging(scrollView, willDecelerate: decelerate)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Table Delegate
|
||||
|
||||
extension ExampleAddTableViewController: UITableViewDelegate {
|
||||
|
||||
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
|
||||
return 60
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Table DataSource
|
||||
|
||||
extension ExampleAddTableViewController: UITableViewDataSource {
|
||||
|
||||
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||||
return 21
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
|
||||
cell.textLabel?.text = "item \(indexPath.row)"
|
||||
cell.backgroundColor = .clear
|
||||
return cell
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
//
|
||||
// ExampleAddTableViewControllerSettings.swift
|
||||
// ContainerControllerSwift
|
||||
//
|
||||
// Created by mrustaa on 09.06.2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
extension ExampleAddTableViewController {
|
||||
|
||||
// MARK: - Settings
|
||||
|
||||
func changeViewParametrs() {
|
||||
|
||||
container.view.cornerRadius = 15 // Change cornerRadius global
|
||||
container.view.addShadow(opacity: 0.1) // Add layer shadow
|
||||
container.view.addBlur(style: .dark) // Add background blur UIVisualEffectView
|
||||
}
|
||||
|
||||
func changeViewCustom() {
|
||||
|
||||
// Add custom shadow
|
||||
let layer = container.view.layer
|
||||
layer.shadowOpacity = 0.5
|
||||
layer.shadowColor = UIColor.red.cgColor
|
||||
layer.shadowOffset = CGSize(width: 1, height: 4)
|
||||
layer.shadowRadius = 5
|
||||
|
||||
// Add view in container.view
|
||||
let viewRed = UIView(frame: CGRect(x: 50, y: 50, width: 50, height: 50))
|
||||
viewRed.backgroundColor = .systemRed
|
||||
container.view.addSubview(viewRed)
|
||||
|
||||
// Add view under scrollView container.view
|
||||
let viewGreen = UIView(frame: CGRect(x: 25, y: 25, width: 50, height: 50))
|
||||
viewGreen.backgroundColor = .systemGreen
|
||||
container.view.insertSubview(viewGreen, at: 0)
|
||||
}
|
||||
|
||||
func createLayout() {
|
||||
|
||||
let layout = ContainerLayout()
|
||||
layout.startPosition = .hide
|
||||
layout.backgroundShadowShow = false
|
||||
layout.positions = ContainerPosition(top: 70, middle: 250, bottom: 70)
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Change settings right away
|
||||
|
||||
func changeRightAway() {
|
||||
|
||||
// Properties
|
||||
container.set(movingEnabled: true)
|
||||
container.set(trackingPosition: false)
|
||||
container.set(footerPadding: 100)
|
||||
|
||||
// Add ScrollInsets Top/Bottom
|
||||
container.set(scrollIndicatorTop: 5) // ↓
|
||||
container.set(scrollIndicatorBottom: 5) // ↑
|
||||
|
||||
// Positions
|
||||
container.set(top: 70) // ↓
|
||||
container.set(middle: 250) // ↑
|
||||
container.set(bottom: 80) // ↑
|
||||
|
||||
// Middle Enable/Disable
|
||||
container.set(middle: 250)
|
||||
container.set(middle: nil)
|
||||
|
||||
// Background Shadow
|
||||
container.set(backgroundShadowShow: true)
|
||||
|
||||
// Insets View
|
||||
container.set(left: 5) // →
|
||||
container.set(right: 5) // ←
|
||||
|
||||
// Landscape params
|
||||
container.setLandscape(top: 30)
|
||||
container.setLandscape(middle: 150)
|
||||
container.setLandscape(bottom: 70)
|
||||
container.setLandscape(middle: nil)
|
||||
|
||||
container.setLandscape(backgroundShadowShow: false)
|
||||
|
||||
container.setLandscape(left: 10)
|
||||
container.setLandscape(right: 100)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,273 @@
|
||||
//
|
||||
// ExamplesContainerController.swift
|
||||
// ContainerController
|
||||
//
|
||||
// Created by mrustaa on 31/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
|
||||
class ExamplesContainerController: ContainerController, ExampleCellDelegate {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
var items: [TableAdapterItem] = []
|
||||
|
||||
// MARK: - Init
|
||||
|
||||
public init(addTo controller: UIViewController, style: ExamplesContainerController.ScrollType) {
|
||||
|
||||
let layout = ContainerLayout()
|
||||
layout.startPosition = .hide
|
||||
layout.backgroundShadowShow = false
|
||||
layout.positions = ContainerPosition(top: 70, middle: 250, bottom: 70)
|
||||
|
||||
super.init(addTo: controller, layout: layout)
|
||||
|
||||
loadContainerView()
|
||||
loadTableItems()
|
||||
|
||||
var scrollIndex: CGFloat = 0
|
||||
switch style {
|
||||
case .tableAdapterView: scrollIndex = 1
|
||||
case .collectionAdapterView: scrollIndex = 2
|
||||
case .collectionAdapterView2: scrollIndex = 3
|
||||
case .textView: scrollIndex = 4
|
||||
default: break
|
||||
}
|
||||
|
||||
exampleCell( TableAdapterCell(), type: .scroll, value: scrollIndex, endEditing: true)
|
||||
}
|
||||
|
||||
//MARK: - Load Container-View
|
||||
|
||||
func loadContainerView() {
|
||||
|
||||
view.backgroundColor = .white
|
||||
view.cornerRadius = 15
|
||||
view.addShadow()
|
||||
}
|
||||
|
||||
//MARK: - Load Items
|
||||
|
||||
func loadTableItems() {
|
||||
|
||||
items = []
|
||||
|
||||
let h: CGFloat = 45
|
||||
|
||||
items = [
|
||||
ExampleSegmentCellItem(height: h, delegate: self, type: .moveType, segmentItems: ["Top", "Middle", "Bottom", "Hide"]),
|
||||
ExampleSegmentCellItem(height: h, delegate: self, type: .headerView, segmentItems: ["-", "Grip", "Label", "Details", "Search"]),
|
||||
ExampleSegmentCellItem(height: h, delegate: self, type: .footerView, segmentItems: ["-", "Button", "TabBar"]),
|
||||
ExampleSegmentCellItem(height: h, delegate: self, type: .color, segmentItems: ["-", ".white", ".red", ".green", ".blue"], index: 1),
|
||||
ExampleSegmentCellItem(height: h, delegate: self, type: .blur, segmentItems: ["-", "Light", "ExtraLight", "Dark"]),
|
||||
ExampleSegmentCellItem(height: h, delegate: self, type: .scroll, segmentItems: ["-", "Table", "Coll", "Coll2", "Text"]),
|
||||
|
||||
ExampleSwitchCellItem(height: h, delegate: self, type: .shadowBackground, value: false),
|
||||
ExampleSliderCellItem(height: h, delegate: self, type: .shadowContainer, value: 0.2, maximumValue: 1.0),
|
||||
ExampleSliderCellItem(height: h, delegate: self, type: .cornerRadius, value: 15, maximumValue: 140),
|
||||
ExampleSwitchCellItem(height: h, delegate: self, type: .movingEnabled, value: true),
|
||||
ExampleSwitchCellItem(height: h, delegate: self, type: .trackingPosition, value: false),
|
||||
ExampleSliderCellItem(height: h, delegate: self, type: .footerPadding, value: 0, maximumValue: Float(ContainerDevice.screenMax)),
|
||||
|
||||
ExampleSliderCellItem(height: h, delegate: self, type: .top, value: 70, maximumValue: 250),
|
||||
ExampleSliderCellItem(height: h, delegate: self, type: .middle, value: 250, maximumValue: 500, minimumValue: 140),
|
||||
ExampleSliderCellItem(height: h, delegate: self, type: .bottom, value: 70, maximumValue: 300),
|
||||
ExampleSwitchCellItem(height: h, delegate: self, type: .middleEnable, value: true),
|
||||
ExampleSliderCellItem(height: h, delegate: self, type: .insetsLeft, value: 0, maximumValue: Float(ContainerDevice.screenMin)),
|
||||
ExampleSliderCellItem(height: h, delegate: self, type: .insetsRight, value: 0, maximumValue: Float(ContainerDevice.screenMin)),
|
||||
|
||||
ExampleSliderCellItem(height: h, delegate: self, type: .landscapeTop, value: 20, maximumValue: 250),
|
||||
ExampleSliderCellItem(height: h, delegate: self, type: .landscapeMiddle, value: 150, maximumValue: 300, minimumValue: 70),
|
||||
ExampleSliderCellItem(height: h, delegate: self, type: .landscapeBottom, value: 70, maximumValue: 300),
|
||||
ExampleSwitchCellItem(height: h, delegate: self, type: .landscapeMiddleEnable, value: false),
|
||||
ExampleSliderCellItem(height: h, delegate: self, type: .landscapeInsetsLeft, value: 0, maximumValue: Float(ContainerDevice.screenMax)),
|
||||
ExampleSliderCellItem(height: h, delegate: self, type: .landscapeInsetsRight, value: 0, maximumValue: Float(ContainerDevice.screenMax)),
|
||||
|
||||
ExampleSliderCellItem(height: h, delegate: self, type: .scrollIndicatorInsetsTop, value: 0, maximumValue: 300),
|
||||
ExampleSliderCellItem(height: h, delegate: self, type: .scrollIndicatorInsetsBottom, value: 0, maximumValue: 300),
|
||||
|
||||
]
|
||||
}
|
||||
|
||||
// MARK: - Cell Delegate
|
||||
|
||||
func exampleCell(_ cell: TableAdapterCell, type: ExampleCell.Style, value: CGFloat, endEditing: Bool) {
|
||||
|
||||
// print("\(type) \(value) ")
|
||||
let boolValue = (value == 1)
|
||||
|
||||
switch type {
|
||||
case .top
|
||||
, .middle
|
||||
, .bottom
|
||||
, .landscapeTop
|
||||
, .landscapeMiddle
|
||||
, .landscapeBottom
|
||||
, .insetsLeft
|
||||
, .insetsRight
|
||||
, .landscapeInsetsLeft
|
||||
, .landscapeInsetsRight:
|
||||
if !endEditing { return }
|
||||
default: break
|
||||
}
|
||||
|
||||
switch type {
|
||||
|
||||
case .cornerRadius: self.view.cornerRadius = value
|
||||
|
||||
case .shadowContainer: self.view.addShadow(opacity: value)
|
||||
|
||||
case .movingEnabled: set(movingEnabled: boolValue)
|
||||
|
||||
case .trackingPosition: set(trackingPosition: boolValue)
|
||||
|
||||
case .footerPadding: set(footerPadding: value)
|
||||
|
||||
// MARK: ScrollInsets
|
||||
|
||||
case .scrollIndicatorInsetsTop: set(scrollIndicatorTop: value)
|
||||
case .scrollIndicatorInsetsBottom: set(scrollIndicatorBottom: value)
|
||||
|
||||
// MARK: Positions
|
||||
|
||||
case .top: set(top: value); if ContainerDevice.isPortrait { move(type: .top) }
|
||||
case .middle: set(middle: value); if ContainerDevice.isPortrait { move(type: .middle) }
|
||||
case .bottom: set(bottom: value); if ContainerDevice.isPortrait { move(type: .bottom) }
|
||||
|
||||
case .landscapeTop: setLandscape(top: value); if !ContainerDevice.isPortrait { move(type: .top) }
|
||||
case .landscapeMiddle: setLandscape(middle: value); if !ContainerDevice.isPortrait { move(type: .middle) }
|
||||
case .landscapeBottom: setLandscape(bottom: value); if !ContainerDevice.isPortrait { move(type: .bottom) }
|
||||
|
||||
// MARK: MiddleEnable
|
||||
|
||||
case .middleEnable: set(middle: (boolValue ? 250 : nil))
|
||||
|
||||
case .landscapeMiddleEnable: setLandscape(middle: (boolValue ? 150 : nil))
|
||||
|
||||
|
||||
// MARK: Background Shadow
|
||||
|
||||
case .shadowBackground: set(backgroundShadowShow: boolValue)
|
||||
|
||||
case .landscapeShadowBackground: setLandscape(backgroundShadowShow: boolValue)
|
||||
|
||||
// MARK: Insets
|
||||
|
||||
case .insetsLeft: set(left: value)
|
||||
case .insetsRight: set(right: value)
|
||||
|
||||
case .landscapeInsetsLeft: setLandscape(left: value)
|
||||
case .landscapeInsetsRight: setLandscape(right: value)
|
||||
|
||||
// MARK: MoveType
|
||||
|
||||
case .moveType:
|
||||
|
||||
switch value {
|
||||
case 0: move(type: .top)
|
||||
case 1: move(type: .middle)
|
||||
case 2: move(type: .bottom)
|
||||
default: move(type: .hide)
|
||||
}
|
||||
|
||||
// MARK: ScrollViews
|
||||
|
||||
case .scroll:
|
||||
|
||||
switch value {
|
||||
case 1: add(scrollView: createTableAdapterView(items: items, view: view))
|
||||
case 2: add(scrollView: createMapsCollectionAdapterView())
|
||||
case 3: add(scrollView: createCollectionAdapterView(width: view.width))
|
||||
case 4: add(scrollView: createTextView())
|
||||
default: removeScrollView()
|
||||
}
|
||||
|
||||
|
||||
// MARK: HeaderView
|
||||
|
||||
case .headerView:
|
||||
switch value {
|
||||
case 1:
|
||||
let header = ExampleHeaderGripView()
|
||||
header.height = 20
|
||||
self.add(headerView: header)
|
||||
case 2:
|
||||
let header = MapsMenuHeader()
|
||||
header.titleLabel.text = "Settings"
|
||||
header.separatorView?.alpha = 1.0
|
||||
self.add(headerView: header)
|
||||
case 3:
|
||||
let header = HeaderDetailsView()
|
||||
header.titleLabel.text = "Title Header"
|
||||
header.subtitle.text = "Subtitle"
|
||||
header.textButton.setTitle("Button Text", for: .normal)
|
||||
header.separatorView?.alpha = 1.0
|
||||
self.add(headerView: header)
|
||||
case 4:
|
||||
let header = HeaderSearchBarView()
|
||||
header.separatorView?.alpha = 1.0
|
||||
self.add(headerView: header)
|
||||
default:
|
||||
self.removeHeaderView()
|
||||
}
|
||||
|
||||
// MARK: FooterView
|
||||
|
||||
case .footerView:
|
||||
switch value {
|
||||
case 1:
|
||||
let footer = ExampleFooterButtonView()
|
||||
self.add(footerView: footer)
|
||||
case 2:
|
||||
let tabbar = HeaderTabBarView()
|
||||
tabbar.height = (49.0 + ContainerDevice.isIphoneXBottom)
|
||||
self.add(footerView: tabbar)
|
||||
default:
|
||||
self.removeFooterView()
|
||||
}
|
||||
|
||||
// MARK: BackgroundColor
|
||||
|
||||
case .color:
|
||||
self.view.removeBlur()
|
||||
|
||||
switch value {
|
||||
case 0: view.backgroundColor = .clear
|
||||
case 1: view.backgroundColor = .white
|
||||
case 2: view.backgroundColor = .systemRed
|
||||
case 3: view.backgroundColor = .systemGreen
|
||||
case 4: view.backgroundColor = .systemBlue
|
||||
default: break
|
||||
}
|
||||
|
||||
|
||||
// MARK: Blur
|
||||
|
||||
case .blur:
|
||||
view.backgroundColor = .clear
|
||||
|
||||
switch value {
|
||||
case 0: self.view.removeBlur()
|
||||
case 1: self.view.addBlur(style: .light)
|
||||
case 2: self.view.addBlur(style: .extraLight)
|
||||
case 3: self.view.addBlur(style: .dark)
|
||||
default: break
|
||||
}
|
||||
|
||||
default: break
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
//
|
||||
// ExamplesContainerControllerScrollType.swift
|
||||
// ContainerController
|
||||
//
|
||||
// Created by mrustaa on 03/06/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
extension ExamplesContainerController {
|
||||
|
||||
public enum ScrollType: String, CaseIterable {
|
||||
case empty = "-"
|
||||
case tableAdapterView = "TableAdapterView (⚙️ Settings)"
|
||||
case collectionAdapterView = "CollectionAdapterView"
|
||||
case collectionAdapterView2 = "CollectionAdapterView 2"
|
||||
case textView = "TextView"
|
||||
case mapsContainer = "Main (Maps.app)"
|
||||
case locationContainer = "Location (Maps.app)"
|
||||
case routeContainer = "Route (Maps.app)"
|
||||
case menuContainer = "Menu (Maps.app)"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
//
|
||||
// ExamplesScrollViews.swift
|
||||
// ContainerController
|
||||
//
|
||||
// Created by mrustaa on 30/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
// MARK: - CollectionAdapterView Maps
|
||||
|
||||
func createMapsCollectionAdapterView() -> CollectionAdapterView {
|
||||
|
||||
let colletion = CollectionAdapterView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout())
|
||||
var colletionItems: [CollectionAdapterItem] = []
|
||||
|
||||
for _ in 0...3 {
|
||||
for item in MapsFavoritesCellData.collectionItems() {
|
||||
colletionItems.append(item)
|
||||
}
|
||||
}
|
||||
|
||||
colletion.set(items: colletionItems)
|
||||
|
||||
return colletion
|
||||
}
|
||||
|
||||
// MARK: - CollectionAdapterView
|
||||
|
||||
func createCollectionAdapterView(width: CGFloat) -> CollectionAdapterView {
|
||||
|
||||
let layout = UICollectionViewFlowLayout()
|
||||
|
||||
let padding: CGFloat = 15
|
||||
layout.sectionInset = UIEdgeInsets(top: padding, left: padding, bottom: padding, right: padding)
|
||||
layout.minimumLineSpacing = padding
|
||||
layout.minimumInteritemSpacing = padding
|
||||
|
||||
let colletion = CollectionAdapterView(frame: CGRect.zero, collectionViewLayout: layout)
|
||||
|
||||
var colletionItems: [CollectionAdapterItem] = []
|
||||
for _ in 1...17 {
|
||||
colletionItems.append( ExampleCollectionItem(width: width - 1, padding: padding) )
|
||||
}
|
||||
colletion.set(items: colletionItems)
|
||||
|
||||
return colletion
|
||||
}
|
||||
|
||||
// MARK: - TableAdapterView
|
||||
|
||||
func createTableAdapterView(items: [TableAdapterItem]? = nil, view: UIView) -> TableAdapterView {
|
||||
|
||||
let table = TableAdapterView()
|
||||
table.separatorColor = Colors.grayLevel(0.75)
|
||||
|
||||
if let items = items {
|
||||
table.set(items: items, animated: true)
|
||||
}
|
||||
|
||||
table.didScrollCallback = {
|
||||
view.endEditing(true)
|
||||
}
|
||||
return table
|
||||
}
|
||||
|
||||
// MARK: - TableView
|
||||
|
||||
func createTableView() -> UITableView {
|
||||
|
||||
let tableView = UITableView()
|
||||
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
|
||||
tableView.backgroundColor = .clear
|
||||
tableView.tableFooterView = UIView()
|
||||
|
||||
return tableView
|
||||
|
||||
}
|
||||
|
||||
// MARK: - TextView
|
||||
|
||||
func createTextView() -> UITextView {
|
||||
|
||||
let textView = UITextView()
|
||||
textView.returnKeyType = .done
|
||||
textView.backgroundColor = .clear
|
||||
textView.font = UIFont.systemFont(ofSize: 15)
|
||||
textView.text = """
|
||||
This example demonstrates a block quote. Because some introductory phrases will lead
|
||||
naturally into the block quote,
|
||||
you might choose to begin the block quote with a lowercase letter. In this and the later
|
||||
examples we use “Lorem ipsum” text to ensure that each block quotation contains 40 words or
|
||||
more. Lorem ipsum dolor sit amet, consectetur adipiscing elit. (Organa, 2013, p. 234)
|
||||
Example 2
|
||||
This example also demonstrates a block quote. Some introductory sentences end abruptly in a
|
||||
colon or a period:
|
||||
In those cases, you are more likely to capitalize the beginning word of the block quotation.
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nisi mi, pharetra sit amet mi vitae,
|
||||
commodo accumsan dui. Donec non scelerisque quam. Pellentesque ut est sed neque.
|
||||
(Calrissian, 2013, para. 3)
|
||||
Example 3
|
||||
This is another example of a block quotation. Sometimes, the author(s) being cited will be
|
||||
included in the introduction. In that case, according to Skywalker and Solo,
|
||||
because the author names are in the introduction of this quote, the parentheses that follow it
|
||||
will include only the year and the page number. Lorem ipsum dolor sit amet, consectetur
|
||||
adipiscing elit. Sed nisi mi, pharetra sit amet mi vitae, commodo accumsan dui. Donec non
|
||||
scelerisque quam. Pellentesque ut est sed neque. (2013, p. 103)
|
||||
Copyright © 2013 by the American Psychological Association. This content may be reproduced for classroom or teaching purposes
|
||||
provided that credit is given to the American Psychological Association. For any other use, please contact the APA Permissions Office.
|
||||
Example 4
|
||||
In this example, we have added our own emphasis. This needs to be indicated parenthetically,
|
||||
so the reader knows that the italics were not in the original text. Amidala (2009) dabbled in hyperbole,
|
||||
saying,
|
||||
Random Explosions 2: Revenge of the Dialogue is the worst movie in the history of time
|
||||
[emphasis added]. . . . it’s [sic] promise of dialogue is a misnomer of explosive proportions. Lorem ipsum
|
||||
dolor sit amet, consectetur adipiscing elit. Sed nisi mi, pharetra sit amet mi vitae. (p. 13)
|
||||
This paragraph appears flush left because it is a continuation of the paragraph we began above the block
|
||||
quote. Note that we also added “[sic]” within the block quotation to indicate that a misspelling was in
|
||||
the original text, and we’ve included ellipses (with four periods) because we have omitted a sentence
|
||||
from the quotation (see pp. 172–173 of the Publication Manual of the American Psychological
|
||||
Association).
|
||||
Example 5
|
||||
This example is similar to the previous one, except that we have continued the quotation to
|
||||
include text from a second paragraph. Amidala (2009) dabbled in hyperbole, saying,
|
||||
Random Explosions 2: Revenge of the Dialogue is the worst movie in the history of time
|
||||
[emphasis added]. . . . it’s [sic] promise of dialogue is a misnomer of explosive proportions.
|
||||
On the other hand, Delightful Banter on Windswept Mountainside is a film to be
|
||||
cherished for all time. Filmmakers hoping to top this film should abandon hope. (p. 13)
|
||||
This paragraph begins with an indent because we do not intend it to continue the paragraph
|
||||
that we started above the block quote. Note that we also added “[sic]” within the block quotation to
|
||||
indicate that a misspelling was in the original text, and we’ve included ellipses (with four periods)
|
||||
because we have omitted a sentence from this quotation (see pp. 172–173 of the Manual).
|
||||
"""
|
||||
|
||||
return textView
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Examples Settings View Controller-->
|
||||
<scene sceneID="0f9-5i-ygC">
|
||||
<objects>
|
||||
<viewController storyboardIdentifier="ExamplesSettingsViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="p3c-kf-PfN" customClass="ExamplesSettingsViewController" customModule="ContainerControllerSwift_Example" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="jmi-Lo-St4">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="O8q-9T-eRg" customClass="TableAdapterView" customModule="ContainerControllerSwift">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
|
||||
</tableView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="0.88235294117647056" green="0.88235294117647056" blue="0.90588235294117647" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="O8q-9T-eRg" firstAttribute="leading" secondItem="QCP-uk-H24" secondAttribute="leading" id="46G-CM-8RI"/>
|
||||
<constraint firstItem="O8q-9T-eRg" firstAttribute="top" secondItem="QCP-uk-H24" secondAttribute="top" id="Atq-wk-zuf"/>
|
||||
<constraint firstItem="O8q-9T-eRg" firstAttribute="trailing" secondItem="QCP-uk-H24" secondAttribute="trailing" id="DUT-hr-P4d"/>
|
||||
<constraint firstItem="O8q-9T-eRg" firstAttribute="bottom" secondItem="QCP-uk-H24" secondAttribute="bottom" id="HrH-NQ-v3t"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="QCP-uk-H24"/>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="tableView" destination="O8q-9T-eRg" id="DQQ-1i-fpA"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="Uzt-sR-4xA" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="781.60000000000002" y="43.628185907046479"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
||||
@@ -0,0 +1,124 @@
|
||||
|
||||
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
|
||||
class ExamplesSettingsViewController: StoryboardController {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
var containers: [ContainerController] = []
|
||||
var items: [TableAdapterItem] = []
|
||||
|
||||
@IBOutlet weak var tableView: TableAdapterView?
|
||||
|
||||
// MARK: - Life cycle
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
let barButtonAddItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(navigationBarAddAction))
|
||||
let barButtonCloseItem = UIBarButtonItem(barButtonSystemItem: .close, target: self, action: #selector(navigationBarCloseAction))
|
||||
self.navigationItem.rightBarButtonItems = [ barButtonAddItem, barButtonCloseItem ]
|
||||
|
||||
loadTableView()
|
||||
|
||||
containers(addStyle: .tableAdapterView)
|
||||
}
|
||||
|
||||
override func viewDidDisappear(_ animated: Bool) {
|
||||
super.viewDidDisappear(animated)
|
||||
|
||||
for container in containers {
|
||||
container.remove()
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Load TableView
|
||||
|
||||
func loadTableView() {
|
||||
|
||||
tableView?.deleteIndexCallback = { [weak self] (index) in
|
||||
guard let _self = self else { return }
|
||||
_self.containers(remove: index)
|
||||
}
|
||||
tableView?.selectIndexCallback = { [weak self] (index) in
|
||||
guard let _self = self else { return }
|
||||
_self.containers[index].move(type: .top)
|
||||
}
|
||||
tableView?.didScrollCallback = { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
|
||||
_self.view.endEditing(true)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Navigation Bar Actions
|
||||
|
||||
@objc func navigationBarCloseAction(_ sender: UIBarButtonItem) {
|
||||
containers(remove: containers.count - 1)
|
||||
}
|
||||
|
||||
@objc func navigationBarAddAction(_ sender: UIBarButtonItem? = nil) {
|
||||
|
||||
let alert = UIAlertController(title: "Add Container",
|
||||
message: "together with ScrollView",
|
||||
preferredStyle: .actionSheet)
|
||||
|
||||
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
|
||||
|
||||
ExamplesContainerController.ScrollType.allCases.forEach { style in
|
||||
alert.addAction(UIAlertAction(title: style.rawValue,
|
||||
style: style == .tableAdapterView ? .destructive : .default,
|
||||
handler: { [weak self] _ in
|
||||
guard let _self = self else { return }
|
||||
_self.containers(addStyle: style)
|
||||
}))
|
||||
}
|
||||
|
||||
self.present(alert, animated: true)
|
||||
}
|
||||
|
||||
// MARK: - Add/Remove Container
|
||||
|
||||
func containers(addStyle containerStyle: ExamplesContainerController.ScrollType) {
|
||||
|
||||
switch containerStyle {
|
||||
case .mapsContainer: containers(add: MapsContainerController(addTo: self, darkStyle: false), style: containerStyle)
|
||||
case .locationContainer: containers(add: LocationContainerController(addTo: self, darkStyle: false), style: containerStyle)
|
||||
case .routeContainer: containers(add: RouteContainerController(addTo: self, darkStyle: false), style: containerStyle)
|
||||
case .menuContainer: containers(add: MenuContainerController(addTo: self, darkStyle: false, selectedIndex: 0), style: containerStyle)
|
||||
default: containers(add: ExamplesContainerController(addTo: self, style: containerStyle), style: containerStyle)
|
||||
}
|
||||
}
|
||||
|
||||
func containers(add container: ContainerController, style: ExamplesContainerController.ScrollType) {
|
||||
|
||||
container.move(type: .bottom, completion: {
|
||||
container.move(type: .top)
|
||||
})
|
||||
|
||||
containers.append(container)
|
||||
|
||||
let subTitle = String(describing: type(of: container))
|
||||
let title = style.rawValue
|
||||
|
||||
items.append( TitleTextItem(title: title, subtitle: subTitle, editing: true) )
|
||||
tableView?.set(items: items, animated: true)
|
||||
}
|
||||
|
||||
func containers(remove index: Int) {
|
||||
if containers.isEmpty, items.isEmpty { return }
|
||||
|
||||
let container = containers[index]
|
||||
container.remove()
|
||||
|
||||
containers.remove(at: index)
|
||||
items.remove(at: index)
|
||||
|
||||
tableView?.set(items: items, animated: true)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
//
|
||||
// ExampleCell.swift
|
||||
// ContainerController
|
||||
//
|
||||
// Created by mrustaa on 28/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
// MARK: - Cell Delegate
|
||||
|
||||
protocol ExampleCellDelegate {
|
||||
func exampleCell(_ cell: TableAdapterCell, type: ExampleCell.Style, value: CGFloat, endEditing: Bool)
|
||||
}
|
||||
|
||||
// MARK: - Cell Data
|
||||
|
||||
class ExampleCellData: TableAdapterCellData {
|
||||
|
||||
var delegate: ExampleCellDelegate?
|
||||
var callback: ((Int) -> Void)?
|
||||
|
||||
var type: ExampleCell.Style
|
||||
var title: String
|
||||
|
||||
var cellSizeHeight: CGFloat?
|
||||
|
||||
init(_ type: ExampleCell.Style,
|
||||
_ title: String?,
|
||||
_ cellHeight: CGFloat?,
|
||||
_ delegate: ExampleCellDelegate?,
|
||||
_ callback: ((Int) -> Void)?) {
|
||||
|
||||
self.type = type
|
||||
|
||||
if type != .default {
|
||||
self.title = type.rawValue
|
||||
} else {
|
||||
self.title = title ?? ""
|
||||
}
|
||||
|
||||
self.delegate = delegate
|
||||
self.callback = callback
|
||||
|
||||
self.cellSizeHeight = cellHeight
|
||||
|
||||
super.init()
|
||||
}
|
||||
|
||||
override public func cellHeight() -> CGFloat {
|
||||
return cellSizeHeight ?? 51.0
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
//
|
||||
// ExampleCellStyle.swift
|
||||
// ContainerController
|
||||
//
|
||||
// Created by mrustaa on 02/06/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
// MARK: - Cell Style
|
||||
|
||||
class ExampleCell: TableAdapterCell {
|
||||
|
||||
}
|
||||
|
||||
extension ExampleCell {
|
||||
|
||||
public enum Style: String {
|
||||
case `default` = ""
|
||||
case shadowContainer = "ShadowContainer"
|
||||
case movingEnabled = "MovingEnabled"
|
||||
case cornerRadius = "CornerRadius"
|
||||
case footerPadding = "FooterView.Padding"
|
||||
case headerView = "HeaderView"
|
||||
case footerView = "FooterView"
|
||||
case color = "BackgroundColor"
|
||||
case blur = "Blur"
|
||||
case scroll = "ScrollView"
|
||||
case trackingPosition = "TrackingPosition"
|
||||
case scrollIndicatorInsetsTop = "↓ .Scroll.Indicator.Insets.Top"
|
||||
case scrollIndicatorInsetsBottom = "↑ .Scroll.Indicator.Insets.Bottom"
|
||||
case moveType = "MoveType"
|
||||
case top = "↓ .Top"
|
||||
case middle = "↑ .Middle"
|
||||
case bottom = "↑ .Bottom "
|
||||
case middleEnable = "MiddleEnable"
|
||||
case insetsRight = "Insets.Right"
|
||||
case insetsLeft = "Insets.Left"
|
||||
case shadowBackground = "ShadowBackground"
|
||||
case landscapeTop = "↓ Landscape.Top"
|
||||
case landscapeMiddle = "↑ Landscape.Middle"
|
||||
case landscapeBottom = "↑ Landscape.Bottom "
|
||||
case landscapeMiddleEnable = "Landscape.MiddleEnable"
|
||||
case landscapeInsetsRight = "Landscape.Insets.Right"
|
||||
case landscapeInsetsLeft = "Landscape.Insets.Left"
|
||||
case landscapeShadowBackground = "Landscape.ShadowBackground"
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
|
||||
|
||||
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
// MARK: - Item
|
||||
|
||||
class ExampleSegmentCellItem: TableAdapterItem {
|
||||
|
||||
init(height: CGFloat? = nil,
|
||||
delegate: ExampleCellDelegate? = nil,
|
||||
type: ExampleCell.Style = .default,
|
||||
title: String? = nil,
|
||||
segmentItems: [String]? = nil,
|
||||
index: Int? = nil,
|
||||
callback: ((Int) -> Void)? = nil) {
|
||||
|
||||
let cellData = ExampleSegmentCellData(type, title, segmentItems, index, height, delegate, callback)
|
||||
|
||||
super.init(cellClass: ExampleSegmentCell.self, cellData: cellData)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Data
|
||||
|
||||
class ExampleSegmentCellData: ExampleCellData {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
var segmentItems: [String]
|
||||
var selectIndex: Int
|
||||
|
||||
// MARK: Inits
|
||||
|
||||
init(_ type: ExampleCell.Style,
|
||||
_ title: String?,
|
||||
_ segmentItems: [String]?,
|
||||
_ index: Int?,
|
||||
_ cellHeight: CGFloat?,
|
||||
_ delegate: ExampleCellDelegate?,
|
||||
_ callback: ((Int) -> Void)?) {
|
||||
|
||||
self.segmentItems = segmentItems ?? []
|
||||
self.selectIndex = index ?? 0
|
||||
|
||||
super.init(type, title, cellHeight, delegate, callback)
|
||||
}
|
||||
|
||||
|
||||
override public func cellHeight() -> CGFloat {
|
||||
return 81
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Cell
|
||||
|
||||
class ExampleSegmentCell: TableAdapterCell {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
public var data: ExampleSegmentCellData?
|
||||
|
||||
// MARK: Outlets
|
||||
|
||||
@IBOutlet override var selectedView: UIView? {
|
||||
didSet { }
|
||||
}
|
||||
|
||||
@IBOutlet private weak var segmentControl: UISegmentedControl?
|
||||
@IBOutlet private weak var titleLabel: UILabel?
|
||||
|
||||
// MARK: Load
|
||||
|
||||
override func awakeFromNib() {
|
||||
}
|
||||
|
||||
// MARK: Initialize
|
||||
|
||||
override func fill(data: TableAdapterCellData?) {
|
||||
guard let data = data as? ExampleSegmentCellData else { return }
|
||||
self.data = data
|
||||
|
||||
titleLabel?.text = data.title
|
||||
|
||||
segmentControl?.removeAllSegments()
|
||||
for (index, item) in data.segmentItems.enumerated() {
|
||||
segmentControl?.insertSegment(withTitle: item, at: index, animated: false)
|
||||
}
|
||||
segmentControl?.selectedSegmentIndex = data.selectIndex
|
||||
|
||||
}
|
||||
|
||||
@IBAction func segmentAction(_ sender: UISegmentedControl) {
|
||||
guard let data = data else { return }
|
||||
|
||||
let value = sender.selectedSegmentIndex
|
||||
data.selectIndex = value
|
||||
|
||||
data.callback?(value)
|
||||
data.delegate?.exampleCell(self, type: data.type, value: CGFloat(value), endEditing: true)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="ADc-Wu-299" customClass="ExampleSegmentCell" customModule="ContainerController" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="290" height="81"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="ADc-Wu-299" id="Qrk-n6-aPT">
|
||||
<rect key="frame" x="0.0" y="0.0" width="290" height="81"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<segmentedControl opaque="NO" contentMode="scaleToFill" horizontalCompressionResistancePriority="751" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="WgT-5R-8In">
|
||||
<rect key="frame" x="10" y="38" width="270" height="32"/>
|
||||
<segments>
|
||||
<segment title="1"/>
|
||||
<segment title="2"/>
|
||||
</segments>
|
||||
<connections>
|
||||
<action selector="segmentAction:" destination="ADc-Wu-299" eventType="valueChanged" id="oIV-cV-3H2"/>
|
||||
</connections>
|
||||
</segmentedControl>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SegmentText" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aYC-50-jqf">
|
||||
<rect key="frame" x="10" y="12" width="270" height="16"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="13"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="aYC-50-jqf" firstAttribute="top" secondItem="Qrk-n6-aPT" secondAttribute="top" constant="12" id="1NE-tQ-6YQ"/>
|
||||
<constraint firstItem="WgT-5R-8In" firstAttribute="top" secondItem="aYC-50-jqf" secondAttribute="bottom" constant="10" id="6hI-5U-Scq"/>
|
||||
<constraint firstAttribute="trailing" secondItem="WgT-5R-8In" secondAttribute="trailing" constant="10" id="9a8-wY-lLP"/>
|
||||
<constraint firstItem="WgT-5R-8In" firstAttribute="leading" secondItem="Qrk-n6-aPT" secondAttribute="leading" constant="10" id="kj4-5u-Txa"/>
|
||||
<constraint firstAttribute="trailing" secondItem="aYC-50-jqf" secondAttribute="trailing" constant="10" id="s5D-0l-vbW"/>
|
||||
<constraint firstItem="aYC-50-jqf" firstAttribute="leading" secondItem="Qrk-n6-aPT" secondAttribute="leading" constant="10" id="tNY-fx-JmB"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<connections>
|
||||
<outlet property="segmentControl" destination="WgT-5R-8In" id="reJ-Vu-glv"/>
|
||||
<outlet property="titleLabel" destination="aYC-50-jqf" id="lUq-rA-0RO"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="54.399999999999999" y="101.19940029985008"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
</document>
|
||||
@@ -0,0 +1,131 @@
|
||||
|
||||
|
||||
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
// MARK: - Item
|
||||
|
||||
class ExampleSliderCellItem: TableAdapterItem {
|
||||
|
||||
init(height: CGFloat? = nil,
|
||||
delegate: ExampleCellDelegate? = nil,
|
||||
type: ExampleCell.Style = .default,
|
||||
title: String? = nil,
|
||||
|
||||
value: Float? = nil,
|
||||
maximumValue: Float? = nil,
|
||||
minimumValue: Float? = nil,
|
||||
callback: ((Int) -> Void)? = nil) {
|
||||
|
||||
let cellData = ExampleSliderCellData(type, title, value, maximumValue, minimumValue, height, delegate, callback)
|
||||
|
||||
super.init(cellClass: ExampleSliderCell.self, cellData: cellData)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Data
|
||||
|
||||
class ExampleSliderCellData: ExampleCellData {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
var value: Float
|
||||
var maximumValue: Float
|
||||
var minimumValue: Float
|
||||
|
||||
// MARK: Inits
|
||||
|
||||
init(_ type: ExampleCell.Style,
|
||||
_ title: String? = nil,
|
||||
_ value: Float? = nil,
|
||||
_ maximumValue: Float? = nil,
|
||||
_ minimumValue: Float? = nil,
|
||||
_ cellHeight: CGFloat?,
|
||||
_ delegate: ExampleCellDelegate?,
|
||||
_ callback: ((Int) -> Void)?) {
|
||||
|
||||
let v = value ?? 1.0
|
||||
|
||||
self.value = v
|
||||
self.maximumValue = maximumValue ?? v
|
||||
self.minimumValue = minimumValue ?? 0.0
|
||||
|
||||
super.init(type, title, cellHeight, delegate, callback)
|
||||
}
|
||||
|
||||
override public func cellHeight() -> CGFloat {
|
||||
return 75.0
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Cell
|
||||
|
||||
class ExampleSliderCell: ExampleCell {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
public var data: ExampleSliderCellData?
|
||||
|
||||
// MARK: Outlets
|
||||
|
||||
@IBOutlet override var selectedView: UIView? {
|
||||
didSet { }
|
||||
}
|
||||
|
||||
@IBOutlet private weak var slider: UISlider?
|
||||
@IBOutlet private weak var titleLabel: UILabel?
|
||||
@IBOutlet private weak var valueLabel: UILabel?
|
||||
|
||||
// MARK: Load
|
||||
|
||||
override func awakeFromNib() {
|
||||
}
|
||||
|
||||
// MARK: Initialize
|
||||
|
||||
override func fill(data: TableAdapterCellData?) {
|
||||
guard let data = data as? ExampleSliderCellData else { return }
|
||||
self.data = data
|
||||
|
||||
titleLabel?.text = data.title
|
||||
|
||||
slider?.maximumValue = data.maximumValue
|
||||
slider?.minimumValue = data.minimumValue
|
||||
slider?.value = data.value
|
||||
|
||||
if let slider = slider {
|
||||
let value = slider.value
|
||||
valueLabel?.text = String(format: "%.1f", value)
|
||||
data.value = value
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func sliderAction(_ sender: UISlider) {
|
||||
valueLabel(slider: sender)
|
||||
}
|
||||
|
||||
func valueLabel(slider: UISlider) {
|
||||
guard let data = data else { return }
|
||||
|
||||
let value = slider.value
|
||||
valueLabel?.text = String(format: "%.1f", value)
|
||||
data.value = value
|
||||
|
||||
data.callback?(Int(value))
|
||||
data.delegate?.exampleCell(self, type: data.type, value: CGFloat(value), endEditing: false)
|
||||
}
|
||||
|
||||
@IBAction func touchUpInside(_ slider: UISlider) {
|
||||
guard let data = data else { return }
|
||||
|
||||
let value = slider.value
|
||||
valueLabel?.text = String(format: "%.1f", value)
|
||||
data.value = value
|
||||
|
||||
data.callback?(Int(value))
|
||||
data.delegate?.exampleCell(self, type: data.type, value: CGFloat(value), endEditing: true)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="ADc-Wu-299" customClass="ExampleSliderCell" customModule="ContainerControllerSwift_Example" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="242" height="75"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="ADc-Wu-299" id="Qrk-n6-aPT">
|
||||
<rect key="frame" x="0.0" y="0.0" width="242" height="75"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SliderText" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aYC-50-jqf">
|
||||
<rect key="frame" x="10" y="12" width="201" height="16"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="13"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="0,5" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="V9W-av-foc">
|
||||
<rect key="frame" x="211" y="12" width="21" height="16"/>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="13"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="pdb-Rf-CXg">
|
||||
<rect key="frame" x="13" y="38" width="216" height="31"/>
|
||||
<connections>
|
||||
<action selector="sliderAction:" destination="ADc-Wu-299" eventType="valueChanged" id="z5E-op-Urc"/>
|
||||
<action selector="touchUpInside:" destination="ADc-Wu-299" eventType="touchUpInside" id="JqP-57-taD"/>
|
||||
</connections>
|
||||
</slider>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="V9W-av-foc" firstAttribute="leading" secondItem="aYC-50-jqf" secondAttribute="trailing" id="1ft-t2-02b"/>
|
||||
<constraint firstItem="aYC-50-jqf" firstAttribute="top" secondItem="Qrk-n6-aPT" secondAttribute="top" constant="12" id="FmA-pS-CWQ"/>
|
||||
<constraint firstAttribute="trailing" secondItem="V9W-av-foc" secondAttribute="trailing" constant="10" id="NGh-VI-z5K"/>
|
||||
<constraint firstItem="pdb-Rf-CXg" firstAttribute="top" secondItem="aYC-50-jqf" secondAttribute="bottom" constant="10" id="XRx-az-qDG"/>
|
||||
<constraint firstItem="pdb-Rf-CXg" firstAttribute="leading" secondItem="Qrk-n6-aPT" secondAttribute="leading" constant="15" id="j2i-5P-Zk0"/>
|
||||
<constraint firstAttribute="trailing" secondItem="pdb-Rf-CXg" secondAttribute="trailing" constant="15" id="kkE-oc-5w0"/>
|
||||
<constraint firstItem="V9W-av-foc" firstAttribute="top" secondItem="Qrk-n6-aPT" secondAttribute="top" constant="12" id="qab-R3-dWu"/>
|
||||
<constraint firstItem="aYC-50-jqf" firstAttribute="leading" secondItem="Qrk-n6-aPT" secondAttribute="leading" constant="10" id="tNY-fx-JmB"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<connections>
|
||||
<outlet property="slider" destination="pdb-Rf-CXg" id="gqi-vt-LUP"/>
|
||||
<outlet property="titleLabel" destination="aYC-50-jqf" id="lUq-rA-0RO"/>
|
||||
<outlet property="valueLabel" destination="V9W-av-foc" id="mOS-8N-8GQ"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="20.800000000000001" y="99.400299850074973"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
</document>
|
||||
@@ -0,0 +1,94 @@
|
||||
|
||||
|
||||
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
// MARK: - Item
|
||||
|
||||
class ExampleSwitchCellItem: TableAdapterItem {
|
||||
|
||||
init(height: CGFloat? = nil,
|
||||
delegate: ExampleCellDelegate? = nil,
|
||||
type: ExampleCell.Style = .default,
|
||||
title: String = "",
|
||||
value: Bool = false,
|
||||
callback: ((Int) -> Void)? = nil) {
|
||||
|
||||
let cellData = ExampleSwitchCellData(type, title, value, height, delegate, callback)
|
||||
|
||||
super.init(cellClass: ExampleSwitchCell.self, cellData: cellData)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Data
|
||||
|
||||
class ExampleSwitchCellData: ExampleCellData {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
var value: Bool
|
||||
|
||||
// MARK: Inits
|
||||
|
||||
init(_ type: ExampleCell.Style,
|
||||
_ title: String,
|
||||
_ value: Bool,
|
||||
_ cellHeight: CGFloat?,
|
||||
_ delegate: ExampleCellDelegate?,
|
||||
_ callback: ((Int) -> Void)?) {
|
||||
|
||||
self.value = value
|
||||
|
||||
super.init(type, title, cellHeight, delegate, callback)
|
||||
}
|
||||
|
||||
override public func cellHeight() -> CGFloat {
|
||||
return cellSizeHeight ?? 51.0
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Cell
|
||||
|
||||
class ExampleSwitchCell: TableAdapterCell {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
public var data: ExampleSwitchCellData?
|
||||
|
||||
// MARK: Outlets
|
||||
|
||||
@IBOutlet override var selectedView: UIView? {
|
||||
didSet { }
|
||||
}
|
||||
|
||||
@IBOutlet private weak var switchButton: UISwitch?
|
||||
@IBOutlet private weak var titleLabel: UILabel?
|
||||
|
||||
// MARK: Load
|
||||
|
||||
override func awakeFromNib() {
|
||||
}
|
||||
|
||||
// MARK: Initialize
|
||||
|
||||
override func fill(data: TableAdapterCellData?) {
|
||||
guard let data = data as? ExampleSwitchCellData else { return }
|
||||
self.data = data
|
||||
|
||||
titleLabel?.text = data.title
|
||||
switchButton?.setOn(data.value, animated: false)
|
||||
}
|
||||
|
||||
@IBAction func switchAction(_ sender: UISwitch) {
|
||||
guard let data = data else { return }
|
||||
|
||||
let value = sender.isOn
|
||||
data.value = value
|
||||
|
||||
data.callback?((value ? 1 : 0))
|
||||
data.delegate?.exampleCell(self, type: data.type, value: (value ? 1 : 0), endEditing: true)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="ADc-Wu-299" customClass="ExampleSwitchCell" customModule="ContainerController" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="351" height="51"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="ADc-Wu-299" id="Qrk-n6-aPT">
|
||||
<rect key="frame" x="0.0" y="0.0" width="351" height="51"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SwitchText" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aYC-50-jqf">
|
||||
<rect key="frame" x="10" y="9.5" width="272" height="32"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="32" id="ygQ-Ul-8eS"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="13"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="BxP-OS-4Mu">
|
||||
<rect key="frame" x="292" y="10" width="51" height="31"/>
|
||||
<color key="onTintColor" systemColor="systemBlueColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<connections>
|
||||
<action selector="switchAction:" destination="ADc-Wu-299" eventType="valueChanged" id="tC8-YJ-2yF"/>
|
||||
</connections>
|
||||
</switch>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="BxP-OS-4Mu" firstAttribute="leading" secondItem="aYC-50-jqf" secondAttribute="trailing" constant="10" id="Nor-jw-6Vp"/>
|
||||
<constraint firstItem="BxP-OS-4Mu" firstAttribute="centerY" secondItem="Qrk-n6-aPT" secondAttribute="centerY" id="OC2-nT-sr6"/>
|
||||
<constraint firstAttribute="trailing" secondItem="BxP-OS-4Mu" secondAttribute="trailing" constant="10" id="iXi-S4-icf"/>
|
||||
<constraint firstItem="aYC-50-jqf" firstAttribute="centerY" secondItem="Qrk-n6-aPT" secondAttribute="centerY" id="mME-6L-435"/>
|
||||
<constraint firstItem="aYC-50-jqf" firstAttribute="leading" secondItem="Qrk-n6-aPT" secondAttribute="leading" constant="10" id="tNY-fx-JmB"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<connections>
|
||||
<outlet property="switchButton" destination="BxP-OS-4Mu" id="Fzu-VA-frU"/>
|
||||
<outlet property="titleLabel" destination="aYC-50-jqf" id="lUq-rA-0RO"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="108" y="99.850074962518747"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
</document>
|
||||
@@ -0,0 +1,117 @@
|
||||
|
||||
|
||||
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
// MARK: - Item
|
||||
|
||||
class TitleTextItem: TableAdapterItem {
|
||||
|
||||
init(title: String? = nil,
|
||||
subtitle: String? = nil,
|
||||
separator: Bool = false,
|
||||
clss: AnyClass? = nil,
|
||||
touchAnimationHide: Bool = false,
|
||||
editing: Bool = false) {
|
||||
|
||||
let cellData = TitleTextCellData(title, subtitle, separator, clss, touchAnimationHide, editing)
|
||||
|
||||
super.init(cellClass: TitleTextCell.self, cellData: cellData)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Data
|
||||
|
||||
class TitleTextCellData: TableAdapterCellData {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
var title: String?
|
||||
var subtitle: String?
|
||||
var clss: AnyClass?
|
||||
var separatorVisible: Bool
|
||||
var touchAnimationHide: Bool
|
||||
|
||||
var editing: Bool
|
||||
|
||||
// MARK: Inits
|
||||
|
||||
init(_ title: String? = nil,
|
||||
_ subtitle: String? = nil,
|
||||
_ separator: Bool,
|
||||
_ clss: AnyClass? = nil,
|
||||
_ touchAnimationHide: Bool,
|
||||
_ editing: Bool) {
|
||||
|
||||
self.title = title
|
||||
self.subtitle = subtitle
|
||||
|
||||
self.clss = clss
|
||||
|
||||
self.separatorVisible = separator
|
||||
self.touchAnimationHide = touchAnimationHide
|
||||
|
||||
self.editing = editing
|
||||
|
||||
super.init()
|
||||
}
|
||||
|
||||
override public func cellHeight() -> CGFloat {
|
||||
|
||||
if title != nil {
|
||||
return 64
|
||||
} else {
|
||||
return 44
|
||||
}
|
||||
}
|
||||
|
||||
override public func canEditing() -> Bool {
|
||||
return editing
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Cell
|
||||
|
||||
class TitleTextCell: TableAdapterCell {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
public var data: TitleTextCellData?
|
||||
|
||||
// MARK: Outlets
|
||||
|
||||
@IBOutlet override var selectedView: UIView? {
|
||||
didSet { }
|
||||
}
|
||||
|
||||
@IBOutlet private weak var titleLabel: UILabel?
|
||||
@IBOutlet private weak var subtitleLabel: UILabel?
|
||||
@IBOutlet private weak var separatorView: UIView?
|
||||
@IBOutlet private weak var separatorHeightConstraint: NSLayoutConstraint?
|
||||
|
||||
// MARK: Initialize
|
||||
|
||||
override func awakeFromNib() {
|
||||
separatorView?.backgroundColor = .clear
|
||||
separatorHeightConstraint?.constant = 0.5
|
||||
}
|
||||
|
||||
override func fill(data: TableAdapterCellData?) {
|
||||
guard let data = data as? TitleTextCellData else { return }
|
||||
self.data = data
|
||||
|
||||
// self._hideAnimation = data.touchAnimationHide
|
||||
|
||||
titleLabel?.text = data.title
|
||||
|
||||
subtitleLabel?.text = (data.clss != nil) ? classNameString(data.clss!) : data.subtitle
|
||||
|
||||
separatorView?.isHidden = !data.separatorVisible
|
||||
}
|
||||
|
||||
func classNameString(_ obj: Any) -> String {
|
||||
return String(describing: type(of: obj))
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="64" id="ADc-Wu-299" customClass="TitleTextCell" customModule="ContainerControllerSwift_Example" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="64"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="ADc-Wu-299" id="Qrk-n6-aPT">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="64"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Tite" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="MbP-dL-b7J">
|
||||
<rect key="frame" x="16" y="12" width="360" height="14"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="14" id="ybu-0n-7d1"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="12"/>
|
||||
<color key="textColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Subtitle subtitle subtitle" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="erD-8k-fq0">
|
||||
<rect key="frame" x="16" y="32" width="360" height="19"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="19" id="DgX-EK-d6R"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||
<color key="textColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="y4e-nG-Zu6">
|
||||
<rect key="frame" x="16" y="63" width="343" height="1"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="1" id="Mwb-A9-GWL"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="y4e-nG-Zu6" secondAttribute="trailing" constant="16" id="6tU-aV-NOW"/>
|
||||
<constraint firstItem="MbP-dL-b7J" firstAttribute="leading" secondItem="Qrk-n6-aPT" secondAttribute="leading" constant="16" id="CVY-pT-bde"/>
|
||||
<constraint firstItem="y4e-nG-Zu6" firstAttribute="leading" secondItem="Qrk-n6-aPT" secondAttribute="leading" constant="16" id="QFm-sF-aRI"/>
|
||||
<constraint firstItem="y4e-nG-Zu6" firstAttribute="top" secondItem="erD-8k-fq0" secondAttribute="bottom" constant="12" id="QZO-jk-KTF"/>
|
||||
<constraint firstItem="MbP-dL-b7J" firstAttribute="top" secondItem="Qrk-n6-aPT" secondAttribute="top" constant="12" id="bPX-J8-yKW"/>
|
||||
<constraint firstItem="erD-8k-fq0" firstAttribute="trailing" secondItem="Qrk-n6-aPT" secondAttribute="trailingMargin" constant="16" id="coB-XR-Ksl"/>
|
||||
<constraint firstItem="erD-8k-fq0" firstAttribute="leading" secondItem="Qrk-n6-aPT" secondAttribute="leading" constant="16" id="fId-PQ-DA7"/>
|
||||
<constraint firstAttribute="bottom" secondItem="y4e-nG-Zu6" secondAttribute="bottom" id="lV9-iJ-0gZ"/>
|
||||
<constraint firstItem="MbP-dL-b7J" firstAttribute="trailing" secondItem="Qrk-n6-aPT" secondAttribute="trailingMargin" constant="16" id="yAB-Bt-Wbb"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<connections>
|
||||
<outlet property="separatorHeightConstraint" destination="Mwb-A9-GWL" id="PQz-KX-a42"/>
|
||||
<outlet property="separatorView" destination="y4e-nG-Zu6" id="iw9-9r-qpC"/>
|
||||
<outlet property="subtitleLabel" destination="erD-8k-fq0" id="Ggx-EQ-sNx"/>
|
||||
<outlet property="titleLabel" destination="MbP-dL-b7J" id="flI-3r-06U"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="127.2" y="111.54422788605699"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
</document>
|
||||
@@ -0,0 +1,91 @@
|
||||
|
||||
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
|
||||
class ExampleCollectionItem: CollectionAdapterItem {
|
||||
|
||||
init(width: CGFloat,
|
||||
padding: CGFloat,
|
||||
clickCallback: (() -> Void)? = nil) {
|
||||
|
||||
let cellData = ExampleCollectionCellData(width, padding, clickCallback)
|
||||
|
||||
super.init(cellClass: ExampleCollectionCell.self, cellData: cellData)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class ExampleCollectionCellData: CollectionAdapterCellData {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
public var width: CGFloat
|
||||
public var padding: CGFloat
|
||||
public var clickCallback: (() -> Void)?
|
||||
|
||||
// MARK: Inits
|
||||
|
||||
public init (_ width: CGFloat,
|
||||
_ padding: CGFloat,
|
||||
_ clickCallback: (() -> Void)?) {
|
||||
|
||||
self.width = width
|
||||
self.padding = padding
|
||||
self.clickCallback = clickCallback
|
||||
|
||||
super.init()
|
||||
}
|
||||
|
||||
override public func size() -> CGSize {
|
||||
let w = (width / 2) - ((padding / 2) * 3)
|
||||
return CGSize(width: w, height: w)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class ExampleCollectionCell: CollectionAdapterCell {
|
||||
|
||||
// MARK: Outlets
|
||||
|
||||
@IBOutlet weak var imageButton: DesignButton?
|
||||
@IBOutlet weak var titleLabel: UILabel?
|
||||
@IBOutlet weak var subtitleLabel: UILabel?
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
public var data: ExampleCollectionCellData?
|
||||
|
||||
override func awakeFromNib() {
|
||||
|
||||
}
|
||||
|
||||
override func fill(data: Any?) {
|
||||
|
||||
guard let data = data as? ExampleCollectionCellData else { return }
|
||||
self.data = data
|
||||
|
||||
let randomInt = Int.random(in: 0..<6)
|
||||
|
||||
var color: UIColor = .systemBlue
|
||||
|
||||
switch randomInt {
|
||||
case 0: color = .systemBlue
|
||||
case 1: color = .systemRed
|
||||
case 2: color = .systemGray
|
||||
case 3: color = .systemGreen
|
||||
case 4: color = .systemYellow
|
||||
case 5: color = .systemOrange
|
||||
default: break
|
||||
}
|
||||
|
||||
imageButton?.layer.backgroundColor = color.cgColor
|
||||
imageButton?.fillColor = color
|
||||
}
|
||||
|
||||
@IBAction func buttonClickAction(_ sender: Any) {
|
||||
data?.clickCallback?()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina6_1" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
|
||||
<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"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="gTV-IL-0wX" customClass="ExampleCollectionCell" customModule="ContainerController" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="135" height="132"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="0.0" y="0.0" width="135" height="132"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LEH-bq-86c">
|
||||
<rect key="frame" x="0.0" y="0.0" width="135" height="132"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="gSI-Iw-oJa" customClass="DesignButton" customModule="ContainerController" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="135" height="132"/>
|
||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="12"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" red="0.0" green="0.68235294120000001" blue="0.93725490199999995" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="buttonClickAction:" destination="gTV-IL-0wX" eventType="touchUpInside" id="h1P-jY-xGs"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="gSI-Iw-oJa" secondAttribute="bottom" id="G8K-Pi-exg"/>
|
||||
<constraint firstItem="gSI-Iw-oJa" firstAttribute="leading" secondItem="LEH-bq-86c" secondAttribute="leading" id="XMR-dX-hy2"/>
|
||||
<constraint firstAttribute="trailing" secondItem="gSI-Iw-oJa" secondAttribute="trailing" id="jgw-rR-x72"/>
|
||||
<constraint firstItem="gSI-Iw-oJa" firstAttribute="top" secondItem="LEH-bq-86c" secondAttribute="top" id="x4f-qZ-COE"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
</view>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="LEH-bq-86c" secondAttribute="trailing" id="G8N-J0-CSq"/>
|
||||
<constraint firstItem="LEH-bq-86c" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="dbr-mp-YyA"/>
|
||||
<constraint firstAttribute="bottom" secondItem="LEH-bq-86c" secondAttribute="bottom" id="hRo-ja-sYz"/>
|
||||
<constraint firstItem="LEH-bq-86c" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="lyJ-5L-dyH"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="ZTg-uK-7eu"/>
|
||||
<size key="customSize" width="135" height="132"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="boolean" keyPath="hideAnimation" value="NO"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<outlet property="imageButton" destination="gSI-Iw-oJa" id="qP3-Hl-7ap"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="113.768115942029" y="78.348214285714278"/>
|
||||
</collectionViewCell>
|
||||
</objects>
|
||||
</document>
|
||||
@@ -0,0 +1,28 @@
|
||||
//
|
||||
// ExampleHeaderGripView.swift
|
||||
// GTDriver
|
||||
//
|
||||
// Created by mrustaa on 16/01/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
class ExampleFooterButtonView: XibView {
|
||||
|
||||
var buttonClickCallback: (() -> Void)?
|
||||
|
||||
// MARK: - IBOutlets
|
||||
|
||||
@IBOutlet public weak var separatorView: UIView?
|
||||
@IBOutlet weak var separatorHeight: NSLayoutConstraint?
|
||||
|
||||
override func loadedFromNib() {
|
||||
separatorHeight?.constant = 0.5
|
||||
separatorView?.alpha = 1.0
|
||||
}
|
||||
|
||||
@IBAction func buttonClickAction(_ sender: Any) {
|
||||
buttonClickCallback?()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ExampleFooterButtonView" customModule="ContainerController" customModuleProvider="target">
|
||||
<connections>
|
||||
<outlet property="separatorHeight" destination="0TO-pN-EmM" id="CEV-uN-Ce9"/>
|
||||
<outlet property="separatorView" destination="Uen-Cc-5EB" id="aen-jw-8Vm"/>
|
||||
</connections>
|
||||
</placeholder>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<view contentMode="scaleToFill" id="iN0-l3-epB">
|
||||
<rect key="frame" x="0.0" y="0.0" width="382" height="81"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Uen-Cc-5EB">
|
||||
<rect key="frame" x="0.0" y="0.0" width="382" height="1"/>
|
||||
<color key="backgroundColor" white="0.49604060374149661" alpha="0.60400722789115646" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="1" id="0TO-pN-EmM"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pSo-VS-Su8" customClass="DesignButton" customModule="ContainerController" customModuleProvider="target">
|
||||
<rect key="frame" x="25" y="15" width="332" height="51"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="18"/>
|
||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="10" maxY="0.0"/>
|
||||
<state key="normal" title="Cancel"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="10"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" white="0.49463900862068966" alpha="0.51166487068965516" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="shadowColor">
|
||||
<color key="value" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
|
||||
<real key="value" value="3"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
|
||||
<size key="value" width="0.0" height="3"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
|
||||
<real key="value" value="3"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="buttonClickAction:" destination="-1" eventType="touchUpInside" id="wy8-Gf-0vo"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="pSo-VS-Su8" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="15" id="0SA-iS-hVR"/>
|
||||
<constraint firstItem="Uen-Cc-5EB" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="JRv-dy-R4j"/>
|
||||
<constraint firstAttribute="trailing" secondItem="pSo-VS-Su8" secondAttribute="trailing" constant="25" id="V1A-hR-aks"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Uen-Cc-5EB" secondAttribute="trailing" id="bia-iD-Dzg"/>
|
||||
<constraint firstAttribute="bottom" secondItem="pSo-VS-Su8" secondAttribute="bottom" constant="15" id="c8W-zh-zWe"/>
|
||||
<constraint firstItem="Uen-Cc-5EB" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="ga8-o1-mfN"/>
|
||||
<constraint firstItem="pSo-VS-Su8" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="25" id="zpk-vQ-dqa"/>
|
||||
</constraints>
|
||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
||||
<point key="canvasLocation" x="307.19999999999999" y="212.29385307346328"/>
|
||||
</view>
|
||||
</objects>
|
||||
</document>
|
||||
@@ -0,0 +1,28 @@
|
||||
//
|
||||
// ExampleHeaderGripView.swift
|
||||
// GTDriver
|
||||
//
|
||||
// Created by mrustaa on 16/01/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
class ExampleHeaderGripView: XibView {
|
||||
|
||||
var searchBarBeginEditingCallback: (() -> Void)?
|
||||
var searchBarCancelButtonClickedCallback: (() -> Void)?
|
||||
|
||||
// MARK: - IBOutlets
|
||||
|
||||
@IBOutlet public weak var separatorView: UIView?
|
||||
@IBOutlet weak var separatorHeight: NSLayoutConstraint?
|
||||
|
||||
override func loadedFromNib() {
|
||||
separatorHeight?.constant = 0.5
|
||||
separatorView?.alpha = 0.0
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ExampleHeaderGripView" customModule="ContainerController" customModuleProvider="target">
|
||||
<connections>
|
||||
<outlet property="separatorHeight" destination="0TO-pN-EmM" id="CEV-uN-Ce9"/>
|
||||
<outlet property="separatorView" destination="Uen-Cc-5EB" id="aen-jw-8Vm"/>
|
||||
</connections>
|
||||
</placeholder>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<view contentMode="scaleToFill" id="iN0-l3-epB">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2ea-2D-g1K" customClass="DesignView" customModule="ContainerController" customModuleProvider="target">
|
||||
<rect key="frame" x="142" y="5" width="36" height="5"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="5" id="4R5-pO-IGk"/>
|
||||
<constraint firstAttribute="width" constant="36" id="K4R-tH-ira"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="-1"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" red="0.50980392156862742" green="0.50991177558898926" blue="0.50991177558898926" alpha="0.39849064624489788" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Uen-Cc-5EB">
|
||||
<rect key="frame" x="0.0" y="20" width="320" height="0.0"/>
|
||||
<color key="backgroundColor" white="0.49604060374149661" alpha="0.60400722789115646" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" id="0TO-pN-EmM"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="headerShadow.png" translatesAutoresizingMaskIntoConstraints="NO" id="IFV-VB-79V">
|
||||
<rect key="frame" x="0.0" y="20" width="320" height="20"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="20" id="w60-y2-XbQ"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="Uen-Cc-5EB" firstAttribute="bottom" secondItem="iN0-l3-epB" secondAttribute="bottom" id="I9t-qK-dY0"/>
|
||||
<constraint firstAttribute="trailing" secondItem="IFV-VB-79V" secondAttribute="trailing" id="IMg-kh-WCM"/>
|
||||
<constraint firstItem="2ea-2D-g1K" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="N4d-vR-36l"/>
|
||||
<constraint firstItem="2ea-2D-g1K" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="5" id="VHF-z8-u6m"/>
|
||||
<constraint firstItem="IFV-VB-79V" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="20" id="arZ-KV-mud"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Uen-Cc-5EB" secondAttribute="trailing" id="bia-iD-Dzg"/>
|
||||
<constraint firstItem="IFV-VB-79V" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="eof-iW-Qux"/>
|
||||
<constraint firstItem="Uen-Cc-5EB" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="ga8-o1-mfN"/>
|
||||
</constraints>
|
||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
||||
<point key="canvasLocation" x="257.60000000000002" y="181.70914542728636"/>
|
||||
</view>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="headerShadow.png" width="1170" height="75"/>
|
||||
</resources>
|
||||
</document>
|
||||
|
After Width: | Height: | Size: 17 KiB |
@@ -0,0 +1,134 @@
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
@IBDesignable
|
||||
class DesignButton: UIButton {
|
||||
|
||||
@IBInspectable var hideAnimation: Bool = true
|
||||
|
||||
@IBInspectable var fillColor: UIColor = .clear
|
||||
|
||||
@IBInspectable var gradientColor: UIColor?
|
||||
@IBInspectable var gradientOffset: CGPoint = CGPoint(x: 0, y: 1)
|
||||
|
||||
@IBInspectable var cornerRadius: CGFloat = 0.0
|
||||
|
||||
@IBInspectable var shadowColor: UIColor = .clear
|
||||
@IBInspectable var shadowOffset: CGSize = CGSize.zero
|
||||
@IBInspectable var shadowRadius: CGFloat = 0.0
|
||||
@IBInspectable var shadowOpacity: CGFloat = 0.0
|
||||
|
||||
@IBInspectable var borderColor: UIColor = .clear
|
||||
@IBInspectable var borderWidth: CGFloat = 0.0
|
||||
|
||||
override func draw(_ rect: CGRect) {
|
||||
|
||||
if let gradientColor = gradientColor {
|
||||
|
||||
let glayer = CAGradientLayer()
|
||||
glayer.frame = bounds
|
||||
glayer.colors = [fillColor.cgColor, gradientColor.cgColor]
|
||||
glayer.startPoint = CGPoint.zero
|
||||
glayer.endPoint = gradientOffset
|
||||
glayer.cornerRadius = radius()
|
||||
layer.insertSublayer(glayer, at: 0)
|
||||
|
||||
} else {
|
||||
layer.backgroundColor = fillColor.cgColor
|
||||
}
|
||||
|
||||
layer.cornerRadius = radius()
|
||||
|
||||
layer.shadowOffset = shadowOffset
|
||||
layer.shadowOpacity = Float(shadowOpacity / 10.0)
|
||||
layer.shadowRadius = shadowRadius
|
||||
layer.shadowColor = shadowColor.cgColor
|
||||
|
||||
layer.borderColor = borderColor.cgColor
|
||||
layer.borderWidth = borderWidth
|
||||
}
|
||||
|
||||
override var isSelected: Bool {
|
||||
didSet {
|
||||
super.isSelected = isSelected
|
||||
}
|
||||
}
|
||||
|
||||
override var isHighlighted: Bool {
|
||||
didSet {
|
||||
// super.isHighlighted = isHighlighted
|
||||
}
|
||||
}
|
||||
|
||||
override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
|
||||
selectedLayer(show: true)
|
||||
return super.beginTracking(touch, with: event)
|
||||
}
|
||||
|
||||
override func continueTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
|
||||
let point = touch.location(in: self)
|
||||
let someFrame = bounds
|
||||
let highlighted = someFrame.contains(point)
|
||||
selectedLayer(show: highlighted)
|
||||
return super.continueTracking(touch, with: event)
|
||||
}
|
||||
|
||||
override func endTracking(_ touch: UITouch?, with event: UIEvent?) {
|
||||
selectedLayer(show: false)
|
||||
super.endTracking(touch, with: event)
|
||||
}
|
||||
|
||||
override func cancelTracking(with event: UIEvent?) {
|
||||
selectedLayer(show: false)
|
||||
super.cancelTracking(with: event)
|
||||
}
|
||||
|
||||
func radius() -> CGFloat {
|
||||
let minSize = min(frame.size.width, frame.size.height)
|
||||
let radius = ((cornerRadius < 0) ? (minSize / 2) : cornerRadius)
|
||||
return radius
|
||||
}
|
||||
|
||||
func selectedLayer(show: Bool) {
|
||||
|
||||
func selectAnimationHide(show: Bool) {
|
||||
if show {
|
||||
alpha = 0.5
|
||||
} else {
|
||||
UIView.animate(withDuration: 0.35, animations: {
|
||||
self.alpha = 1
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func selectAnimationShadow(show: Bool) {
|
||||
let tag = 1
|
||||
let view = viewWithTag(tag)
|
||||
if show {
|
||||
if view == nil {
|
||||
let view = UIView(frame: bounds)
|
||||
view.backgroundColor = UIColor.init(white: 0.0, alpha: 0.2)
|
||||
view.tag = tag
|
||||
view.layer.cornerRadius = radius()
|
||||
addSubview(view)
|
||||
}
|
||||
} else {
|
||||
if let view = view {
|
||||
UIView.animate(withDuration: 0.35, animations: {
|
||||
view.alpha = 0
|
||||
}) { (fin: Bool) in
|
||||
view.removeFromSuperview()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if hideAnimation {
|
||||
selectAnimationHide(show: show)
|
||||
} else {
|
||||
selectAnimationShadow(show: show)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
|
||||
|
||||
import UIKit
|
||||
|
||||
@IBDesignable
|
||||
class DesignView: UIView {
|
||||
|
||||
@IBInspectable var fillColor: UIColor = .clear
|
||||
|
||||
//MARK: - Gradient
|
||||
|
||||
@IBInspectable var gradientColor: UIColor?
|
||||
@IBInspectable var gradientColor2: UIColor?
|
||||
@IBInspectable var gradientColor3: UIColor?
|
||||
@IBInspectable var gradientStartPoint: CGPoint = CGPoint.zero
|
||||
@IBInspectable var gradientOffset: CGPoint = CGPoint(x: 0, y: 1)
|
||||
|
||||
//MARK: - Shadow
|
||||
|
||||
@IBInspectable var shadowColor: UIColor = .clear
|
||||
@IBInspectable var shadowOffset: CGSize = CGSize.zero
|
||||
@IBInspectable var shadowRadius: CGFloat = 0.0
|
||||
@IBInspectable var shadowOpacity: CGFloat = 0.0
|
||||
|
||||
//MARK: - Radius
|
||||
|
||||
@IBInspectable var cornerRadius: CGFloat = 0.0
|
||||
|
||||
//MARK: - Border
|
||||
|
||||
@IBInspectable var borderColor: UIColor = .clear
|
||||
@IBInspectable var borderWidth: CGFloat = 0.0
|
||||
|
||||
override func draw(_ rect: CGRect) {
|
||||
|
||||
if let gradientColor = gradientColor {
|
||||
|
||||
var colors: [CGColor] = []
|
||||
colors.append(fillColor.cgColor)
|
||||
colors.append(gradientColor.cgColor)
|
||||
if let gradientColor2 = gradientColor2 { colors.append(gradientColor2.cgColor) }
|
||||
if let gradientColor3 = gradientColor3 { colors.append(gradientColor3.cgColor) }
|
||||
|
||||
let glayer = CAGradientLayer()
|
||||
glayer.frame = bounds
|
||||
glayer.colors = colors
|
||||
glayer.startPoint = gradientStartPoint
|
||||
glayer.endPoint = gradientOffset
|
||||
glayer.cornerRadius = radius()
|
||||
layer.insertSublayer(glayer, at: 0)
|
||||
|
||||
} else {
|
||||
layer.backgroundColor = fillColor.cgColor
|
||||
}
|
||||
|
||||
layer.cornerRadius = radius()
|
||||
|
||||
layer.shadowOffset = shadowOffset
|
||||
layer.shadowOpacity = Float(shadowOpacity / 10.0)
|
||||
layer.shadowRadius = shadowRadius
|
||||
layer.shadowColor = shadowColor.cgColor
|
||||
|
||||
layer.borderColor = borderColor.cgColor
|
||||
layer.borderWidth = borderWidth
|
||||
}
|
||||
|
||||
func radius() -> CGFloat {
|
||||
let minSize = min(width, height)
|
||||
let radius = ((cornerRadius < 0) ? (minSize / 2) : cornerRadius)
|
||||
return radius
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
//
|
||||
// StoryboardController.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 20/04/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
@IBDesignable
|
||||
class StoryboardController: UIViewController {
|
||||
|
||||
class func instantiate() -> UIViewController {
|
||||
return fromStoryboardController()
|
||||
}
|
||||
|
||||
class func fromStoryboardController() -> UIViewController {
|
||||
let className = String(describing: self)
|
||||
|
||||
let storyboard = UIStoryboard.init(name: className, bundle: nil)
|
||||
|
||||
// if let initialViewController = storyboard.instantiateInitialViewController() {
|
||||
// return initialViewController
|
||||
// } else {
|
||||
// fatalError("Can't initialize view controller \(self)")
|
||||
// }
|
||||
|
||||
return storyboard.instantiateViewController(withIdentifier: className)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
//
|
||||
// XibView.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 19/04/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
class XibView: UIView {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
public weak var contentView: UIView?
|
||||
|
||||
// MARK: - Initialize
|
||||
|
||||
required public init?(coder aDecoder: NSCoder) {
|
||||
super.init(coder: aDecoder)
|
||||
contentView = fromNib()
|
||||
loadedFromNib()
|
||||
}
|
||||
|
||||
public init() {
|
||||
super.init(frame: CGRect.zero)
|
||||
contentView = fromNib()
|
||||
frame = contentView?.frame ?? frame
|
||||
loadedFromNib()
|
||||
}
|
||||
|
||||
// MARK: - Postflight
|
||||
|
||||
open func loadedFromNib() {
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Load Nib
|
||||
|
||||
func fromNibWithoutConstraints() -> UIView? {
|
||||
guard let contentView = Bundle(for: type(of: self)).loadNibNamed(String(describing: type(of: self)), owner: self, options: nil)?.first as? UIView else {
|
||||
return nil
|
||||
}
|
||||
|
||||
contentView.translatesAutoresizingMaskIntoConstraints = false
|
||||
addSubview(contentView)
|
||||
|
||||
return contentView
|
||||
}
|
||||
|
||||
func fromNib() -> UIView? {
|
||||
guard let contentView = fromNibWithoutConstraints() else { return nil }
|
||||
|
||||
let bottomConstraint = NSLayoutConstraint(
|
||||
item: contentView,
|
||||
attribute: NSLayoutConstraint.Attribute.bottom,
|
||||
relatedBy: NSLayoutConstraint.Relation.equal,
|
||||
toItem: self,
|
||||
attribute: NSLayoutConstraint.Attribute.bottom,
|
||||
multiplier: 1,
|
||||
constant: 0
|
||||
)
|
||||
|
||||
let trailingConstraint = NSLayoutConstraint(
|
||||
item: contentView,
|
||||
attribute: NSLayoutConstraint.Attribute.trailing,
|
||||
relatedBy: NSLayoutConstraint.Relation.equal,
|
||||
toItem: self,
|
||||
attribute: NSLayoutConstraint.Attribute.trailing,
|
||||
multiplier: 1,
|
||||
constant: 0
|
||||
)
|
||||
|
||||
let topConstraint = NSLayoutConstraint(
|
||||
item: contentView,
|
||||
attribute: NSLayoutConstraint.Attribute.top,
|
||||
relatedBy: NSLayoutConstraint.Relation.equal,
|
||||
toItem: self,
|
||||
attribute: NSLayoutConstraint.Attribute.top,
|
||||
multiplier: 1,
|
||||
constant: 0
|
||||
)
|
||||
|
||||
let leadingConstraint = NSLayoutConstraint(
|
||||
item: contentView,
|
||||
attribute: NSLayoutConstraint.Attribute.leading,
|
||||
relatedBy: NSLayoutConstraint.Relation.equal,
|
||||
toItem: self,
|
||||
attribute: NSLayoutConstraint.Attribute.leading,
|
||||
multiplier: 1,
|
||||
constant: 0
|
||||
)
|
||||
|
||||
addConstraints([bottomConstraint, trailingConstraint, topConstraint, leadingConstraint])
|
||||
|
||||
return contentView
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
|
||||
import UIKit
|
||||
|
||||
extension UIColor {
|
||||
var redValue: CGFloat{ return CIColor(color: self).red }
|
||||
var greenValue: CGFloat{ return CIColor(color: self).green }
|
||||
var blueValue: CGFloat{ return CIColor(color: self).blue }
|
||||
var alphaValue: CGFloat{ return CIColor(color: self).alpha }
|
||||
}
|
||||
|
||||
class Colors {
|
||||
|
||||
class func rgba( _ red: CGFloat, _ green: CGFloat, _ blue: CGFloat, _ alpha: CGFloat) -> UIColor {
|
||||
return UIColor(red: red / 255, green: green / 255, blue: blue / 255, alpha: alpha)
|
||||
}
|
||||
|
||||
class func rgb( _ red: CGFloat, _ green: CGFloat, _ blue: CGFloat) -> UIColor {
|
||||
return rgba(red, green, blue, 1)
|
||||
}
|
||||
|
||||
class func grayLevel(_ gray: CGFloat) -> UIColor {
|
||||
return rgb(gray * 255, gray * 255, gray * 255)
|
||||
}
|
||||
|
||||
class func blackAlpha(_ alpha: CGFloat) -> UIColor {
|
||||
return rgba(0, 0, 0, alpha)
|
||||
}
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
static public let lightGray = blackAlpha(0.1)
|
||||
static public let slightlyDark = blackAlpha(0.3)
|
||||
static public let halfBlack = blackAlpha(0.5)
|
||||
|
||||
static public let black = grayLevel(0) // 0 %
|
||||
static public let gray = grayLevel(127) // 49 %
|
||||
static public let lightInactiveGray = grayLevel(178) // 69 %
|
||||
static public let silver = grayLevel(229) // 89 %
|
||||
static public let inactiveGray = grayLevel(246) // 96 %
|
||||
static public let white = grayLevel(255) // 100 %
|
||||
|
||||
static public let transparentGray = rgba(225, 225, 225, 0.3)
|
||||
static public let lightOrange = rgba(255, 105, 0, 0.1)
|
||||
|
||||
static public let red = rgb(255, 59, 48)
|
||||
static public let blue = rgb(44, 174, 233)
|
||||
static public let yellow = rgb(254, 219, 6)
|
||||
static public let orange = rgb(255, 105, 0)
|
||||
static public let purple = rgb(128, 0, 128)
|
||||
static public let gold = rgb(226, 201, 127)
|
||||
static public let beige = rgb(245, 245, 220)
|
||||
static public let brand = rgb(255, 105, 0)
|
||||
static public let approveGreen = rgb(49, 183, 0)
|
||||
static public let darkBlue = rgb(74, 144, 226)
|
||||
static public let semidarkBlue = rgb(0, 107, 202)
|
||||
static public let darkGray = rgb(142, 142, 147)
|
||||
static public let lightYellow = rgb(254, 229, 6)
|
||||
|
||||
}
|
||||
@@ -0,0 +1,193 @@
|
||||
//
|
||||
// UIView+Positioning.swift
|
||||
//
|
||||
// Created by Shai Mishali on 1/19/15.
|
||||
// Copyright (c) 2015 Shai Mishali. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
public extension UIView {
|
||||
|
||||
// MARK: - Basic Properties
|
||||
|
||||
/// X Axis value of UIView.
|
||||
var x: CGFloat {
|
||||
set { self.frame = CGRect(x: _pixelIntegral(newValue),
|
||||
y: self.y,
|
||||
width: self.width,
|
||||
height: self.height)
|
||||
}
|
||||
get { return self.frame.origin.x }
|
||||
}
|
||||
|
||||
/// Y Axis value of UIView.
|
||||
var y: CGFloat {
|
||||
set { self.frame = CGRect(x: self.x,
|
||||
y: _pixelIntegral(newValue),
|
||||
width: self.width,
|
||||
height: self.height)
|
||||
}
|
||||
get { return self.frame.origin.y }
|
||||
}
|
||||
|
||||
/// Width of view.
|
||||
var width: CGFloat {
|
||||
set { self.frame = CGRect(x: self.x,
|
||||
y: self.y,
|
||||
width: _pixelIntegral(newValue),
|
||||
height: self.height)
|
||||
}
|
||||
get { return self.frame.size.width }
|
||||
}
|
||||
|
||||
/// Height of view.
|
||||
var height: CGFloat {
|
||||
set { self.frame = CGRect(x: self.x,
|
||||
y: self.y,
|
||||
width: self.width,
|
||||
height: _pixelIntegral(newValue))
|
||||
}
|
||||
get { return self.frame.size.height }
|
||||
}
|
||||
|
||||
// MARK: - Origin and Size
|
||||
|
||||
/// View's Origin point.
|
||||
var origin: CGPoint {
|
||||
set { self.frame = CGRect(x: _pixelIntegral(newValue.x),
|
||||
y: _pixelIntegral(newValue.y),
|
||||
width: self.width,
|
||||
height: self.height)
|
||||
}
|
||||
get { return self.frame.origin }
|
||||
}
|
||||
|
||||
/// View's size.
|
||||
var size: CGSize {
|
||||
set { self.frame = CGRect(x: self.x,
|
||||
y: self.y,
|
||||
width: _pixelIntegral(newValue.width),
|
||||
height: _pixelIntegral(newValue.height))
|
||||
}
|
||||
get { return self.frame.size }
|
||||
}
|
||||
|
||||
// MARK: - Extra Properties
|
||||
|
||||
/// View's right side (x + width).
|
||||
var right: CGFloat {
|
||||
set { self.x = newValue - self.width }
|
||||
get { return self.x + self.width }
|
||||
}
|
||||
|
||||
/// View's bottom (y + height).
|
||||
var bottom: CGFloat {
|
||||
set { self.y = newValue - self.height }
|
||||
get { return self.y + self.height }
|
||||
}
|
||||
|
||||
/// View's top (y).
|
||||
var top: CGFloat {
|
||||
set { self.y = newValue }
|
||||
get { return self.y }
|
||||
}
|
||||
|
||||
/// View's left side (x).
|
||||
var left: CGFloat {
|
||||
set { self.x = newValue }
|
||||
get { return self.x }
|
||||
}
|
||||
|
||||
/// View's center X value (center.x).
|
||||
var centerX: CGFloat {
|
||||
set { self.center = CGPoint(x: newValue, y: self.centerY) }
|
||||
get { return self.center.x }
|
||||
}
|
||||
|
||||
/// View's center Y value (center.y).
|
||||
var centerY: CGFloat {
|
||||
set { self.center = CGPoint(x: self.centerX, y: newValue) }
|
||||
get { return self.center.y }
|
||||
}
|
||||
|
||||
/// Last subview on X Axis.
|
||||
var lastSubviewOnX: UIView? {
|
||||
return self.subviews.reduce(UIView(frame: .zero)) {
|
||||
return $1.x > $0.x ? $1 : $0
|
||||
}
|
||||
}
|
||||
|
||||
/// Last subview on Y Axis.
|
||||
var lastSubviewOnY: UIView? {
|
||||
return self.subviews.reduce(UIView(frame: .zero)) {
|
||||
return $1.y > $0.y ? $1 : $0
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Bounds Methods
|
||||
|
||||
/// X value of bounds (bounds.origin.x).
|
||||
var boundsX: CGFloat {
|
||||
set { self.bounds = CGRect(x: _pixelIntegral(newValue),
|
||||
y: self.boundsY,
|
||||
width: self.boundsWidth,
|
||||
height: self.boundsHeight)
|
||||
}
|
||||
get { return self.bounds.origin.x }
|
||||
}
|
||||
|
||||
/// Y value of bounds (bounds.origin.y).
|
||||
var boundsY: CGFloat {
|
||||
set { self.frame = CGRect(x: self.boundsX,
|
||||
y: _pixelIntegral(newValue),
|
||||
width: self.boundsWidth,
|
||||
height: self.boundsHeight)
|
||||
}
|
||||
get { return self.bounds.origin.y }
|
||||
}
|
||||
|
||||
/// Width of bounds (bounds.size.width).
|
||||
var boundsWidth: CGFloat {
|
||||
set { self.frame = CGRect(x: self.boundsX,
|
||||
y: self.boundsY,
|
||||
width: _pixelIntegral(newValue),
|
||||
height: self.boundsHeight)
|
||||
}
|
||||
get { return self.bounds.size.width }
|
||||
}
|
||||
|
||||
/// Height of bounds (bounds.size.height).
|
||||
var boundsHeight: CGFloat {
|
||||
set { self.frame = CGRect(x: self.boundsX,
|
||||
y: self.boundsY,
|
||||
width: self.boundsWidth,
|
||||
height: _pixelIntegral(newValue))
|
||||
}
|
||||
get { return self.bounds.size.height }
|
||||
}
|
||||
|
||||
// MARK: - Useful Methods
|
||||
|
||||
/// Center view to it's parent view.
|
||||
// func centerToParent() {
|
||||
// guard let superview = self.superview else { return }
|
||||
//
|
||||
// switch UIApplication.shared.statusBarOrientation {
|
||||
// case .landscapeLeft, .landscapeRight:
|
||||
// self.origin = CGPoint(x: (superview.height / 2) - (self.width / 2),
|
||||
// y: (superview.width / 2) - (self.height / 2))
|
||||
// case .portrait, .portraitUpsideDown:
|
||||
// self.origin = CGPoint(x: (superview.width / 2) - (self.width / 2),
|
||||
// y: (superview.height / 2) - (self.height / 2))
|
||||
// case .unknown:
|
||||
// return
|
||||
// }
|
||||
// }
|
||||
|
||||
// MARK: - Private Methods
|
||||
fileprivate func _pixelIntegral(_ pointValue: CGFloat) -> CGFloat {
|
||||
let scale = UIScreen.main.scale
|
||||
return (round(pointValue * scale) / scale)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom": "iphone",
|
||||
"filename" : "appIcon-20@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom": "iphone",
|
||||
"filename" : "appIcon-20@3x.png",
|
||||
"scale": "3x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom": "ipad",
|
||||
"filename" : "appIcon-20.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom": "ipad",
|
||||
"filename" : "appIcon-20@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "appIcon-29@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "appIcon-29@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "appIcon-40@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "appIcon-40@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "appIcon-60@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "appIcon-60@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "appIcon-29.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "appIcon-29@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "appIcon-40.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "appIcon-40@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "appIcon-76.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "appIcon-76@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "83.5x83.5",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "appIcon-83.5@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "1024x1024",
|
||||
"idiom" : "ios-marketing",
|
||||
"filename" : "appIcon-1024.png",
|
||||
"scale" : "1x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 404 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 6.8 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 22 KiB |
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>UIApplicationSceneManifest</key>
|
||||
<dict>
|
||||
<key>UIApplicationSupportsMultipleScenes</key>
|
||||
<false/>
|
||||
<key>UISceneConfigurations</key>
|
||||
<dict>
|
||||
<key>UIWindowSceneSessionRoleApplication</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>UISceneConfigurationName</key>
|
||||
<string>Default Configuration</string>
|
||||
<key>UISceneDelegateClassName</key>
|
||||
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
|
||||
<key>UISceneStoryboardFile</key>
|
||||
<string>Main</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
<string>Main</string>
|
||||
<key>UIRequiredDeviceCapabilities</key>
|
||||
<array>
|
||||
<string>armv7</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,273 @@
|
||||
//
|
||||
// LocalizationManager.swift
|
||||
// KeyGroupFramework
|
||||
//
|
||||
// Created by Nikita Bondar on 22/11/2018.
|
||||
// Copyright © 2018 KeyGroup. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
extension Notification.Name {
|
||||
public static let kGTNotificationLanguageChanged = Notification.Name("kGTNotificationLanguageChanged")
|
||||
}
|
||||
|
||||
open class LocalizationManager {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
public private(set) static var locale: Locale = .current
|
||||
public static var availableLocales: [String] = ["en"]
|
||||
|
||||
private static var languageCode: String = ""
|
||||
private static var regionCode: String = ""
|
||||
private static var languageBundle: Bundle?
|
||||
private static var englishLanguageBundle = languageBundle(withCode: "en", andType: "lproj")
|
||||
private static var nakedLocalizationEnabled: Bool = false
|
||||
|
||||
// MARK: - Static part
|
||||
|
||||
public static func setNakedLocalization(to value: Bool) {
|
||||
nakedLocalizationEnabled = value
|
||||
NotificationCenter.default.post(name: .kGTNotificationLanguageChanged, object: nil)
|
||||
}
|
||||
|
||||
public static func format(key: String, values: [String]) -> String {
|
||||
if !nakedLocalizationEnabled {
|
||||
let key = _L(key)
|
||||
let formatCounter = key.components(separatedBy: "%@").count - 1
|
||||
if formatCounter != values.count {
|
||||
return "FORMAT ERROR: \(key) -\(values)"
|
||||
}
|
||||
|
||||
let args: [CVarArg] = values
|
||||
let formattedString = withVaList(args) { NSString(format: key, arguments: $0) } as String
|
||||
|
||||
return formattedString
|
||||
} else {
|
||||
return key
|
||||
}
|
||||
}
|
||||
|
||||
public static func localizedString(_ key: String) -> String {
|
||||
initLanguageCode()
|
||||
if !nakedLocalizationEnabled {
|
||||
let langCode = Locale.current.languageCode ?? "en"
|
||||
|
||||
// languageBundle = languageBundle(withCode: languageCode, andType: "lproj")
|
||||
languageBundle = languageBundle(withCode: langCode, andType: "lproj")
|
||||
|
||||
var val = languageBundle?.localizedString(forKey: key, value: key, table: nil)
|
||||
val = val?.replacingOccurrences(of: "%s", with: "%@")
|
||||
|
||||
if val == key {
|
||||
guard let englishString = englishLanguageBundle?.localizedString(forKey: key,
|
||||
value: key,
|
||||
table: nil) else { return key }
|
||||
return englishString.replacingOccurrences(of: "%s", with: "%@")
|
||||
}
|
||||
|
||||
return val ?? key
|
||||
} else {
|
||||
return key
|
||||
}
|
||||
}
|
||||
|
||||
public static func localizedTitleForCurrency(isoCode: String?) -> String {
|
||||
if let isoCode = isoCode {
|
||||
return self.currentLocale().displayName(forKey: .currencyCode, value: isoCode) ?? ""
|
||||
} else {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
public static func localizedString(forReplacedKey key: String) -> String {
|
||||
var replaced = localizedString(key)
|
||||
replaced = replaced.replacingOccurrences(of: "%s", with: "%@")
|
||||
return replaced
|
||||
}
|
||||
|
||||
public static func localizedString(forCount count: Float, key: String) -> String {
|
||||
initLanguageCode()
|
||||
|
||||
if !nakedLocalizationEnabled {
|
||||
let fewKey = localizedString(key.appending("_FEW"))
|
||||
let manyKey = localizedString(key.appending("S"))
|
||||
let singleKey = localizedString(key)
|
||||
|
||||
let countInt = Int(count)
|
||||
|
||||
if languageCode == "ru" {
|
||||
if count < 1 && count > 0 {
|
||||
return fewKey
|
||||
}
|
||||
|
||||
let mod100 = countInt % 100
|
||||
let mod10 = countInt % 10
|
||||
|
||||
switch mod10 {
|
||||
case 1: return mod100 == 11 ? manyKey : singleKey
|
||||
case 2, 3, 4: return mod100 > 10 && mod100 < 20 ? manyKey : fewKey
|
||||
case 5, 6, 7, 8, 9, 0: return manyKey
|
||||
default: return manyKey
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return count <= 1 ? singleKey : manyKey
|
||||
} else {
|
||||
return key
|
||||
}
|
||||
}
|
||||
|
||||
public static func currentLanguageName() -> String {
|
||||
initLanguageCode()
|
||||
return languageName(withCode: languageCode)
|
||||
}
|
||||
|
||||
public static func currentLanguageCode() -> String {
|
||||
initLanguageCode()
|
||||
return languageCode
|
||||
}
|
||||
|
||||
// class func currentCurrencyCode() -> String {
|
||||
// return ""
|
||||
// }
|
||||
|
||||
public static func currentRegionCode() -> String {
|
||||
let locale = Locale.current as NSLocale
|
||||
|
||||
if let country = locale.object(forKey: .countryCode) as? String {
|
||||
return country
|
||||
}
|
||||
|
||||
// writeToLog
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
public static func languageName(withCode code: String) -> String {
|
||||
let locale = NSLocale(localeIdentifier: code)
|
||||
let newCode = languageCode(withLocale: code)
|
||||
let language = locale.displayName(forKey: .identifier, value: newCode)
|
||||
return language ?? ""
|
||||
}
|
||||
|
||||
public static func countryName(withCode code: String) -> String {
|
||||
let locale = self.currentLocale()
|
||||
if #available(iOS 10.0, *) {
|
||||
// let name = locale.localizedString(forCurrencyCode: code)
|
||||
let name = locale.displayName(forKey: .countryCode, value: code)
|
||||
return name ?? ""
|
||||
} else {
|
||||
return ""
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static func currentLocale() -> NSLocale {
|
||||
initLanguageCode()
|
||||
let locale = NSLocale(localeIdentifier: languageCode)
|
||||
return locale
|
||||
}
|
||||
|
||||
public static func setCurrentLocale(code: String) {
|
||||
let code = code.lowercased()
|
||||
|
||||
guard languageCode != code else { return }
|
||||
guard availableLocales.contains(code) else { return }
|
||||
|
||||
let appleLanguages = code != "sys" ? [code] : []
|
||||
|
||||
UserDefaults.standard.set(appleLanguages, forKey: "AppleLanguages")
|
||||
UserDefaults.standard.synchronize()
|
||||
|
||||
languageCode = code
|
||||
self.regionCode = Locale.current.regionCode ?? ""
|
||||
languageBundle = languageBundle(withCode: languageCode, andType: "lproj")
|
||||
reinstallLocale(languageCode: languageCode, regionCode: regionCode, posix: Date.is12HourFormat)
|
||||
|
||||
NotificationCenter.default.post(name: .kGTNotificationLanguageChanged, object: nil)
|
||||
}
|
||||
|
||||
// MARK: - Private part
|
||||
|
||||
private static func initLanguageCode() {
|
||||
guard languageCode.isEmpty else { return }
|
||||
|
||||
let languageCodeArray = UserDefaults.standard.object(forKey: "AppleLanguages") as? [String] ?? []
|
||||
var code = languageCodeArray.count == 1 ? languageCodeArray[0] : Locale.preferredLanguages[0]
|
||||
|
||||
code = languageCode(withLocale: code)
|
||||
|
||||
if !availableLocales.contains(code) {
|
||||
code = "en"
|
||||
}
|
||||
|
||||
languageCode = code
|
||||
languageBundle = nil
|
||||
}
|
||||
|
||||
private static func languageCode(withLocale locale: String) -> String {
|
||||
var code = locale
|
||||
|
||||
if let range = code.range(of: "-") {
|
||||
let idx = NSRange(range, in: code).location
|
||||
code = String( code[0..<idx] )
|
||||
}
|
||||
|
||||
return code
|
||||
}
|
||||
|
||||
private static func languageBundle(withCode code: String, andType type: String) -> Bundle? {
|
||||
let path = Bundle.main.path(forResource: code, ofType: type)
|
||||
return Bundle(path: path ?? "")
|
||||
}
|
||||
|
||||
private static func reinstallLocale(languageCode: String, regionCode: String, posix: Bool = false) {
|
||||
var identifier = "\(languageCode.lowercased())_\(regionCode.uppercased())"
|
||||
if posix {
|
||||
identifier += "_POSIX"
|
||||
}
|
||||
locale = Locale(identifier: identifier)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension String {
|
||||
|
||||
subscript(value: CountableClosedRange<Int>) -> Substring {
|
||||
return self[index(at: value.lowerBound)...index(at: value.upperBound)]
|
||||
}
|
||||
|
||||
subscript(value: CountableRange<Int>) -> Substring {
|
||||
return self[index(at: value.lowerBound)..<index(at: value.upperBound)]
|
||||
}
|
||||
|
||||
subscript(value: PartialRangeUpTo<Int>) -> Substring {
|
||||
return self[..<index(at: value.upperBound)]
|
||||
}
|
||||
|
||||
subscript(value: PartialRangeThrough<Int>) -> Substring {
|
||||
return self[...index(at: value.upperBound)]
|
||||
}
|
||||
|
||||
subscript(value: PartialRangeFrom<Int>) -> Substring {
|
||||
return self[index(at: value.lowerBound)...]
|
||||
}
|
||||
|
||||
func index(at offset: Int) -> String.Index {
|
||||
return index(startIndex, offsetBy: offset)
|
||||
}
|
||||
}
|
||||
|
||||
extension Date {
|
||||
|
||||
static public var is12HourFormat: Bool {
|
||||
let locale = Locale.current
|
||||
let formatter = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: locale)
|
||||
|
||||
return formatter?.contains("a") ?? false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// LocalizeFuncs.swift
|
||||
// KeyGroupFramework
|
||||
//
|
||||
// Created by Nikita Bondar on 22/11/2018.
|
||||
// Copyright © 2018 KeyGroup. All rights reserved.
|
||||
//
|
||||
|
||||
public func _L(_ key: String) -> String {
|
||||
return LocalizationManager.localizedString(key)
|
||||
}
|
||||
|
||||
public func _LF(_ key: String, _ values: String...) -> String {
|
||||
return LocalizationManager.format(key: key, values: values)
|
||||
}
|
||||
|
||||
public func _LC(_ key: String, _ count: Int) -> String {
|
||||
return _LC(key, Float(count))
|
||||
}
|
||||
|
||||
public func _LC(_ key: String, _ count: Float) -> String {
|
||||
return LocalizationManager.localizedString(forCount: count, key: key)
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
|
||||
|
||||
"NSLocationWhenInUseUsageDescription" = "Your current location will be displayed on the map and used for directions, nearby search results, and estimated travel times.";
|
||||
|
||||
"NSLocationAlwaysUsageDescription" = "Your current location will be displayed on the map and used for directions, nearby search results, and estimated travel times.";
|
||||
|
||||
"NSLocationAlwaysAndWhenInUseUsageDescription" = "Your current location will be displayed on the map and used for directions, nearby search results, and estimated travel times.";
|
||||
|
||||
"NSLocationUsageDescription" = "Your current location will be displayed on the map and used for directions, nearby search results, and estimated travel times.";
|
||||
@@ -0,0 +1,88 @@
|
||||
|
||||
|
||||
"LNG_MAPS_SECTION_SEE_ALL" = "See All";
|
||||
"LNG_MAPS_SECTION_CLEAR" = "Clear";
|
||||
|
||||
"LNG_MAPS_RECENT_SEARCH" = "Recent Searches";
|
||||
"LNG_MAPS_RECENT_CITY" = "Moscow";
|
||||
|
||||
"LNG_MAPS_SECTION_FAVORITES" = "Favorites";
|
||||
"LNG_MAPS_SECTION_COLLECTIONS" = "Collections";
|
||||
"LNG_MAPS_SECTION_RECENTLY_VIEWED" = "Recently Viewed";
|
||||
|
||||
"LNG_MAPS_NEARBY_SEARCH" = "Search Nearby";
|
||||
"LNG_MAPS_NEARBY_RESTAURANTS" = "Restaurants";
|
||||
"LNG_MAPS_NEARBY_FOOD_DELIVERY" = "Food Delivery";
|
||||
"LNG_MAPS_NEARBY_GROCERIES" = "Groceries";
|
||||
"LNG_MAPS_NEARBY_GAS_STATION" = "Gas Station";
|
||||
"LNG_MAPS_NEARBY_PHARMACIES" = "Pharmacies";
|
||||
"LNG_MAPS_NEARBY_HOSPITALS" = "Hospitals";
|
||||
"LNG_MAPS_NEARBY_URGENT_CARE" = "Urgent Care";
|
||||
"LNG_MAPS_NEARBY_SUBWAY" = "Subway";
|
||||
"LNG_MAPS_NEARBY_TRAIN_STATION" = "Train Station";
|
||||
"LNG_MAPS_NEARBY_SHOPPING_CENTERS" = "Shopping Centers";
|
||||
|
||||
"LNG_MAPS_NEW_COLLECTION" = "New Collection...";
|
||||
"LNG_MAPS_SEARCH_PLACE_ADDRESS" = "Search for a place or address";
|
||||
|
||||
"LNG_MAPS_MARKED_LOCATION" = "Marked Location";
|
||||
"LNG_MAPS_DIRECTIONS_MY_LOCATION" = "Directions from My Location";
|
||||
|
||||
"LNG_MAPS_KM" = "km";
|
||||
"LNG_MAPS_TO" = "to";
|
||||
"LNG_MAPS_MIN" = "min";
|
||||
|
||||
"LNG_MAPS_COUNTRY" = "Country";
|
||||
"LNG_MAPS_ADDRESS" = "Address";
|
||||
"LNG_MAPS_STREET" = "Street";
|
||||
"LNG_MAPS_CITY" = "City";
|
||||
"LNG_MAPS_HOME" = "Home";
|
||||
"LNG_MAPS_ADD" = "Add";
|
||||
"LNG_MAPS_SCORE" = "Score";
|
||||
"LNG_MAPS_WORK" = "Work";
|
||||
"LNG_MAPS_REMOVE" = "Remove";
|
||||
"LNG_MAPS_SHARE" = "Share";
|
||||
|
||||
|
||||
"LNG_MAPS_LOCATION_DIRECTIONS" = "Directions";
|
||||
"LNG_MAPS_LOCATION_EDIT" = "Edit Location";
|
||||
|
||||
"LNG_MAPS_LOCATION_LATITUDE" = "Latitude";
|
||||
"LNG_MAPS_LOCATION_LONGITUDE" = "Longitude";
|
||||
|
||||
"LNG_MAPS_LOCATION_ADD_TO_FAVORITES" = "Add to Favorites";
|
||||
"LNG_MAPS_LOCATION_CREATE_NEW_CONTACT" = "Create New Contact";
|
||||
"LNG_MAPS_LOCATION_ADD_TO_EXISTING_CONTACT" = "Add to Existing Contact";
|
||||
"LNG_MAPS_LOCATION_ADD_A_MISSING_PLACE" = "Add a Missing Place";
|
||||
|
||||
|
||||
|
||||
"LNG_MAPS_HR" = "hr";
|
||||
"LNG_MAPS_WHERE" = "To";
|
||||
"LNG_MAPS_FROM" = "From";
|
||||
"LNG_MAPS_MY_LOCATION" = "My Location";
|
||||
|
||||
"LNG_MAPS_GO" = "GO";
|
||||
"LNG_MAPS_SECTION_DRIVING_OPTIONS" = "Driving Options";
|
||||
"LNG_MAPS_SECTION_REPORT_AN_ISSUE" = "Report an Issue";
|
||||
|
||||
"LNG_MAPS_DRIVE" = "Drive";
|
||||
"LNG_MAPS_WALK" = "Walk";
|
||||
"LNG_MAPS_TRANSIT" = "Transit";
|
||||
"LNG_MAPS_RIDE" = "Ride";
|
||||
|
||||
"LNG_MAPS_LOADING" = "Loading...";
|
||||
|
||||
"LNG_MAPS_MENU_MAPS_SETTINGS" = "Maps Settings";
|
||||
"LNG_MAPS_MENU_MAP" = "Map";
|
||||
"LNG_MAPS_MENU_SATELLITE" = "Satellite";
|
||||
"LNG_MAPS_MENU_TRAFFIC" = "Traffic";
|
||||
"LNG_MAPS_SECTION_MARK_MY_LOCATION" = "Mark My Location";
|
||||
|
||||
"LNG_ROUTE_FASTEST" = "Fastest route";
|
||||
"LNG_ROUTE_SIMPLEST" = "Simplest route";
|
||||
|
||||
"LNG_ROUTE_UNKNOWN" = "unknown";
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
|
||||
"NSLocationWhenInUseUsageDescription" = "Ваша текущая геопозиция будет отображена на карте и использована для предоставления маршрутов, поиска мест рядом и расчета приблизительного времени в пути.";
|
||||
|
||||
"NSLocationAlwaysUsageDescription" = "Ваша текущая геопозиция будет отображена на карте и использована для предоставления маршрутов, поиска мест рядом и расчета приблизительного времени в пути.";
|
||||
|
||||
"NSLocationAlwaysAndWhenInUseUsageDescription" = "Ваша текущая геопозиция будет отображена на карте и использована для предоставления маршрутов, поиска мест рядом и расчета приблизительного времени в пути.";
|
||||
|
||||
"NSLocationUsageDescription" = "Ваша текущая геопозиция будет отображена на карте и использована для предоставления маршрутов, поиска мест рядом и расчета приблизительного времени в пути.";
|
||||
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
|
||||
|
||||
"LNG_MAPS_SECTION_SEE_ALL" = "См. все";
|
||||
"LNG_MAPS_SECTION_CLEAR" = "Очистить";
|
||||
|
||||
"LNG_MAPS_RECENT_SEARCH" = "Недавние поиски";
|
||||
"LNG_MAPS_RECENT_CITY" = "Москва";
|
||||
|
||||
"LNG_MAPS_SECTION_FAVORITES" = "Избранное";
|
||||
"LNG_MAPS_SECTION_COLLECTIONS" = "Коллекции";
|
||||
"LNG_MAPS_SECTION_RECENTLY_VIEWED" = "Недавно просмотренные";
|
||||
|
||||
"LNG_MAPS_NEARBY_SEARCH" = "Поиск рядом";
|
||||
"LNG_MAPS_NEARBY_RESTAURANTS" = "Рестораны";
|
||||
"LNG_MAPS_NEARBY_FOOD_DELIVERY" = "Доставка еды";
|
||||
"LNG_MAPS_NEARBY_GROCERIES" = "Продукты";
|
||||
"LNG_MAPS_NEARBY_GAS_STATION" = "АЗС";
|
||||
"LNG_MAPS_NEARBY_PHARMACIES" = "Аптека";
|
||||
"LNG_MAPS_NEARBY_HOSPITALS" = "Больницы";
|
||||
"LNG_MAPS_NEARBY_URGENT_CARE" = "Пункт скорой помощи";
|
||||
"LNG_MAPS_NEARBY_SUBWAY" = "Метро";
|
||||
"LNG_MAPS_NEARBY_TRAIN_STATION" = "Ж/д станции";
|
||||
"LNG_MAPS_NEARBY_SHOPPING_CENTERS" = "Торговые центры";
|
||||
|
||||
"LNG_MAPS_NEW_COLLECTION" = "Новая коллекция...";
|
||||
"LNG_MAPS_SEARCH_PLACE_ADDRESS" = "Поиск места или адреса";
|
||||
|
||||
"LNG_MAPS_MARKED_LOCATION" = "Отмеченная геопозиция";
|
||||
"LNG_MAPS_DIRECTIONS_MY_LOCATION" = "Маршруты из моей геопозиции";
|
||||
|
||||
"LNG_MAPS_KM" = "км";
|
||||
"LNG_MAPS_TO" = "в";
|
||||
"LNG_MAPS_MIN" = "мин";
|
||||
|
||||
"LNG_MAPS_COUNTRY" = "Страна";
|
||||
"LNG_MAPS_ADDRESS" = "Адрес";
|
||||
"LNG_MAPS_STREET" = "Улица";
|
||||
"LNG_MAPS_CITY" = "Город";
|
||||
"LNG_MAPS_HOME" = "Дом";
|
||||
"LNG_MAPS_ADD" = "Добавить";
|
||||
"LNG_MAPS_SCORE" = "Магазин";
|
||||
"LNG_MAPS_WORK" = "Работа";
|
||||
"LNG_MAPS_REMOVE" = "Удалить";
|
||||
"LNG_MAPS_SHARE" = "Поделиться";
|
||||
|
||||
|
||||
"LNG_MAPS_LOCATION_DIRECTIONS" = "Маршруты";
|
||||
"LNG_MAPS_LOCATION_EDIT" = "Изменить геопозицию";
|
||||
|
||||
"LNG_MAPS_LOCATION_LATITUDE" = "Широта";
|
||||
"LNG_MAPS_LOCATION_LONGITUDE" = "Долгота";
|
||||
|
||||
"LNG_MAPS_LOCATION_ADD_TO_FAVORITES" = "Добавить в Избранное";
|
||||
"LNG_MAPS_LOCATION_CREATE_NEW_CONTACT" = "Создать контакт";
|
||||
"LNG_MAPS_LOCATION_ADD_TO_EXISTING_CONTACT" = "Добавить к контакту";
|
||||
"LNG_MAPS_LOCATION_ADD_A_MISSING_PLACE" = "Добавить отсутствующее место";
|
||||
|
||||
|
||||
|
||||
"LNG_MAPS_HR" = "ч";
|
||||
"LNG_MAPS_WHERE" = "Куда:";
|
||||
"LNG_MAPS_FROM" = "Откуда:";
|
||||
"LNG_MAPS_MY_LOCATION" = "Моя геолокация";
|
||||
|
||||
"LNG_MAPS_GO" = "Начать";
|
||||
"LNG_MAPS_SECTION_DRIVING_OPTIONS" = "Параметры для автомаршрута";
|
||||
"LNG_MAPS_SECTION_REPORT_AN_ISSUE" = "Сообщить о проблеме";
|
||||
|
||||
"LNG_MAPS_DRIVE" = "Автомобиль";
|
||||
"LNG_MAPS_WALK" = "Пешком";
|
||||
"LNG_MAPS_TRANSIT" = "Транспорт";
|
||||
"LNG_MAPS_RIDE" = "Поездка";
|
||||
|
||||
"LNG_MAPS_LOADING" = "Загрузка...";
|
||||
|
||||
"LNG_MAPS_MENU_MAPS_SETTINGS" = "Настройки Карт";
|
||||
"LNG_MAPS_MENU_MAP" = "Карта";
|
||||
"LNG_MAPS_MENU_SATELLITE" = "Спутник";
|
||||
"LNG_MAPS_MENU_TRAFFIC" = "Пробки";
|
||||
"LNG_MAPS_SECTION_MARK_MY_LOCATION" = "Отметить мою геопозицию";
|
||||
|
||||
"LNG_ROUTE_FASTEST" = "Самый быстрый";
|
||||
"LNG_ROUTE_SIMPLEST" = "Самый простой маршрут";
|
||||
|
||||
"LNG_ROUTE_UNKNOWN" = "неизвестно";
|
||||
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
//
|
||||
// LocationContainerController.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 04/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
class LocationContainerController: ContainerController, ContainerControllerDelegate {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
var locationDelegate: LocationContainerControllerDelegate?
|
||||
|
||||
var tableView: TableAdapterView!
|
||||
var items: [TableAdapterItem] = []
|
||||
|
||||
var darkStyle: Bool = false
|
||||
|
||||
var header: HeaderDetailsView!
|
||||
|
||||
// MARK: - Init
|
||||
|
||||
public init(addTo controller: UIViewController, darkStyle: Bool) {
|
||||
super.init(addTo: controller,
|
||||
layout: MapsMainContainerLayout())
|
||||
|
||||
self.darkStyle = darkStyle
|
||||
|
||||
self.delegate = self
|
||||
|
||||
loadItems()
|
||||
updateTableView()
|
||||
updateContainerView()
|
||||
updateHeaderView()
|
||||
|
||||
add(scrollView: tableView)
|
||||
add(headerView: header)
|
||||
}
|
||||
|
||||
// MARK: - Delegate
|
||||
|
||||
func containerControllerMove(_ controller: ContainerController, position: CGFloat, type: ContainerMoveType, animation: Bool) {
|
||||
locationDelegate?.locationContainerController(move: self, position: position, type: type, animation: animation)
|
||||
}
|
||||
|
||||
//MARK: - Update Container-View
|
||||
|
||||
func updateContainerView() {
|
||||
|
||||
view.addBlur(darkStyle: darkStyle)
|
||||
view.cornerRadius = 12
|
||||
view.addShadow()
|
||||
}
|
||||
|
||||
//MARK: - Update Container-View
|
||||
|
||||
func updateHeaderView() {
|
||||
|
||||
header = HeaderDetailsView()
|
||||
header.height = 60
|
||||
header.titleLabel.text = _L("LNG_MAPS_MARKED_LOCATION")
|
||||
header.subtitle.text = "27 \(_L("LNG_MAPS_KM"))"
|
||||
header.add(darkStyle: darkStyle)
|
||||
header.buttonCloseClickCallback = { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
|
||||
_self.remove(completion: { [weak self] in
|
||||
guard let __self = self else { return }
|
||||
|
||||
_self.locationDelegate?.locationContainerController(closeComplection: __self)
|
||||
})
|
||||
_self.locationDelegate?.locationContainerController(close: _self)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Update DarkStyle
|
||||
|
||||
func update(darkStyle: Bool) {
|
||||
|
||||
self.darkStyle = darkStyle
|
||||
view.addBlur(darkStyle: darkStyle)
|
||||
header.add(darkStyle: darkStyle)
|
||||
|
||||
loadItems()
|
||||
tableView.indicatorStyle = darkStyle ? .white : .default
|
||||
tableView.set(items: items, animated: true)
|
||||
}
|
||||
|
||||
//MARK: - Update TableView
|
||||
|
||||
func updateTableView() {
|
||||
|
||||
tableView = TableAdapterView(frame: CGRect(x: 0, y: 0, width: ContainerDevice.width, height: 0), style: .plain)
|
||||
tableView.indicatorStyle = darkStyle ? .white : .default
|
||||
tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: ContainerDevice.width, height: 18))
|
||||
tableView.set(items: items, animated: true)
|
||||
|
||||
tableView.didScrollCallback = { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
|
||||
_self.header.separatorView?.alpha = (_self.tableView.contentOffset.y <= 0) ? 0.0 : 1.0
|
||||
}
|
||||
tableView.separatorColor = Colors.rgba(128, 128, 128, 0.6)
|
||||
}
|
||||
|
||||
func loadItems() {
|
||||
|
||||
items = []
|
||||
|
||||
|
||||
|
||||
items.append( LocationButtonCellItem(title: _L("LNG_MAPS_LOCATION_DIRECTIONS"),
|
||||
subtitle: "25 \(_L("LNG_MAPS_MIN")) drive",
|
||||
type: .blue, clickCallback: { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
|
||||
_self.presentRoute()
|
||||
}) )
|
||||
items.append( LocationButtonCellItem(title: _L("LNG_MAPS_LOCATION_EDIT"), type: .gray) )
|
||||
|
||||
items.append( LocationAddressCellItem(darkStyle: darkStyle) )
|
||||
items.append( LocationCollectionsButtonCellItem() )
|
||||
items.append( LocationCoordinateCellItem(darkStyle: darkStyle) )
|
||||
|
||||
items.append( LocationTextCellItem(title: _L("LNG_MAPS_LOCATION_ADD_TO_FAVORITES"), image: UIImage(systemName: "star.fill")) )
|
||||
items.append( LocationTextCellItem(title: _L("LNG_MAPS_LOCATION_CREATE_NEW_CONTACT"), image: UIImage(systemName: "person.crop.circle")) )
|
||||
items.append( LocationTextCellItem(title: _L("LNG_MAPS_LOCATION_ADD_TO_EXISTING_CONTACT"), image: UIImage(systemName: "person.crop.circle.badge.plus")) )
|
||||
items.append( LocationTextCellItem(title: _L("LNG_MAPS_LOCATION_ADD_A_MISSING_PLACE"), image: UIImage(systemName: "plus")) )
|
||||
|
||||
}
|
||||
|
||||
//MARK: - Show Route
|
||||
|
||||
func presentRoute() {
|
||||
locationDelegate?.locationContainerController(showRoute: self)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
//
|
||||
// LocationContainerControllerDelegate.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 26/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
protocol LocationContainerControllerDelegate {
|
||||
|
||||
func locationContainerController(showRoute locationContainerController: LocationContainerController)
|
||||
|
||||
func locationContainerController(close locationContainerController: LocationContainerController)
|
||||
|
||||
func locationContainerController(closeComplection locationContainerController: LocationContainerController)
|
||||
|
||||
func locationContainerController(move locationContainerController: LocationContainerController, position: CGFloat, type: ContainerMoveType, animation: Bool)
|
||||
}
|
||||
@@ -0,0 +1,206 @@
|
||||
//
|
||||
// MapsContainerController.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 04/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
class MapsContainerController: ContainerController, ContainerControllerDelegate {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
var mapsDelegate: MapsContainerControllerDelegate?
|
||||
|
||||
var tableView: TableAdapterView!
|
||||
var items: [TableAdapterItem] = []
|
||||
|
||||
var darkStyle: Bool = false
|
||||
var searchSelected: Bool = false
|
||||
|
||||
var headerSearchBarView: HeaderSearchBarView!
|
||||
|
||||
// MARK: - Init
|
||||
|
||||
public init(addTo controller: UIViewController, darkStyle: Bool) {
|
||||
super.init(addTo: controller,
|
||||
layout: MapsMainContainerLayout())
|
||||
|
||||
self.darkStyle = darkStyle
|
||||
|
||||
self.delegate = self
|
||||
|
||||
loadItems()
|
||||
updateTableView()
|
||||
updateContainerView()
|
||||
updateHeaderView()
|
||||
|
||||
add(scrollView: tableView)
|
||||
add(headerView: headerSearchBarView)
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Delegate
|
||||
|
||||
func containerControllerMove(_ controller: ContainerController, position: CGFloat, type: ContainerMoveType, animation: Bool) {
|
||||
|
||||
mapsDelegate?.mapsContainerController(move: self, position: position, type: type, animation: animation)
|
||||
|
||||
if animation, type != .top {
|
||||
headerSearchBarView.searchBar.setShowsCancelButton(false, animated: true)
|
||||
updateTableView(searchSelected: false)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Update Container-View
|
||||
|
||||
func updateContainerView() {
|
||||
|
||||
view.addBlur(darkStyle: darkStyle)
|
||||
view.cornerRadius = 12
|
||||
view.addShadow()
|
||||
}
|
||||
|
||||
//MARK: - Update Container-View
|
||||
|
||||
func updateHeaderView() {
|
||||
|
||||
headerSearchBarView = HeaderSearchBarView()
|
||||
headerSearchBarView.searchBarBeginEditingCallback = { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
|
||||
_self.updateTableView(searchSelected: true)
|
||||
_self.move(type: .top)
|
||||
}
|
||||
headerSearchBarView.searchBarCancelButtonClickedCallback = { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
|
||||
_self.controller?.view.endEditing(true)
|
||||
_self.updateTableView(searchSelected: false)
|
||||
_self.move(type: .middle)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Update DarkStyle
|
||||
|
||||
func update(darkStyle: Bool) {
|
||||
|
||||
self.darkStyle = darkStyle
|
||||
|
||||
headerSearchBarView.set(darkStyle: darkStyle)
|
||||
|
||||
view.addBlur(darkStyle: darkStyle)
|
||||
|
||||
|
||||
loadItems()
|
||||
tableView.indicatorStyle = darkStyle ? .white : .default
|
||||
tableView.set(items: items, animated: true)
|
||||
}
|
||||
|
||||
func updateTableView(searchSelected: Bool) {
|
||||
if self.searchSelected == searchSelected { return }
|
||||
|
||||
self.searchSelected = searchSelected
|
||||
|
||||
loadItems()
|
||||
tableView.indicatorStyle = darkStyle ? .white : .default
|
||||
tableView.set(items: items, animated: true)
|
||||
}
|
||||
|
||||
//MARK: - Update TableView
|
||||
|
||||
func updateTableView() {
|
||||
|
||||
tableView = TableAdapterView()
|
||||
tableView.indicatorStyle = darkStyle ? .white : .default
|
||||
tableView.set(items: items, animated: true)
|
||||
tableView.selectIndexCallback = { [weak self] (index: Int) -> Void in
|
||||
guard let _self = self, _self.items[index] is MapsLocationCellItem else { return }
|
||||
|
||||
_self.showLocationDetails()
|
||||
}
|
||||
tableView.didScrollCallback = { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
|
||||
_self.controller?.view.endEditing(true)
|
||||
// let state = _self.tableView.panGestureRecognizer.state
|
||||
// print("\(state)")
|
||||
//
|
||||
// switch _self.tableView.panGestureRecognizer.state {
|
||||
// case .began:
|
||||
// default: break
|
||||
// }
|
||||
|
||||
_self.headerSearchBarView.separatorView?.alpha = (_self.tableView.contentOffset.y <= 0) ? 0.0 : 1.0
|
||||
}
|
||||
tableView.separatorColor = Colors.rgba(128, 128, 128, 0.6)
|
||||
}
|
||||
|
||||
func loadItems() {
|
||||
|
||||
items = []
|
||||
|
||||
if searchSelected {
|
||||
|
||||
let orange: UIColor = Colors.rgb(248, 149, 64)
|
||||
let yellow: UIColor = Colors.rgb(255, 179, 0)
|
||||
let blue: UIColor = Colors.rgb(29, 160, 255)
|
||||
let red: UIColor = Colors.rgb(255, 93, 90)
|
||||
|
||||
|
||||
items.append( MapsSectionCellItem(title: _L("LNG_MAPS_RECENT_SEARCH"), textButton: _L("LNG_MAPS_SECTION_SEE_ALL")) )
|
||||
|
||||
items.append( MapsSearchCellItem(darkStyle: darkStyle, title: _L("LNG_MAPS_RECENT_CITY"), color: .clear, separator: false) )
|
||||
|
||||
items.append( MapsSectionCellItem(title: _L("LNG_MAPS_NEARBY_SEARCH"), textButton: "") )
|
||||
|
||||
items.append( MapsSearchCellItem(darkStyle: darkStyle, title: _L("LNG_MAPS_NEARBY_RESTAURANTS"), color: orange) )
|
||||
items.append( MapsSearchCellItem(darkStyle: darkStyle, title: _L("LNG_MAPS_NEARBY_FOOD_DELIVERY"), color: orange) )
|
||||
items.append( MapsSearchCellItem(darkStyle: darkStyle, title: _L("LNG_MAPS_NEARBY_GROCERIES"), color: yellow) )
|
||||
items.append( MapsSearchCellItem(darkStyle: darkStyle, title: _L("LNG_MAPS_NEARBY_GAS_STATION"), color: blue) )
|
||||
items.append( MapsSearchCellItem(darkStyle: darkStyle, title: _L("LNG_MAPS_NEARBY_PHARMACIES"), color: red) )
|
||||
items.append( MapsSearchCellItem(darkStyle: darkStyle, title: _L("LNG_MAPS_NEARBY_HOSPITALS"), color: red) )
|
||||
items.append( MapsSearchCellItem(darkStyle: darkStyle, title: _L("LNG_MAPS_NEARBY_URGENT_CARE"), color: red) )
|
||||
items.append( MapsSearchCellItem(darkStyle: darkStyle, title: _L("LNG_MAPS_NEARBY_SUBWAY"), color: blue) )
|
||||
items.append( MapsSearchCellItem(darkStyle: darkStyle, title: _L("LNG_MAPS_NEARBY_TRAIN_STATION"), color: blue) )
|
||||
items.append( MapsSearchCellItem(darkStyle: darkStyle, title: _L("LNG_MAPS_NEARBY_SHOPPING_CENTERS"), color: yellow) )
|
||||
|
||||
} else {
|
||||
|
||||
items.append( MapsSectionCellItem(title: _L("LNG_MAPS_SECTION_FAVORITES")) )
|
||||
items.append( MapsFavoritesCellItem(darkStyle: darkStyle, clickCallback: { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
|
||||
_self.showLocationDetails()
|
||||
}) )
|
||||
|
||||
items.append( MapsSectionCellItem(title: _L("LNG_MAPS_SECTION_COLLECTIONS")) )
|
||||
items.append( MapsCollectionsCellItem() )
|
||||
|
||||
items.append( MapsSectionCellItem(title: _L("LNG_MAPS_SECTION_RECENTLY_VIEWED")) )
|
||||
|
||||
for index in 1...7 {
|
||||
let title = String(format: "%@ %d", _L("LNG_MAPS_MARKED_LOCATION"), index)
|
||||
let subtitle = String(format: "%@, %d/2, %@", _L("LNG_MAPS_STREET"), index, _L("LNG_MAPS_CITY"))
|
||||
items.append( MapsLocationCellItem(title: title, subtitle: subtitle, colorType: .red, darkStyle: darkStyle) )
|
||||
}
|
||||
for index in 8...11 {
|
||||
let title = String(format: "%@ %d", _L("LNG_MAPS_MARKED_LOCATION"), index)
|
||||
let subtitle = _L("LNG_MAPS_DIRECTIONS_MY_LOCATION")
|
||||
items.append( MapsLocationCellItem(title: title, subtitle: subtitle, colorType: .black, darkStyle: darkStyle) )
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Show Location-Details
|
||||
|
||||
func showLocationDetails() {
|
||||
|
||||
mapsDelegate?.mapsContainerController(showLocationDetails: self)
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
//
|
||||
// MapsContainerControllerDelegate.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 25/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
protocol MapsContainerControllerDelegate {
|
||||
|
||||
func mapsContainerController(showLocationDetails mapsContainerController: MapsContainerController)
|
||||
|
||||
func mapsContainerController(move mapsContainerController: MapsContainerController, position: CGFloat, type: ContainerMoveType, animation: Bool)
|
||||
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
//
|
||||
// LocationContainerController.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 04/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
class MenuContainerController: ContainerController, ContainerControllerDelegate {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
var menuDelegate: MenuContainerControllerDelegate?
|
||||
|
||||
var tableView: TableAdapterView!
|
||||
var items: [TableAdapterItem] = []
|
||||
var header: MapsMenuHeader!
|
||||
|
||||
var selectedIndex: Int = 0
|
||||
var darkStyle: Bool = false
|
||||
|
||||
// MARK: - Init
|
||||
|
||||
public init(addTo controller: UIViewController, darkStyle: Bool, selectedIndex: Int) {
|
||||
super.init(addTo: controller,
|
||||
layout: MapsMenuContainerLayout())
|
||||
|
||||
self.darkStyle = darkStyle
|
||||
self.selectedIndex = selectedIndex
|
||||
|
||||
self.delegate = self
|
||||
|
||||
loadItems()
|
||||
updateTableView()
|
||||
updateContainerView()
|
||||
updateHeaderView()
|
||||
|
||||
add(scrollView: tableView)
|
||||
add(headerView: header)
|
||||
|
||||
move(type: .top)
|
||||
}
|
||||
|
||||
// MARK: - Delegate
|
||||
|
||||
func containerControllerShadowClick(_ containerController: ContainerController) {
|
||||
closeContainer()
|
||||
}
|
||||
|
||||
func closeContainer() {
|
||||
remove(completion: { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
_self.menuDelegate?.menuContainerController(closeComplection: _self)
|
||||
})
|
||||
menuDelegate?.menuContainerController(close: self)
|
||||
}
|
||||
|
||||
//MARK: - Update Container-View
|
||||
|
||||
func updateContainerView() {
|
||||
|
||||
view.addBlur(darkStyle: darkStyle)
|
||||
view.cornerRadius = 12
|
||||
view.addShadow()
|
||||
}
|
||||
|
||||
//MARK: - Update Container-View
|
||||
|
||||
func updateHeaderView() {
|
||||
|
||||
header = MapsMenuHeader()
|
||||
|
||||
header.set(darkStyle: darkStyle)
|
||||
header.buttonCloseClickCallback = { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
_self.closeContainer()
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Update TableView
|
||||
|
||||
func updateTableView() {
|
||||
|
||||
tableView = TableAdapterView(frame: CGRect(x: 0, y: 0, width: ContainerDevice.width, height: 0), style: .plain)
|
||||
tableView.set(items: items, animated: true)
|
||||
tableView.separatorColor = Colors.rgba(128, 128, 128, 0.6)
|
||||
}
|
||||
|
||||
|
||||
func loadItems() {
|
||||
|
||||
items = []
|
||||
|
||||
items.append( MapsMenuSegmentCellItem(selected: selectedIndex, darkStyle: darkStyle, selectIndexCallback: { [weak self] (_ index: Int) in
|
||||
guard let _self = self else { return }
|
||||
|
||||
_self.selectedIndex = index
|
||||
|
||||
_self.menuDelegate?.menuContainerController(segment: _self, selectedIndex: index)
|
||||
|
||||
_self.darkStyle = (index == 2)
|
||||
|
||||
_self.view.addBlur(darkStyle: _self.darkStyle)
|
||||
_self.header.set(darkStyle: _self.darkStyle)
|
||||
|
||||
_self.loadItems()
|
||||
_self.tableView.set(items: _self.items, animated: true)
|
||||
}) )
|
||||
|
||||
items.append( MapsMenuTextCellItem(title: _L("LNG_MAPS_MENU_TRAFFIC"), switchShow: true, darkStyle: darkStyle, separator: false) )
|
||||
|
||||
items.append( MapsMenuSpaceCellItem() )
|
||||
|
||||
items.append( MapsMenuTextCellItem(title: _L("LNG_MAPS_SECTION_MARK_MY_LOCATION")) )
|
||||
items.append( MapsMenuTextCellItem(title: _L("LNG_MAPS_LOCATION_ADD_A_MISSING_PLACE")) )
|
||||
items.append( MapsMenuTextCellItem(title: _L("LNG_MAPS_SECTION_REPORT_AN_ISSUE"), separator: false) )
|
||||
|
||||
items.append( MapsMenuSpaceCellItem() )
|
||||
// items.append( MapsMenuSpaceCellItem(cellHeight: 100) )
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
//
|
||||
// MenuContainerControllerDelegate.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 26/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
protocol MenuContainerControllerDelegate {
|
||||
|
||||
func menuContainerController(close menuContainerController: MenuContainerController)
|
||||
|
||||
func menuContainerController(closeComplection menuContainerController: MenuContainerController)
|
||||
|
||||
func menuContainerController(segment menuContainerController: MenuContainerController, selectedIndex: Int)
|
||||
}
|
||||
@@ -0,0 +1,181 @@
|
||||
//
|
||||
// LocationContainerController.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 04/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
open class RouteContainerController: ContainerController, ContainerControllerDelegate {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
var routeDelegate: RouteContainerControllerDelegate?
|
||||
|
||||
var tableView: TableAdapterView!
|
||||
var items: [TableAdapterItem] = []
|
||||
|
||||
var darkStyle: Bool = false
|
||||
|
||||
var tabbar: HeaderTabBarView!
|
||||
var header: HeaderDetailsView!
|
||||
var tableHeader: TableHeaderSpinerView?
|
||||
var routeLayout: MapsRouteContainerLayout
|
||||
|
||||
// MARK: - Init
|
||||
|
||||
public init(addTo controller: UIViewController, darkStyle: Bool) {
|
||||
|
||||
routeLayout = MapsRouteContainerLayout()
|
||||
|
||||
super.init(addTo: controller,
|
||||
layout: routeLayout)
|
||||
|
||||
self.darkStyle = darkStyle
|
||||
|
||||
self.delegate = self
|
||||
|
||||
loadTableItems()
|
||||
loadTableView()
|
||||
|
||||
loadContainerView()
|
||||
loadHeaderView()
|
||||
loadTabBarBottom()
|
||||
|
||||
add(scrollView: tableView)
|
||||
add(headerView: header)
|
||||
add(footerView: tabbar)
|
||||
}
|
||||
|
||||
// MARK: - Delegate
|
||||
|
||||
public func containerControllerMove(_ controller: ContainerController, position: CGFloat, type: ContainerMoveType, animation: Bool) {
|
||||
routeDelegate?.routeContainerController(move: self, position: position, type: type, animation: animation)
|
||||
|
||||
if let tableHeader = tableHeader {
|
||||
|
||||
if animation {
|
||||
UIView.animate(withDuration: 0.55, animations: { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
|
||||
switch type {
|
||||
case .top: tableHeader.height = (ContainerDevice.height - (_self.layout.positions.top + _self.header.height + _self.tabbar.height))
|
||||
case .middle: tableHeader.height = MapsRouteCellData.height()
|
||||
case .bottom: tableHeader.height = 0.0
|
||||
default: break
|
||||
}
|
||||
})
|
||||
|
||||
} else {
|
||||
tableHeader.height = tableView.height
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Update Container-View
|
||||
|
||||
func loadContainerView() {
|
||||
|
||||
view.addBlur(darkStyle: darkStyle)
|
||||
view.cornerRadius = 12
|
||||
view.addShadow()
|
||||
}
|
||||
|
||||
//MARK: - Update Container-View
|
||||
|
||||
func loadTabBarBottom() {
|
||||
|
||||
tabbar = HeaderTabBarView()
|
||||
tabbar.height = (49.0 + ContainerDevice.isIphoneXBottom)
|
||||
tabbar.addBlur(darkStyle: darkStyle)
|
||||
|
||||
}
|
||||
|
||||
func loadHeaderView() {
|
||||
|
||||
header = HeaderDetailsView()
|
||||
header.height = 78
|
||||
header.separatorView?.alpha = 1.0
|
||||
header.titleLabel.text = "\(_L("LNG_MAPS_WHERE")) \(_L("LNG_MAPS_MARKED_LOCATION"))"
|
||||
header.subtitle.text = _L("LNG_MAPS_FROM")
|
||||
header.textButton.setTitle(_L("LNG_MAPS_MY_LOCATION"), for: .normal)
|
||||
header.add(darkStyle: darkStyle)
|
||||
header.buttonCloseClickCallback = { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
|
||||
if let tab = _self.tabbar {
|
||||
tab.removeFromSuperview()
|
||||
}
|
||||
_self.remove(completion: { [weak self] in
|
||||
guard let __self = self else { return }
|
||||
_self.routeDelegate?.routeContainerController(closeComplection: __self)
|
||||
})
|
||||
_self.routeDelegate?.routeContainerController(close: _self)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Update DarkStyle
|
||||
|
||||
func update(darkStyle: Bool) {
|
||||
|
||||
self.darkStyle = darkStyle
|
||||
view.addBlur(darkStyle: darkStyle)
|
||||
header.add(darkStyle: darkStyle)
|
||||
tabbar?.addBlur(darkStyle: darkStyle)
|
||||
|
||||
loadTableItems()
|
||||
tableView.indicatorStyle = darkStyle ? .white : .default
|
||||
tableView.set(items: items, animated: true)
|
||||
}
|
||||
|
||||
|
||||
//MARK: - Update TableView
|
||||
|
||||
func loadTableView() {
|
||||
|
||||
tableView = TableAdapterView(frame: CGRect(x: 0, y: 0, width: ContainerDevice.width, height: 0), style: .plain)
|
||||
tableView.indicatorStyle = darkStyle ? .white : .default
|
||||
tableView.separatorColor = Colors.rgba(128, 128, 128, 0.6)
|
||||
|
||||
tableHeader = TableHeaderSpinerView()
|
||||
tableHeader?.width = ContainerDevice.width
|
||||
tableHeader?.backgroundColor = .clear
|
||||
tableView.tableHeaderView = tableHeader
|
||||
|
||||
main(delay: 2.5) { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
|
||||
_self.tableView.tableHeaderView = nil
|
||||
_self.tableHeader?.removeFromSuperview()
|
||||
_self.tableHeader = nil
|
||||
|
||||
_self.routeLayout.footerPadding = MapsRouteCellData.height()
|
||||
|
||||
_self.tableView.set(items: _self.items, animated: true)
|
||||
}
|
||||
}
|
||||
|
||||
public func main(delay: Double, work: @escaping () -> Void) {
|
||||
let deadline = DispatchTime.now() + delay
|
||||
DispatchQueue.main.asyncAfter(deadline: deadline) {
|
||||
work()
|
||||
}
|
||||
}
|
||||
|
||||
func loadTableItems() {
|
||||
|
||||
items = []
|
||||
|
||||
items.append( MapsRouteCellItem(darkStyle: darkStyle, title: "15 \(_L("LNG_MAPS_MIN"))", subtitle: "24 \(_L("LNG_MAPS_KM")) · \(_L("LNG_MAPS_STREET")) 1234541\n\(_L("LNG_ROUTE_FASTEST"))", selected: true) )
|
||||
items.append( MapsRouteCellItem(darkStyle: darkStyle, title: "40 \(_L("LNG_MAPS_MIN"))", subtitle: "31 \(_L("LNG_MAPS_KM")) · \(_L("LNG_MAPS_STREET")) \(_L("LNG_ROUTE_UNKNOWN"))...\n№ 7029") )
|
||||
items.append( MapsRouteCellItem(darkStyle: darkStyle, title: "45 \(_L("LNG_MAPS_MIN"))", subtitle: "29 \(_L("LNG_MAPS_KM")) · \(_L("LNG_MAPS_STREET")) \(_L("LNG_ROUTE_UNKNOWN"))\n\(_L("LNG_ROUTE_SIMPLEST"))") )
|
||||
items.append( MapsRouteCellItem(darkStyle: darkStyle, title: "45 \(_L("LNG_MAPS_MIN"))", subtitle: "29 \(_L("LNG_MAPS_KM")) · \(_L("LNG_MAPS_STREET")) \(_L("LNG_ROUTE_UNKNOWN"))\n\(_L("LNG_ROUTE_SIMPLEST"))") )
|
||||
|
||||
items.append( MapsSectionCellItem(title: _L("LNG_MAPS_SECTION_DRIVING_OPTIONS"), textButton: "") )
|
||||
items.append( MapsSectionCellItem(title: _L("LNG_MAPS_SECTION_REPORT_AN_ISSUE"), textButton: "") )
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
//
|
||||
// RouteContainerControllerDelegate.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 26/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
public protocol RouteContainerControllerDelegate {
|
||||
|
||||
func routeContainerController(close routeContainerController: RouteContainerController)
|
||||
|
||||
func routeContainerController(closeComplection routeContainerController: RouteContainerController)
|
||||
|
||||
func routeContainerController(move routeContainerController: RouteContainerController, position: CGFloat, type: ContainerMoveType, animation: Bool)
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
//
|
||||
// MapsContainerLayout.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 22/05/2020.
|
||||
// Copyright © 2020 mrusta. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
class MapsContainerLayout: ContainerLayout {
|
||||
|
||||
override init() {
|
||||
super.init()
|
||||
|
||||
startPosition = .hide
|
||||
|
||||
setBackgroundShadow()
|
||||
|
||||
setIPadInsets()
|
||||
|
||||
setLandscapePositions()
|
||||
setLandscapeInsets()
|
||||
}
|
||||
|
||||
private func setBackgroundShadow() {
|
||||
|
||||
backgroundShadowShow = ContainerDevice.isIpad ? false : true
|
||||
landscapeBackgroundShadowShow = false
|
||||
}
|
||||
|
||||
private func setIPadInsets() {
|
||||
|
||||
if ContainerDevice.isIpad {
|
||||
|
||||
let width: CGFloat = 320
|
||||
|
||||
let left: CGFloat = 8
|
||||
let right: CGFloat = (ContainerDevice.screenMin - width)
|
||||
|
||||
insets = ContainerInsets(right: right, left: left)
|
||||
}
|
||||
}
|
||||
|
||||
private func setLandscapePositions() {
|
||||
|
||||
var top: CGFloat = 8
|
||||
if ContainerDevice.isIphoneX { top += 16 }
|
||||
else if ContainerDevice.isIpad { top += ContainerDevice.statusBarHeight }
|
||||
|
||||
var bottom: CGFloat = 70
|
||||
if ContainerDevice.isIphoneX { bottom += ContainerDevice.isIphoneXTop }
|
||||
|
||||
landscapePositions = ContainerPosition(top: top, bottom: bottom)
|
||||
}
|
||||
|
||||
private func setLandscapeInsets() {
|
||||
|
||||
let width: CGFloat = ContainerDevice.isIphoneX ? 320 : 290
|
||||
|
||||
let left: CGFloat = (ContainerDevice.isIphoneX ? 44 : 8)
|
||||
let right: CGFloat = (ContainerDevice.screenMax - width)
|
||||
|
||||
landscapeInsets = ContainerInsets(right: right, left: left)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
//
|
||||
// MapsMainContainerLayout.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 23/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
class MapsMainContainerLayout: MapsContainerLayout {
|
||||
|
||||
override init() {
|
||||
super.init()
|
||||
|
||||
var top: CGFloat = 44
|
||||
if ContainerDevice.isIphoneX { top += 12 }
|
||||
|
||||
var bottom: CGFloat = 70
|
||||
if ContainerDevice.isIphoneX { bottom += ContainerDevice.isIphoneXBottom }
|
||||
|
||||
var middle: CGFloat = 262
|
||||
if ContainerDevice.isIphoneX { middle = 325 }
|
||||
else if ContainerDevice.isIphone5 { middle = 192 }
|
||||
|
||||
positions = ContainerPosition(top: top, middle: middle, bottom: bottom)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
//
|
||||
// MapsMenuContainerLayout.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 23/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
class MapsMenuContainerLayout: ContainerLayout {
|
||||
|
||||
override init() {
|
||||
super.init()
|
||||
|
||||
var paddingBottom: CGFloat = 410
|
||||
if ContainerDevice.isIphoneX {
|
||||
paddingBottom += 56
|
||||
}
|
||||
|
||||
var top: CGFloat = 0
|
||||
if ContainerDevice.isPortrait, !ContainerDevice.isIpad {
|
||||
top = (ContainerDevice.height - paddingBottom)
|
||||
}
|
||||
|
||||
movingEnabled = false
|
||||
|
||||
positions = ContainerPosition(top: top, bottom: 0.0)
|
||||
|
||||
backgroundShadowShow = true
|
||||
|
||||
landscapeBackgroundShadowShow = true
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
//
|
||||
// MapsRouteContainerLayout.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 23/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
class MapsRouteContainerLayout: MapsContainerLayout {
|
||||
|
||||
override init() {
|
||||
super.init()
|
||||
|
||||
var top: CGFloat = 44
|
||||
if ContainerDevice.isIphoneX { top += 12 }
|
||||
|
||||
var bottom: CGFloat = 77
|
||||
if ContainerDevice.isIphoneX { bottom += ContainerDevice.isIphoneXBottom }
|
||||
|
||||
let tabbarHeight: CGFloat = 49.0 + ContainerDevice.isIphoneXBottom
|
||||
let headerHeight: CGFloat = 78.0
|
||||
let middle: CGFloat = (headerHeight + tabbarHeight + MapsRouteCellData.height())
|
||||
|
||||
positions = ContainerPosition(top: top, middle: middle, bottom: bottom)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,261 @@
|
||||
//
|
||||
// MapViewController.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 19/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import MapKit
|
||||
import CoreLocation
|
||||
import ContainerControllerSwift
|
||||
|
||||
class MapViewManager: NSObject {
|
||||
|
||||
// MARK: Map Properties
|
||||
|
||||
var mapView: MKMapView?
|
||||
var compass: MKCompassButton!
|
||||
|
||||
var locationManager: CLLocationManager?
|
||||
|
||||
var selectAnnotation: MKPointAnnotation?
|
||||
var routeOverlay: MKOverlay?
|
||||
var setMoveMyLocationOnce: Bool = false
|
||||
|
||||
// MARK: - Callbacks
|
||||
|
||||
var changeRegionCallback: (() -> ())?
|
||||
var selectPinCallback: (() -> ())?
|
||||
|
||||
// MARK: - Init
|
||||
|
||||
public init(mapView: MKMapView) {
|
||||
super.init()
|
||||
|
||||
mapView.delegate = self
|
||||
self.mapView = mapView
|
||||
|
||||
loadLocation()
|
||||
updateCompass()
|
||||
}
|
||||
|
||||
// MARK: - Location Manager
|
||||
|
||||
func loadLocation() {
|
||||
|
||||
if CLLocationManager.locationServicesEnabled() {
|
||||
locationManager = CLLocationManager()
|
||||
locationManager?.delegate = self
|
||||
locationManager?.desiredAccuracy = kCLLocationAccuracyBest
|
||||
locationManager?.requestAlwaysAuthorization()
|
||||
locationManager?.startUpdatingLocation()
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Map Compass
|
||||
|
||||
func updateCompass() {
|
||||
|
||||
mapView?.showsCompass = false
|
||||
|
||||
compass = MKCompassButton(mapView:mapView)
|
||||
compass.x = (ContainerDevice.width - 47)
|
||||
compass.compassVisibility = .adaptive
|
||||
|
||||
mapView?.addSubview(compass)
|
||||
}
|
||||
|
||||
public func closeRoute(showSelectPin: Bool) {
|
||||
|
||||
if let route = routeOverlay {
|
||||
mapView?.removeOverlay(route)
|
||||
}
|
||||
selectPinAnimation(show: showSelectPin)
|
||||
}
|
||||
|
||||
public func selectPinAnimation(show: Bool) {
|
||||
|
||||
if let selectPin = selectAnnotation {
|
||||
if show {
|
||||
mapView?.selectAnnotation(selectPin, animated: true)
|
||||
} else {
|
||||
mapView?.deselectAnnotation(selectPin, animated: true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public func addMapPinFrom(longPress: UILongPressGestureRecognizer) {
|
||||
|
||||
guard let mapView = mapView else { return }
|
||||
|
||||
if let anotationMap = selectAnnotation {
|
||||
mapView.removeAnnotations([anotationMap]);
|
||||
}
|
||||
|
||||
let point: CGPoint = longPress.location(in: mapView)
|
||||
let coordinate: CLLocationCoordinate2D = mapView.convert(point, toCoordinateFrom: mapView)
|
||||
|
||||
let annotation = MKPointAnnotation()
|
||||
annotation.coordinate = coordinate
|
||||
mapView.addAnnotation(annotation)
|
||||
|
||||
selectAnnotation = annotation
|
||||
|
||||
mapView.selectAnnotation(annotation, animated: true)
|
||||
}
|
||||
|
||||
|
||||
// MARK: - Map Show Route
|
||||
|
||||
public func showRouteOnMapMyLocation() {
|
||||
if let pickupCoord = mapView?.userLocation.location?.coordinate,
|
||||
let destinationCoord = selectAnnotation {
|
||||
|
||||
showRouteOnMap(pickupCoordinate: pickupCoord, destinationCoordinate: destinationCoord.coordinate)
|
||||
}
|
||||
}
|
||||
|
||||
public func showRouteOnMap(pickupCoordinate: CLLocationCoordinate2D, destinationCoordinate: CLLocationCoordinate2D) {
|
||||
|
||||
closeRoute(showSelectPin: false)
|
||||
|
||||
let sourcePlacemark = MKPlacemark(coordinate: pickupCoordinate, addressDictionary: nil)
|
||||
let sourceMapItem = MKMapItem(placemark: sourcePlacemark)
|
||||
|
||||
let destinationPlacemark = MKPlacemark(coordinate: destinationCoordinate, addressDictionary: nil)
|
||||
let destinationMapItem = MKMapItem(placemark: destinationPlacemark)
|
||||
|
||||
let directionRequest = MKDirections.Request()
|
||||
directionRequest.source = sourceMapItem
|
||||
directionRequest.destination = destinationMapItem
|
||||
directionRequest.transportType = .automobile
|
||||
|
||||
|
||||
let directions = MKDirections(request: directionRequest)
|
||||
|
||||
directions.calculate { [weak self] (response, error) -> Void in
|
||||
guard let _self = self else { return }
|
||||
|
||||
guard let response = response else { return }
|
||||
|
||||
let route = response.routes[0]
|
||||
|
||||
_self.routeOverlay = route.polyline
|
||||
|
||||
_self.mapView?.addOverlay((route.polyline), level: MKOverlayLevel.aboveRoads)
|
||||
|
||||
let rect: MKMapRect = route.polyline.boundingMapRect
|
||||
|
||||
let coordReg: MKCoordinateRegion = MKCoordinateRegion(rect)
|
||||
|
||||
let mapButtonWidth: CGFloat = 45
|
||||
|
||||
let padding: CGFloat = 35
|
||||
let bottom: CGFloat = ContainerDevice.isPortrait ? (261 + padding) : padding
|
||||
let left: CGFloat = ContainerDevice.isPortrait ? padding : (261 + padding * 2)
|
||||
let right: CGFloat = (mapButtonWidth + 8 + padding)
|
||||
|
||||
let insets = UIEdgeInsets(top: padding, left: left, bottom: bottom, right: right)
|
||||
|
||||
_self.mapView?.setVisibleRegion(mapRegion: coordReg, edgePadding: insets, animated: true)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Map-Delegate
|
||||
|
||||
extension MapViewManager: MKMapViewDelegate {
|
||||
|
||||
func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
|
||||
if !animated {
|
||||
changeRegionCallback?()
|
||||
}
|
||||
}
|
||||
|
||||
func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
|
||||
if !animated {
|
||||
changeRegionCallback?()
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Map Select-Pin
|
||||
|
||||
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
|
||||
|
||||
let region = MKCoordinateRegion(center: view.annotation!.coordinate, span: mapView.region.span)
|
||||
mapView.setRegion(region, animated: true)
|
||||
|
||||
selectPinCallback?()
|
||||
|
||||
if let route = routeOverlay {
|
||||
mapView.removeOverlay(route)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Map Route-Color
|
||||
|
||||
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
|
||||
|
||||
let renderer = MKPolylineRenderer(overlay: overlay)
|
||||
|
||||
renderer.strokeColor = Colors.rgb(17, 147, 255)
|
||||
renderer.lineWidth = 8.0
|
||||
|
||||
return renderer
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Update Location Delegate
|
||||
|
||||
extension MapViewManager: CLLocationManagerDelegate {
|
||||
|
||||
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
|
||||
|
||||
if setMoveMyLocationOnce { return }
|
||||
|
||||
if let location = locations.last {
|
||||
let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
|
||||
|
||||
let radius: CLLocationDistance = 3200
|
||||
let region = MKCoordinateRegion(center: center, latitudinalMeters: radius, longitudinalMeters: radius)
|
||||
|
||||
mapView?.setRegion(region, animated: false)
|
||||
|
||||
let annotation = MKPointAnnotation()
|
||||
annotation.coordinate = CLLocationCoordinate2D(latitude: location.coordinate.latitude + 0.01, longitude: location.coordinate.longitude + 0.01)
|
||||
mapView?.addAnnotation(annotation)
|
||||
selectAnnotation = annotation
|
||||
|
||||
setMoveMyLocationOnce = true
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Map Extension
|
||||
|
||||
extension MKCoordinateRegion {
|
||||
var mapRect: MKMapRect {
|
||||
get {
|
||||
let a = MKMapPoint( CLLocationCoordinate2DMake(
|
||||
self.center.latitude + self.span.latitudeDelta / 2,
|
||||
self.center.longitude - self.span.longitudeDelta / 2))
|
||||
|
||||
let b = MKMapPoint( CLLocationCoordinate2DMake(
|
||||
self.center.latitude - self.span.latitudeDelta / 2,
|
||||
self.center.longitude + self.span.longitudeDelta / 2))
|
||||
|
||||
return MKMapRect(x: min(a.x,b.x), y: min(a.y,b.y), width: abs(a.x-b.x), height: abs(a.y-b.y))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MKMapView {
|
||||
func setVisibleRegion(mapRegion: MKCoordinateRegion, edgePadding insets: UIEdgeInsets, animated animate: Bool) {
|
||||
self.setVisibleMapRect(mapRegion.mapRect, edgePadding: insets , animated: animate)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Maps View Controller-->
|
||||
<scene sceneID="Rk6-gL-wZG">
|
||||
<objects>
|
||||
<viewController storyboardIdentifier="MapsViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="f2s-jC-2Ov" customClass="MapsViewController" customModule="ContainerController" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="kgU-LS-KrK">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<mapView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" mapType="standard" showsUserLocation="YES" translatesAutoresizingMaskIntoConstraints="NO" id="UJh-Fm-jmk">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<gestureRecognizers/>
|
||||
<connections>
|
||||
<outletCollection property="gestureRecognizers" destination="sxv-Tw-fIc" appends="YES" id="CQx-BC-g6G"/>
|
||||
</connections>
|
||||
</mapView>
|
||||
<visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="KvC-se-dlU">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="20"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="qLU-jw-IXJ">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
</view>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="20" id="5UE-cf-AY5"/>
|
||||
</constraints>
|
||||
<blurEffect style="regular"/>
|
||||
</visualEffectView>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="BF1-Z2-4rJ" customClass="MapsButtons" customModule="ContainerController" customModuleProvider="target">
|
||||
<rect key="frame" x="322" y="28" width="45" height="91"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="45" id="ScR-6k-Ysj"/>
|
||||
<constraint firstAttribute="height" constant="91" id="ddV-29-jFA"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cpf-5B-ldg" customClass="MapsWeatherView" customModule="ContainerController" customModuleProvider="target">
|
||||
<rect key="frame" x="309" y="342" width="58" height="27"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<gestureRecognizers/>
|
||||
<constraints>
|
||||
<constraint firstItem="UJh-Fm-jmk" firstAttribute="top" secondItem="kgU-LS-KrK" secondAttribute="top" id="0va-s9-Aub"/>
|
||||
<constraint firstItem="UJh-Fm-jmk" firstAttribute="leading" secondItem="kgU-LS-KrK" secondAttribute="leading" id="6pA-L6-gGI"/>
|
||||
<constraint firstAttribute="trailing" secondItem="UJh-Fm-jmk" secondAttribute="trailing" id="7pp-6d-NRv"/>
|
||||
<constraint firstItem="KvC-se-dlU" firstAttribute="leading" secondItem="kgU-LS-KrK" secondAttribute="leading" id="BG7-aK-8Pp"/>
|
||||
<constraint firstItem="KvC-se-dlU" firstAttribute="trailing" secondItem="kgU-LS-KrK" secondAttribute="trailing" id="Eic-Cw-bQD"/>
|
||||
<constraint firstItem="KvC-se-dlU" firstAttribute="top" secondItem="kgU-LS-KrK" secondAttribute="top" id="aqu-Fv-lq0"/>
|
||||
<constraint firstAttribute="trailing" secondItem="BF1-Z2-4rJ" secondAttribute="trailing" constant="8" id="eED-Hs-eow"/>
|
||||
<constraint firstAttribute="bottom" secondItem="UJh-Fm-jmk" secondAttribute="bottom" id="rbR-5f-1BQ"/>
|
||||
<constraint firstItem="BF1-Z2-4rJ" firstAttribute="top" secondItem="kgU-LS-KrK" secondAttribute="top" constant="28" id="ysX-5T-3eG"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="Qdr-zC-gg2"/>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="mapButtons" destination="BF1-Z2-4rJ" id="Ju8-fq-VTB"/>
|
||||
<outlet property="mapButtonsPaddingRight" destination="eED-Hs-eow" id="oDt-le-Sdf"/>
|
||||
<outlet property="mapButtonsPaddingTop" destination="ysX-5T-3eG" id="LrD-nb-fMg"/>
|
||||
<outlet property="mapView" destination="UJh-Fm-jmk" id="9kq-bJ-Naq"/>
|
||||
<outlet property="mapWeatherView" destination="cpf-5B-ldg" id="XHv-aG-MMo"/>
|
||||
<outlet property="statusBarBlurHeight" destination="5UE-cf-AY5" id="9HD-jh-ICJ"/>
|
||||
<outlet property="statusBlur" destination="KvC-se-dlU" id="gwu-5p-fR5"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="Dhy-Gp-pip" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||
<pongPressGestureRecognizer allowableMovement="10" minimumPressDuration="0.5" id="sxv-Tw-fIc">
|
||||
<connections>
|
||||
<action selector="handleLong:" destination="f2s-jC-2Ov" id="bhL-lA-T0W"/>
|
||||
</connections>
|
||||
</pongPressGestureRecognizer>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="131.25" y="81.338028169014081"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
||||
@@ -0,0 +1,437 @@
|
||||
//
|
||||
// MapsViewController.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 02/05/2020.
|
||||
// Copyright © 2020 mrustaa. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import MapKit
|
||||
import CoreLocation
|
||||
import ContainerControllerSwift
|
||||
|
||||
class MapsViewController: StoryboardController, MapsContainerControllerDelegate, LocationContainerControllerDelegate, RouteContainerControllerDelegate, MenuContainerControllerDelegate {
|
||||
|
||||
// MARK: - IBOutlets
|
||||
|
||||
@IBOutlet weak var mapView: MKMapView!
|
||||
|
||||
@IBOutlet weak var mapWeatherView: MapsWeatherView!
|
||||
|
||||
@IBOutlet weak var mapButtons: MapsButtons!
|
||||
@IBOutlet weak var mapButtonsPaddingTop: NSLayoutConstraint!
|
||||
@IBOutlet weak var mapButtonsPaddingRight: NSLayoutConstraint!
|
||||
|
||||
@IBOutlet weak var statusBlur: UIVisualEffectView!
|
||||
@IBOutlet weak var statusBarBlurHeight: NSLayoutConstraint!
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
var mapManager: MapViewManager!
|
||||
|
||||
var mapsContainer: MapsContainerController!
|
||||
var locationContainer: LocationContainerController?
|
||||
var routeContainer: RouteContainerController?
|
||||
var menuContainer: MenuContainerController!
|
||||
|
||||
var darkStyle: Bool = false
|
||||
var selectedIndex: Int = 0
|
||||
var showOnce: Bool = false
|
||||
|
||||
// MARK: - Life Cycle
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(rotated), name: UIDevice.orientationDidChangeNotification, object: nil)
|
||||
|
||||
updateMapManager()
|
||||
|
||||
showMapsContainer()
|
||||
|
||||
updateMapViewButtons()
|
||||
updateMapViewWeatherView()
|
||||
updateMapViewTopPadding()
|
||||
startAnimationMapElements()
|
||||
}
|
||||
|
||||
override func viewWillAppear(_ animated: Bool) {
|
||||
super.viewWillAppear(animated)
|
||||
|
||||
setNeedsStatusBarAppearanceUpdate()
|
||||
|
||||
navBar(hide: true)
|
||||
if !showOnce {
|
||||
mapsContainer.move(type: .hide, animation: false)
|
||||
}
|
||||
}
|
||||
|
||||
override func viewDidAppear(_ animated: Bool) {
|
||||
super.viewDidAppear(animated)
|
||||
|
||||
if !showOnce {
|
||||
showOnce = true
|
||||
mapsContainer.move(type: .middle)
|
||||
}
|
||||
}
|
||||
|
||||
override func viewWillDisappear(_ animated: Bool) {
|
||||
super.viewWillDisappear(animated)
|
||||
|
||||
navBar(hide: false)
|
||||
}
|
||||
|
||||
func navBar(hide: Bool) {
|
||||
self.navigationController?.setNavigationBarHidden(hide, animated: true)
|
||||
}
|
||||
|
||||
override func viewDidDisappear(_ animated: Bool) {
|
||||
super.viewDidDisappear(animated)
|
||||
|
||||
mapsContainer.remove()
|
||||
mapsContainer = nil
|
||||
|
||||
NotificationCenter.default.removeObserver(self)
|
||||
}
|
||||
|
||||
// MARK: - StatusBar Style
|
||||
|
||||
override var preferredStatusBarStyle: UIStatusBarStyle {
|
||||
return darkStyle ? .lightContent : .default
|
||||
}
|
||||
|
||||
// MARK: - Rotation Callback
|
||||
|
||||
@objc func rotated() {
|
||||
|
||||
if !UIDevice.current.orientation.isRotateAllowed { return }
|
||||
|
||||
updateMapViewTopPadding()
|
||||
}
|
||||
|
||||
func updateMapViewTopPadding() {
|
||||
|
||||
let padding: CGFloat = 8
|
||||
|
||||
statusBarBlurHeight.constant = ContainerDevice.statusBarHeight
|
||||
|
||||
let paddingX: CGFloat = (ContainerDevice.isIphoneX ? ContainerDevice.isIphoneXTop : padding)
|
||||
|
||||
var paddingWeatherTop: CGFloat = 0.0
|
||||
var paddingTop: CGFloat = 0.0
|
||||
var paddingRight: CGFloat = 0.0
|
||||
|
||||
let paddingStatusBar: CGFloat = (ContainerDevice.statusBarHeight + padding)
|
||||
|
||||
switch ContainerDevice.orientation {
|
||||
case .portrait:
|
||||
paddingTop = paddingStatusBar
|
||||
paddingRight = padding
|
||||
paddingWeatherTop = padding
|
||||
case .landscapeLeft:
|
||||
paddingTop = ContainerDevice.isIpad ? paddingStatusBar : paddingX
|
||||
paddingRight = ContainerDevice.isIphoneX ? 44 : padding
|
||||
paddingWeatherTop = paddingX
|
||||
case .landscapeRight:
|
||||
paddingTop = ContainerDevice.isIpad ? paddingStatusBar : paddingX
|
||||
paddingRight = paddingX
|
||||
paddingWeatherTop = paddingX
|
||||
}
|
||||
|
||||
var width: CGFloat = 0.0
|
||||
var height: CGFloat = 0.0
|
||||
|
||||
|
||||
switch ContainerDevice.orientation {
|
||||
case .portrait:
|
||||
width = ContainerDevice.screenMin
|
||||
height = ContainerDevice.screenMax
|
||||
case .landscapeLeft,
|
||||
.landscapeRight:
|
||||
width = ContainerDevice.screenMax
|
||||
height = ContainerDevice.screenMin
|
||||
}
|
||||
|
||||
mapWeatherView.x = (width - mapWeatherView.width - paddingRight)
|
||||
|
||||
|
||||
if ContainerDevice.isPortrait, !ContainerDevice.isIpad {
|
||||
mapWeatherView.y = (mapsContainer.view.y - mapWeatherView.height - paddingWeatherTop)
|
||||
} else {
|
||||
mapWeatherView.y = (height - mapWeatherView.height - paddingWeatherTop)
|
||||
}
|
||||
|
||||
mapButtonsPaddingTop.constant = paddingTop
|
||||
mapButtonsPaddingRight.constant = paddingRight
|
||||
|
||||
mapManager.compass.x = (ContainerDevice.width - 47)
|
||||
mapManager.compass.y = (paddingTop + mapButtons.height + 12)
|
||||
}
|
||||
|
||||
// MARK: - Map Manager
|
||||
|
||||
func updateMapManager() {
|
||||
|
||||
mapManager = MapViewManager(mapView: mapView)
|
||||
mapManager.compass.y = (mapButtons.bottom + 12)
|
||||
mapManager.selectPinCallback = { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
_self.mapsContainer.showLocationDetails()
|
||||
}
|
||||
mapManager.changeRegionCallback = { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
_self.mapButtons.changeButtonLocation(fill: false)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Map Long-Press
|
||||
|
||||
@IBAction func handleLong(_ recognizer: UILongPressGestureRecognizer) {
|
||||
if routeContainer != nil { return }
|
||||
|
||||
switch recognizer.state {
|
||||
case .began:
|
||||
|
||||
mapManager.addMapPinFrom(longPress: recognizer)
|
||||
mapsContainer.showLocationDetails()
|
||||
|
||||
default: break
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// MARK: - Map Buttons Update
|
||||
|
||||
func updateMapViewButtons() {
|
||||
|
||||
mapButtons.addBlur(darkStyle: darkStyle)
|
||||
mapButtons.alpha = 0.0
|
||||
mapButtons.buttonsActionCallback = { [weak self] (_ index: Int) in
|
||||
guard let _self = self else { return }
|
||||
|
||||
if (index == 0) {
|
||||
_self.showMenuContainer()
|
||||
} else {
|
||||
_self.mapButtons.changeButtonLocation(fill: true)
|
||||
|
||||
if let coor = _self.mapView.userLocation.location?.coordinate {
|
||||
_self.mapView.setCenter(coor, animated: true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func updateMapViewWeatherView() {
|
||||
|
||||
mapWeatherView.addBlur(darkStyle: darkStyle)
|
||||
mapWeatherView.alpha = 0.0
|
||||
}
|
||||
|
||||
func startAnimationMapElements() {
|
||||
|
||||
UIView.animate(withDuration: 1.0, animations: { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
_self.mapWeatherView.alpha = 1.0
|
||||
_self.mapButtons.alpha = 1.0
|
||||
})
|
||||
}
|
||||
|
||||
// MARK: - Map Buttons Alpha
|
||||
|
||||
func mapButtons(alpha: CGFloat, animation: Bool = true) {
|
||||
if ContainerDevice.isPortrait, !ContainerDevice.isIpad {
|
||||
if animation {
|
||||
UIView.animate(withDuration: 0.15, animations: { [weak self] in
|
||||
guard let _self = self else { return }
|
||||
_self.mapButtons.alpha = alpha
|
||||
_self.mapWeatherView.alpha = alpha
|
||||
})
|
||||
} else {
|
||||
mapButtons.alpha = alpha
|
||||
mapWeatherView.alpha = alpha
|
||||
}
|
||||
} else {
|
||||
mapButtons.alpha = 1.0
|
||||
mapWeatherView.alpha = 1.0
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Change Position MapElements
|
||||
|
||||
func changePositionMapsElements(container: ContainerController, position: CGFloat, type: ContainerMoveType, animation: Bool) {
|
||||
if type == .hide { return }
|
||||
|
||||
let result = (container.positionMiddle - position)
|
||||
var alpha: CGFloat = (1.0 - (result / 20.0))
|
||||
|
||||
if 20.0 < result {
|
||||
alpha = 0.0
|
||||
} else if result < 0.0 {
|
||||
alpha = 1.0
|
||||
}
|
||||
|
||||
if animation {
|
||||
if type == .top {
|
||||
mapButtons(alpha: 0.0, animation: true)
|
||||
} else {
|
||||
mapButtons(alpha: 1.0, animation: true)
|
||||
}
|
||||
|
||||
if type != .top {
|
||||
if ContainerDevice.isPortrait, !ContainerDevice.isIpad {
|
||||
mapWeatherView.y = (position - mapWeatherView.height - 8)
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
mapButtons(alpha: alpha, animation: false)
|
||||
|
||||
if ContainerDevice.isPortrait, !ContainerDevice.isIpad {
|
||||
if result < 0.0 {
|
||||
mapWeatherView.y = (position - mapWeatherView.height - 8)
|
||||
} else {
|
||||
mapWeatherView.y = (container.positionMiddle - mapWeatherView.height - 8)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if animation, type != .top {
|
||||
view.endEditing(true)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Change Index Menu
|
||||
|
||||
func menuChange(index: Int) {
|
||||
|
||||
selectedIndex = index
|
||||
darkStyle = (index == 2)
|
||||
|
||||
mapsContainer.update(darkStyle: darkStyle)
|
||||
locationContainer?.update(darkStyle: darkStyle)
|
||||
routeContainer?.update(darkStyle: darkStyle)
|
||||
|
||||
mapButtons.addBlur(darkStyle: darkStyle)
|
||||
mapWeatherView.addBlur(darkStyle: darkStyle)
|
||||
|
||||
switch selectedIndex {
|
||||
case 0: mapView.mapType = .standard
|
||||
case 1: mapView.mapType = .mutedStandard
|
||||
case 2: mapView.mapType = .hybrid
|
||||
default: break
|
||||
}
|
||||
|
||||
let style: UIBlurEffect.Style = darkStyle ? .systemUltraThinMaterialDark : .regular
|
||||
statusBlur.effect = UIBlurEffect(style: style)
|
||||
|
||||
setNeedsStatusBarAppearanceUpdate()
|
||||
}
|
||||
|
||||
// MARK: - Show Maps-Container
|
||||
|
||||
func showMapsContainer() {
|
||||
mapsContainer = MapsContainerController(addTo: self, darkStyle: darkStyle)
|
||||
mapsContainer.mapsDelegate = self
|
||||
}
|
||||
|
||||
// MARK: Delegate
|
||||
|
||||
func mapsContainerController(showLocationDetails mapsContainerController: MapsContainerController) {
|
||||
mapsContainer.move(type: .hide)
|
||||
showLocationDetailsContainer()
|
||||
mapManager.selectPinAnimation(show: true)
|
||||
}
|
||||
|
||||
func mapsContainerController(move mapsContainerController: MapsContainerController, position: CGFloat, type: ContainerMoveType, animation: Bool) {
|
||||
changePositionMapsElements(container: mapsContainerController, position: position, type: type, animation: animation)
|
||||
}
|
||||
|
||||
//MARK: - Show Location-Details
|
||||
|
||||
func showLocationDetailsContainer() {
|
||||
if locationContainer != nil { return }
|
||||
|
||||
locationContainer = LocationContainerController(addTo: self, darkStyle: darkStyle)
|
||||
locationContainer?.locationDelegate = self
|
||||
locationContainer?.move(type: ContainerDevice.isPortrait ? .middle : .top)
|
||||
}
|
||||
|
||||
// MARK: Delegate
|
||||
|
||||
func locationContainerController(showRoute locationContainerController: LocationContainerController) {
|
||||
locationContainer?.move(type: .hide)
|
||||
showRouteContainer()
|
||||
mapManager.showRouteOnMapMyLocation()
|
||||
}
|
||||
|
||||
func locationContainerController(close locationContainerController: LocationContainerController) {
|
||||
mapManager.selectPinAnimation(show: false)
|
||||
|
||||
let animation = locationContainerController.oldMoveType != .middle
|
||||
|
||||
mapsContainer.move(type: .middle, animation: animation)
|
||||
}
|
||||
|
||||
func locationContainerController(closeComplection locationContainerController: LocationContainerController) {
|
||||
locationContainer = nil
|
||||
}
|
||||
|
||||
func locationContainerController(move locationContainerController: LocationContainerController, position: CGFloat, type: ContainerMoveType, animation: Bool) {
|
||||
changePositionMapsElements(container: locationContainerController, position: position, type: type, animation: animation)
|
||||
}
|
||||
|
||||
//MARK: - Show Route
|
||||
|
||||
func showRouteContainer() {
|
||||
if routeContainer != nil { return }
|
||||
|
||||
routeContainer = RouteContainerController(addTo: self, darkStyle: darkStyle)
|
||||
routeContainer?.routeDelegate = self
|
||||
routeContainer?.move(type: ContainerDevice.isPortrait ? .middle : .top)
|
||||
}
|
||||
|
||||
// MARK: Delegate
|
||||
|
||||
func routeContainerController(close routeContainerController: RouteContainerController) {
|
||||
mapManager.closeRoute(showSelectPin: true)
|
||||
locationContainer?.move(type: .middle)
|
||||
}
|
||||
|
||||
func routeContainerController(closeComplection routeContainerController: RouteContainerController) {
|
||||
routeContainer = nil
|
||||
}
|
||||
|
||||
func routeContainerController(move routeContainerController: RouteContainerController, position: CGFloat, type: ContainerMoveType, animation: Bool) {
|
||||
changePositionMapsElements(container: routeContainerController, position: position, type: type, animation: animation)
|
||||
}
|
||||
|
||||
// MARK: - Show Menu-Container
|
||||
|
||||
func showMenuContainer() {
|
||||
if menuContainer != nil { return }
|
||||
|
||||
menuContainer = MenuContainerController(addTo: self, darkStyle: darkStyle, selectedIndex: selectedIndex)
|
||||
menuContainer?.menuDelegate = self
|
||||
|
||||
mapButtons(alpha: 0.0)
|
||||
}
|
||||
|
||||
// MARK: Delegate
|
||||
|
||||
func menuContainerController(close menuContainerController: MenuContainerController) {
|
||||
mapButtons(alpha: 1.0)
|
||||
}
|
||||
|
||||
func menuContainerController(closeComplection menuContainerController: MenuContainerController) {
|
||||
menuContainer = nil
|
||||
}
|
||||
|
||||
func menuContainerController(segment menuContainerController: MenuContainerController, selectedIndex: Int) {
|
||||
menuChange(index: selectedIndex)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
|
||||
|
||||
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
// MARK: - Item
|
||||
|
||||
class LocationAddressCellItem: TableAdapterItem {
|
||||
|
||||
init(title: String? = nil,
|
||||
subtitle: String? = nil,
|
||||
darkStyle: Bool = false) {
|
||||
|
||||
let cellData = LocationAddressCellData(title, subtitle, darkStyle)
|
||||
|
||||
super.init(cellClass: LocationAddressCell .self, cellData: cellData)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Data
|
||||
|
||||
class LocationAddressCellData: TableAdapterCellData {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
var title: String?
|
||||
var subtitle: String?
|
||||
var darkStyle: Bool
|
||||
|
||||
// MARK: Inits
|
||||
|
||||
init(_ title: String? = nil,
|
||||
_ subtitle: String? = nil,
|
||||
_ darkStyle: Bool) {
|
||||
|
||||
self.title = title
|
||||
self.subtitle = subtitle
|
||||
self.darkStyle = darkStyle
|
||||
|
||||
super.init()
|
||||
}
|
||||
|
||||
override public func cellHeight() -> CGFloat {
|
||||
return 159
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Cell
|
||||
|
||||
class LocationAddressCell : TableAdapterCell {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
public var data: LocationAddressCellData?
|
||||
|
||||
// MARK: Outlets
|
||||
|
||||
@IBOutlet override var selectedView: UIView? {
|
||||
didSet { }
|
||||
}
|
||||
|
||||
@IBOutlet private weak var titleLabel: UILabel?
|
||||
@IBOutlet private weak var textLabel2: UILabel?
|
||||
|
||||
// MARK: Initialize
|
||||
|
||||
override func awakeFromNib() {
|
||||
separatorInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: CGFloat(Double.greatestFiniteMagnitude))
|
||||
}
|
||||
|
||||
override func fill(data: TableAdapterCellData?) {
|
||||
guard let data = data as? LocationAddressCellData else { return }
|
||||
self.data = data
|
||||
|
||||
titleLabel?.text = _L("LNG_MAPS_ADDRESS")
|
||||
textLabel2?.text = "\(_L("LNG_MAPS_STREET")), 16c2, .....\n\(_L("LNG_MAPS_CITY"))\n\(_L("LNG_MAPS_COUNTRY"))\n101000"
|
||||
|
||||
textLabel2?.textColor = data.darkStyle ? .white : .black
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" id="f2l-3p-uee" customClass="LocationAddressCell" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="159"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="f2l-3p-uee" id="3Bv-wN-gVG">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="159"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="VKk-lv-YQm">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="159"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Address" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aWx-3x-09I">
|
||||
<rect key="frame" x="16" y="22" width="56.5" height="18"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="15"/>
|
||||
<color key="textColor" white="0.5" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" numberOfLines="4" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vxH-ZE-iw0">
|
||||
<rect key="frame" x="16" y="42" width="343" height="95"/>
|
||||
<attributedString key="attributedText">
|
||||
<fragment content="Street № 5108
City
Country
1111111">
|
||||
<attributes>
|
||||
<color key="NSColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
|
||||
<font key="NSFont" metaFont="system" size="17"/>
|
||||
<paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural" lineSpacing="4.2999999999999998" tighteningFactorForTruncation="0.0"/>
|
||||
</attributes>
|
||||
</fragment>
|
||||
</attributedString>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="vxH-ZE-iw0" firstAttribute="leading" secondItem="VKk-lv-YQm" secondAttribute="leading" constant="16" id="DMM-mg-xKk"/>
|
||||
<constraint firstItem="vxH-ZE-iw0" firstAttribute="top" secondItem="VKk-lv-YQm" secondAttribute="top" constant="42" id="KPn-hK-zl7"/>
|
||||
<constraint firstAttribute="trailing" secondItem="vxH-ZE-iw0" secondAttribute="trailing" constant="16" id="KgK-JU-gc8"/>
|
||||
<constraint firstAttribute="bottom" secondItem="vxH-ZE-iw0" secondAttribute="bottom" constant="22" id="Ryl-mq-b7N"/>
|
||||
<constraint firstItem="aWx-3x-09I" firstAttribute="top" secondItem="VKk-lv-YQm" secondAttribute="top" constant="22" id="gt2-Pr-SBe"/>
|
||||
<constraint firstItem="aWx-3x-09I" firstAttribute="leading" secondItem="VKk-lv-YQm" secondAttribute="leading" constant="16" id="k4f-Qx-sH9"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="VKk-lv-YQm" firstAttribute="leading" secondItem="3Bv-wN-gVG" secondAttribute="leading" id="23Z-pC-4r7"/>
|
||||
<constraint firstAttribute="bottom" secondItem="VKk-lv-YQm" secondAttribute="bottom" id="Nq0-dX-zaA"/>
|
||||
<constraint firstItem="VKk-lv-YQm" firstAttribute="top" secondItem="3Bv-wN-gVG" secondAttribute="top" id="ONz-Ps-Q5G"/>
|
||||
<constraint firstAttribute="trailing" secondItem="VKk-lv-YQm" secondAttribute="trailing" id="jMU-VX-5ft"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<connections>
|
||||
<outlet property="textLabel2" destination="vxH-ZE-iw0" id="PlJ-mK-Uz3"/>
|
||||
<outlet property="titleLabel" destination="aWx-3x-09I" id="dAe-zi-af0"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="127.2" y="111.0944527736132"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
</document>
|
||||
@@ -0,0 +1,127 @@
|
||||
|
||||
|
||||
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
enum LocationButtonCellType {
|
||||
case blue // 0 122 255
|
||||
case gray // 0 0 0 9%
|
||||
}
|
||||
|
||||
// MARK: - Item
|
||||
|
||||
class LocationButtonCellItem: TableAdapterItem {
|
||||
|
||||
init(title: String? = nil,
|
||||
subtitle: String? = nil,
|
||||
type: LocationButtonCellType,
|
||||
clickCallback: (() -> ())? = nil) {
|
||||
|
||||
let cellData = LocationButtonCellData(title, subtitle, type, clickCallback)
|
||||
|
||||
super.init(cellClass: LocationButtonCell.self, cellData: cellData)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Data
|
||||
|
||||
open class LocationButtonCellData: TableAdapterCellData {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
var title: String?
|
||||
var subtitle: String?
|
||||
var type: LocationButtonCellType
|
||||
var clickCallback: (() -> ())?
|
||||
|
||||
// MARK: Inits
|
||||
|
||||
init(_ title: String? = nil,
|
||||
_ subtitle: String? = nil,
|
||||
_ type: LocationButtonCellType,
|
||||
_ clickCallback:(() -> ())?) {
|
||||
|
||||
self.title = title
|
||||
self.subtitle = subtitle
|
||||
self.type = type
|
||||
self.clickCallback = clickCallback
|
||||
|
||||
super.init()
|
||||
}
|
||||
|
||||
override public func cellHeight() -> CGFloat {
|
||||
return 62
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Cell
|
||||
|
||||
class LocationButtonCell : TableAdapterCell {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
public var data: LocationButtonCellData?
|
||||
|
||||
// MARK: Outlets
|
||||
|
||||
@IBOutlet override var selectedView: UIView? {
|
||||
didSet { }
|
||||
}
|
||||
|
||||
@IBOutlet private weak var button: DesignButton?
|
||||
|
||||
@IBOutlet weak var view2: UIView!
|
||||
@IBOutlet private weak var titleLabel2: UILabel?
|
||||
|
||||
@IBOutlet weak var view: UIView!
|
||||
@IBOutlet private weak var titleLabel: UILabel?
|
||||
@IBOutlet private weak var subtitleLabel: UILabel?
|
||||
|
||||
// MARK: Initialize
|
||||
|
||||
override func awakeFromNib() {
|
||||
separatorInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: CGFloat(Double.greatestFiniteMagnitude))
|
||||
}
|
||||
|
||||
override func fill(data: TableAdapterCellData?) {
|
||||
guard let data = data as? LocationButtonCellData else { return }
|
||||
self.data = data
|
||||
|
||||
|
||||
switch data.type {
|
||||
case .blue:
|
||||
view.alpha = 1.0
|
||||
view2.alpha = 0.0
|
||||
|
||||
titleLabel?.text = data.title ?? ""
|
||||
subtitleLabel?.text = data.subtitle ?? ""
|
||||
// titleLabelY?.constant = 15
|
||||
// titleLabel?.textColor = .white
|
||||
// subtitleLabel?.textColor = .white
|
||||
// button?.fillColor = .systemBlue
|
||||
// button?.hideAnimation = false
|
||||
|
||||
case .gray:
|
||||
|
||||
view.alpha = 0.0
|
||||
view2.alpha = 1.0
|
||||
titleLabel2?.text = data.title ?? ""
|
||||
// titleLabelY?.constant = 23
|
||||
// titleLabel?.textColor = .systemBlue
|
||||
// subtitleLabel?.textColor = .systemBlue
|
||||
// button?.fillColor = Colors.rgba(130, 130, 130, 0.15)
|
||||
// button?.hideAnimation = true
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@IBAction func buttonClickAction(_ sender: Any) {
|
||||
data?.clickCallback?()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" id="jdx-nx-Zfb" customClass="LocationButtonCell" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="62"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="jdx-nx-Zfb" id="dc0-Fe-e3H">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="62"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bhS-iM-Rym">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="62"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bxF-Ot-WsK" customClass="DesignButton" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="16" y="5" width="288" height="52"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="14"/>
|
||||
<state key="normal">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</state>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="8"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" systemColor="systemBlueColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="boolean" keyPath="hideAnimation" value="NO"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="buttonClickAction:" destination="jdx-nx-Zfb" eventType="touchUpInside" id="BYk-4s-gPi"/>
|
||||
</connections>
|
||||
</button>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Directions" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Shd-Nj-jla">
|
||||
<rect key="frame" x="0.0" y="15" width="320" height="16"/>
|
||||
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="13"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="25 min drive" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hSb-6T-owy">
|
||||
<rect key="frame" x="0.0" y="31" width="320" height="16"/>
|
||||
<fontDescription key="fontDescription" type="system" weight="light" pointSize="13"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="bxF-Ot-WsK" secondAttribute="bottom" constant="5" id="6u4-rJ-Xtn"/>
|
||||
<constraint firstItem="Shd-Nj-jla" firstAttribute="top" secondItem="bhS-iM-Rym" secondAttribute="top" constant="15" id="7gt-I1-el8"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Shd-Nj-jla" secondAttribute="trailing" id="CaR-Va-OTE"/>
|
||||
<constraint firstItem="bxF-Ot-WsK" firstAttribute="leading" secondItem="bhS-iM-Rym" secondAttribute="leading" constant="16" id="Hk8-US-IlI"/>
|
||||
<constraint firstItem="Shd-Nj-jla" firstAttribute="leading" secondItem="bhS-iM-Rym" secondAttribute="leading" id="LtM-CR-5gx"/>
|
||||
<constraint firstAttribute="trailing" secondItem="bxF-Ot-WsK" secondAttribute="trailing" constant="16" id="azB-1G-bOc"/>
|
||||
<constraint firstItem="bxF-Ot-WsK" firstAttribute="top" secondItem="bhS-iM-Rym" secondAttribute="top" constant="5" id="nct-FV-EMP"/>
|
||||
<constraint firstAttribute="trailing" secondItem="hSb-6T-owy" secondAttribute="trailing" id="xRc-7m-W8I"/>
|
||||
<constraint firstItem="hSb-6T-owy" firstAttribute="top" secondItem="Shd-Nj-jla" secondAttribute="bottom" id="ybo-wV-zLo"/>
|
||||
<constraint firstItem="hSb-6T-owy" firstAttribute="leading" secondItem="bhS-iM-Rym" secondAttribute="leading" id="zdK-1R-xCi"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view alpha="0.0" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hp7-D3-7Oy">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="62"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="h0N-qi-JcE" customClass="DesignButton" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="16" y="5" width="288" height="52"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="14"/>
|
||||
<state key="normal">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</state>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="8"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" white="0.4950042517006803" alpha="0.15213116496598639" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="boolean" keyPath="hideAnimation" value="YES"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="buttonClickAction:" destination="jdx-nx-Zfb" eventType="touchUpInside" id="OWt-St-OaV"/>
|
||||
</connections>
|
||||
</button>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Directions" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6qi-jY-2bC">
|
||||
<rect key="frame" x="0.0" y="23" width="320" height="16"/>
|
||||
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="13"/>
|
||||
<color key="textColor" systemColor="systemBlueColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="h0N-qi-JcE" firstAttribute="top" secondItem="hp7-D3-7Oy" secondAttribute="top" constant="5" id="0j2-54-L2G"/>
|
||||
<constraint firstAttribute="trailing" secondItem="h0N-qi-JcE" secondAttribute="trailing" constant="16" id="40R-jD-PM6"/>
|
||||
<constraint firstAttribute="bottom" secondItem="h0N-qi-JcE" secondAttribute="bottom" constant="5" id="50d-99-hlu"/>
|
||||
<constraint firstItem="6qi-jY-2bC" firstAttribute="leading" secondItem="hp7-D3-7Oy" secondAttribute="leading" id="Xl6-Lk-2Uo"/>
|
||||
<constraint firstAttribute="trailing" secondItem="6qi-jY-2bC" secondAttribute="trailing" id="gjg-bj-v0Y"/>
|
||||
<constraint firstItem="6qi-jY-2bC" firstAttribute="top" secondItem="hp7-D3-7Oy" secondAttribute="top" constant="23" id="o2w-CC-Ojf"/>
|
||||
<constraint firstItem="h0N-qi-JcE" firstAttribute="leading" secondItem="hp7-D3-7Oy" secondAttribute="leading" constant="16" id="vRK-Bg-xZ6"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="bhS-iM-Rym" secondAttribute="trailing" id="Hd9-s6-evS"/>
|
||||
<constraint firstItem="hp7-D3-7Oy" firstAttribute="top" secondItem="dc0-Fe-e3H" secondAttribute="top" id="frT-0b-VAZ"/>
|
||||
<constraint firstAttribute="bottom" secondItem="bhS-iM-Rym" secondAttribute="bottom" id="k3P-Eu-hAl"/>
|
||||
<constraint firstItem="bhS-iM-Rym" firstAttribute="top" secondItem="dc0-Fe-e3H" secondAttribute="top" id="lAa-M2-2H9"/>
|
||||
<constraint firstItem="hp7-D3-7Oy" firstAttribute="leading" secondItem="dc0-Fe-e3H" secondAttribute="leading" id="oaC-8J-Ylo"/>
|
||||
<constraint firstItem="bhS-iM-Rym" firstAttribute="leading" secondItem="dc0-Fe-e3H" secondAttribute="leading" id="uOv-ew-xID"/>
|
||||
<constraint firstAttribute="trailing" secondItem="hp7-D3-7Oy" secondAttribute="trailing" id="xyX-CM-6eu"/>
|
||||
<constraint firstAttribute="bottom" secondItem="hp7-D3-7Oy" secondAttribute="bottom" id="z2o-VQ-jtc"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<connections>
|
||||
<outlet property="subtitleLabel" destination="hSb-6T-owy" id="eSg-e2-ddE"/>
|
||||
<outlet property="titleLabel" destination="Shd-Nj-jla" id="sOA-w8-IDh"/>
|
||||
<outlet property="titleLabel2" destination="6qi-jY-2bC" id="q4q-vh-Ulc"/>
|
||||
<outlet property="view" destination="bhS-iM-Rym" id="H3E-xm-whs"/>
|
||||
<outlet property="view2" destination="hp7-D3-7Oy" id="U3K-dk-Bsc"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="75" y="184"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
</document>
|
||||
@@ -0,0 +1,58 @@
|
||||
|
||||
|
||||
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
// MARK: - Item
|
||||
|
||||
class LocationCollectionsButtonCellItem: TableAdapterItem {
|
||||
|
||||
init() {
|
||||
|
||||
let cellData = LocationCollectionsButtonCellData()
|
||||
|
||||
super.init(cellClass: LocationCollectionsButtonCell .self, cellData: cellData)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Data
|
||||
|
||||
class LocationCollectionsButtonCellData: TableAdapterCellData {
|
||||
|
||||
override public func cellHeight() -> CGFloat {
|
||||
return 124
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Cell
|
||||
|
||||
class LocationCollectionsButtonCell : TableAdapterCell {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
public var data: LocationCollectionsButtonCellData?
|
||||
|
||||
// MARK: Outlets
|
||||
|
||||
@IBOutlet private weak var removeLabel: UILabel?
|
||||
@IBOutlet private weak var addtoLabel: UILabel?
|
||||
@IBOutlet private weak var shareLabel: UILabel?
|
||||
|
||||
// MARK: Initialize
|
||||
|
||||
override func awakeFromNib() {
|
||||
separatorInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: CGFloat(Double.greatestFiniteMagnitude))
|
||||
}
|
||||
|
||||
override func fill(data: TableAdapterCellData?) {
|
||||
guard let data = data as? LocationCollectionsButtonCellData else { return }
|
||||
self.data = data
|
||||
|
||||
removeLabel?.text = _L("LNG_MAPS_REMOVE")
|
||||
addtoLabel?.text = "\(_L("LNG_MAPS_ADD")) \(_L("LNG_MAPS_TO"))..."
|
||||
shareLabel?.text = _L("LNG_MAPS_SHARE")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,203 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" id="f2l-3p-uee" customClass="LocationCollectionsButtonCell" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="124"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="f2l-3p-uee" id="3Bv-wN-gVG">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="124"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="VQ0-LA-XVs">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="124"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Vo4-nv-ZDg" customClass="DesignView" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="11" y="0.0" width="149" height="62"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="E3E-yX-aTV" customClass="DesignButton" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="5" y="5" width="139" height="52"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" red="0.50196078431372548" green="0.49803921568627452" blue="0.49803921568627452" alpha="0.15343324830190475" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="8"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</button>
|
||||
<button opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Ykx-zK-GhF">
|
||||
<rect key="frame" x="5" y="5" width="139" height="37"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="37" id="y9P-ba-qr7"/>
|
||||
</constraints>
|
||||
<state key="normal" image="trash.fill" catalog="system"/>
|
||||
</button>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Remove" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ADp-A0-9gD">
|
||||
<rect key="frame" x="35" y="39" width="79" height="13.5"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="11"/>
|
||||
<color key="textColor" systemColor="systemBlueColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="Ykx-zK-GhF" firstAttribute="leading" secondItem="Vo4-nv-ZDg" secondAttribute="leading" constant="5" id="6AF-ry-4Pc"/>
|
||||
<constraint firstAttribute="height" constant="62" id="6gG-Vr-mPN"/>
|
||||
<constraint firstItem="ADp-A0-9gD" firstAttribute="top" secondItem="Vo4-nv-ZDg" secondAttribute="top" constant="39" id="6n2-fF-OAA"/>
|
||||
<constraint firstItem="Ykx-zK-GhF" firstAttribute="top" secondItem="Vo4-nv-ZDg" secondAttribute="top" constant="5" id="U2w-fY-Idh"/>
|
||||
<constraint firstItem="ADp-A0-9gD" firstAttribute="leading" secondItem="Vo4-nv-ZDg" secondAttribute="leading" constant="35" id="WPf-xV-LPd"/>
|
||||
<constraint firstItem="E3E-yX-aTV" firstAttribute="top" secondItem="Vo4-nv-ZDg" secondAttribute="top" constant="5" id="WTY-LN-mbZ"/>
|
||||
<constraint firstAttribute="trailing" secondItem="ADp-A0-9gD" secondAttribute="trailing" constant="35" id="a8h-ss-s2L"/>
|
||||
<constraint firstItem="E3E-yX-aTV" firstAttribute="leading" secondItem="Vo4-nv-ZDg" secondAttribute="leading" constant="5" id="hg1-ME-nDH"/>
|
||||
<constraint firstAttribute="trailing" secondItem="E3E-yX-aTV" secondAttribute="trailing" constant="5" id="oAE-Fv-uRg"/>
|
||||
<constraint firstAttribute="bottom" secondItem="E3E-yX-aTV" secondAttribute="bottom" constant="5" id="qpg-oG-0mj"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Ykx-zK-GhF" secondAttribute="trailing" constant="5" id="vYV-Ja-chC"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hQA-wd-Zmp" customClass="DesignView" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="160" y="0.0" width="149" height="62"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="efr-fa-kpU" customClass="DesignButton" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="5" y="5" width="139" height="52"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" red="0.50196078431372548" green="0.49803921568627452" blue="0.49803921568627452" alpha="0.14885629251700677" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="8"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</button>
|
||||
<button opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="1mo-ty-kBd">
|
||||
<rect key="frame" x="5" y="5" width="139" height="37"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="37" id="URy-gD-Cuf"/>
|
||||
</constraints>
|
||||
<state key="normal" image="plus.app.fill" catalog="system">
|
||||
<color key="titleColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</state>
|
||||
</button>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Add to..." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bGT-rR-2GG">
|
||||
<rect key="frame" x="35" y="39" width="79" height="13.5"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="11"/>
|
||||
<color key="textColor" systemColor="systemBlueColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="efr-fa-kpU" firstAttribute="top" secondItem="hQA-wd-Zmp" secondAttribute="top" constant="5" id="4vP-lh-Kdv"/>
|
||||
<constraint firstAttribute="trailing" secondItem="efr-fa-kpU" secondAttribute="trailing" constant="5" id="BWd-rn-DLh"/>
|
||||
<constraint firstAttribute="trailing" secondItem="1mo-ty-kBd" secondAttribute="trailing" constant="5" id="ETa-4X-dcV"/>
|
||||
<constraint firstAttribute="bottom" secondItem="efr-fa-kpU" secondAttribute="bottom" constant="5" id="LJs-W3-seS"/>
|
||||
<constraint firstAttribute="trailing" secondItem="bGT-rR-2GG" secondAttribute="trailing" constant="35" id="Lup-6s-BoO"/>
|
||||
<constraint firstAttribute="height" constant="62" id="SQm-Ch-vpB"/>
|
||||
<constraint firstItem="efr-fa-kpU" firstAttribute="leading" secondItem="hQA-wd-Zmp" secondAttribute="leading" constant="5" id="TAV-Oj-sb0"/>
|
||||
<constraint firstItem="1mo-ty-kBd" firstAttribute="top" secondItem="hQA-wd-Zmp" secondAttribute="top" constant="5" id="Xbu-8c-R6E"/>
|
||||
<constraint firstItem="bGT-rR-2GG" firstAttribute="top" secondItem="hQA-wd-Zmp" secondAttribute="top" constant="39" id="kNQ-Ak-rxo"/>
|
||||
<constraint firstItem="1mo-ty-kBd" firstAttribute="leading" secondItem="hQA-wd-Zmp" secondAttribute="leading" constant="5" id="nkf-WT-TAx"/>
|
||||
<constraint firstItem="bGT-rR-2GG" firstAttribute="leading" secondItem="hQA-wd-Zmp" secondAttribute="leading" constant="35" id="wYc-tD-UdV"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="SvS-7a-R7X" customClass="DesignView" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="11" y="62" width="149" height="62"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="NyJ-lk-M8s" customClass="DesignButton" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="5" y="5" width="139" height="52"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" red="0.50196078431372548" green="0.49803921568627452" blue="0.49803921568627452" alpha="0.14633822279170067" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="8"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</button>
|
||||
<button opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="25I-2C-wuO">
|
||||
<rect key="frame" x="5" y="5" width="139" height="37"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="37" id="duj-ke-d0V"/>
|
||||
</constraints>
|
||||
<state key="normal" image="square.and.arrow.up" catalog="system"/>
|
||||
</button>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Share" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7fI-c1-e2H">
|
||||
<rect key="frame" x="35" y="39" width="79" height="13.5"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="11"/>
|
||||
<color key="textColor" systemColor="systemBlueColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="NyJ-lk-M8s" secondAttribute="bottom" constant="5" id="8xl-jG-iVA"/>
|
||||
<constraint firstItem="NyJ-lk-M8s" firstAttribute="top" secondItem="SvS-7a-R7X" secondAttribute="top" constant="5" id="CPz-Tf-zjk"/>
|
||||
<constraint firstItem="NyJ-lk-M8s" firstAttribute="leading" secondItem="SvS-7a-R7X" secondAttribute="leading" constant="5" id="In2-Rx-pvm"/>
|
||||
<constraint firstItem="25I-2C-wuO" firstAttribute="top" secondItem="SvS-7a-R7X" secondAttribute="top" constant="5" id="JKW-ey-rbo"/>
|
||||
<constraint firstAttribute="trailing" secondItem="NyJ-lk-M8s" secondAttribute="trailing" constant="5" id="L0X-gC-GlW"/>
|
||||
<constraint firstItem="7fI-c1-e2H" firstAttribute="top" secondItem="SvS-7a-R7X" secondAttribute="top" constant="39" id="Vxe-5Q-dKi"/>
|
||||
<constraint firstItem="25I-2C-wuO" firstAttribute="leading" secondItem="SvS-7a-R7X" secondAttribute="leading" constant="5" id="bJA-cc-2IO"/>
|
||||
<constraint firstAttribute="height" constant="62" id="g7m-AX-fxF"/>
|
||||
<constraint firstAttribute="trailing" secondItem="7fI-c1-e2H" secondAttribute="trailing" constant="35" id="r3F-h3-NbO"/>
|
||||
<constraint firstAttribute="trailing" secondItem="25I-2C-wuO" secondAttribute="trailing" constant="5" id="rhy-8I-deh"/>
|
||||
<constraint firstItem="7fI-c1-e2H" firstAttribute="leading" secondItem="SvS-7a-R7X" secondAttribute="leading" constant="35" id="z1N-7G-7KF"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="Vo4-nv-ZDg" firstAttribute="leading" secondItem="VQ0-LA-XVs" secondAttribute="leading" constant="11" id="2NG-Dr-lWy"/>
|
||||
<constraint firstItem="hQA-wd-Zmp" firstAttribute="width" secondItem="VQ0-LA-XVs" secondAttribute="width" multiplier="0.465625" id="OGA-qP-wwA"/>
|
||||
<constraint firstItem="SvS-7a-R7X" firstAttribute="leading" secondItem="VQ0-LA-XVs" secondAttribute="leading" constant="11" id="OU8-Mm-ser"/>
|
||||
<constraint firstItem="SvS-7a-R7X" firstAttribute="width" secondItem="VQ0-LA-XVs" secondAttribute="width" multiplier="0.465625" id="Qoe-qX-rhp"/>
|
||||
<constraint firstItem="Vo4-nv-ZDg" firstAttribute="width" secondItem="VQ0-LA-XVs" secondAttribute="width" multiplier="0.465625" id="U6a-ab-BZT"/>
|
||||
<constraint firstAttribute="trailing" secondItem="hQA-wd-Zmp" secondAttribute="trailing" constant="11" id="Uod-QW-ONJ"/>
|
||||
<constraint firstItem="hQA-wd-Zmp" firstAttribute="top" secondItem="VQ0-LA-XVs" secondAttribute="top" id="WdF-0d-Syi"/>
|
||||
<constraint firstAttribute="bottom" secondItem="SvS-7a-R7X" secondAttribute="bottom" id="XmE-y6-a4i"/>
|
||||
<constraint firstItem="Vo4-nv-ZDg" firstAttribute="top" secondItem="VQ0-LA-XVs" secondAttribute="top" id="gLf-kn-eoP"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="VQ0-LA-XVs" firstAttribute="leading" secondItem="3Bv-wN-gVG" secondAttribute="leading" id="HOr-oE-B9c"/>
|
||||
<constraint firstAttribute="bottom" secondItem="VQ0-LA-XVs" secondAttribute="bottom" id="Hom-vC-Hrm"/>
|
||||
<constraint firstItem="VQ0-LA-XVs" firstAttribute="top" secondItem="3Bv-wN-gVG" secondAttribute="top" id="Qej-Wc-azm"/>
|
||||
<constraint firstAttribute="trailing" secondItem="VQ0-LA-XVs" secondAttribute="trailing" id="mBu-rQ-FNW"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<connections>
|
||||
<outlet property="addtoLabel" destination="bGT-rR-2GG" id="ocp-Ix-Bv4"/>
|
||||
<outlet property="removeLabel" destination="ADp-A0-9gD" id="c9C-7B-866"/>
|
||||
<outlet property="shareLabel" destination="7fI-c1-e2H" id="TJ0-Ig-eLu"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="127.2" y="111.0944527736132"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="plus.app.fill" catalog="system" width="64" height="56"/>
|
||||
<image name="square.and.arrow.up" catalog="system" width="56" height="64"/>
|
||||
<image name="trash.fill" catalog="system" width="60" height="64"/>
|
||||
</resources>
|
||||
</document>
|
||||
@@ -0,0 +1,101 @@
|
||||
|
||||
|
||||
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
// MARK: - Item
|
||||
|
||||
class LocationCoordinateCellItem: TableAdapterItem {
|
||||
|
||||
init(title: String? = nil,
|
||||
subtitle: String? = nil,
|
||||
darkStyle: Bool = false) {
|
||||
|
||||
let cellData = LocationCoordinateCellData(title, subtitle, darkStyle)
|
||||
|
||||
super.init(cellClass: LocationCoordinateCell .self, cellData: cellData)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Data
|
||||
|
||||
class LocationCoordinateCellData: TableAdapterCellData {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
var title: String?
|
||||
var subtitle: String?
|
||||
var darkStyle: Bool
|
||||
|
||||
// MARK: Inits
|
||||
|
||||
init(_ title: String? = nil,
|
||||
_ subtitle: String? = nil,
|
||||
_ darkStyle: Bool) {
|
||||
|
||||
self.title = title
|
||||
self.subtitle = subtitle
|
||||
self.darkStyle = darkStyle
|
||||
|
||||
super.init()
|
||||
}
|
||||
|
||||
override public func cellHeight() -> CGFloat {
|
||||
return 89
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Cell
|
||||
|
||||
class LocationCoordinateCell : TableAdapterCell {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
public var data: LocationCoordinateCellData?
|
||||
|
||||
// MARK: Outlets
|
||||
|
||||
@IBOutlet override var selectedView: UIView? {
|
||||
didSet { }
|
||||
}
|
||||
|
||||
@IBOutlet weak var latitudeLabel: UILabel!
|
||||
@IBOutlet weak var latitudeValueLabel: UILabel!
|
||||
|
||||
@IBOutlet weak var longitudeLabel: UILabel!
|
||||
@IBOutlet weak var longitudeValueLabel: UILabel!
|
||||
|
||||
|
||||
@IBOutlet public weak var separatorView: UIView?
|
||||
@IBOutlet weak var separatorHeight: NSLayoutConstraint?
|
||||
|
||||
// MARK: Initialize
|
||||
|
||||
override func awakeFromNib() {
|
||||
separatorHeight?.constant = 0.5
|
||||
separatorInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: CGFloat(Double.greatestFiniteMagnitude))
|
||||
}
|
||||
|
||||
override func fill(data: TableAdapterCellData?) {
|
||||
guard let data = data as? LocationCoordinateCellData else { return }
|
||||
self.data = data
|
||||
|
||||
let color: UIColor = data.darkStyle ? .white : .black
|
||||
|
||||
latitudeLabel.text = _L("LNG_MAPS_LOCATION_LATITUDE")
|
||||
longitudeLabel.text = _L("LNG_MAPS_LOCATION_LONGITUDE")
|
||||
|
||||
latitudeLabel.textColor = color
|
||||
latitudeValueLabel.textColor = color
|
||||
|
||||
longitudeLabel.textColor = color
|
||||
longitudeValueLabel.textColor = color
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" id="f2l-3p-uee" customClass="LocationCoordinateCell" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="89"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="f2l-3p-uee" id="3Bv-wN-gVG">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="89"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="RUz-Xu-MJC">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="89"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2BW-OF-VOy">
|
||||
<rect key="frame" x="16" y="21" width="144" height="57"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Latitude" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="O4Z-GU-Zzm">
|
||||
<rect key="frame" x="0.0" y="6" width="66" height="20.5"/>
|
||||
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="55,6028" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PHa-x5-DVB">
|
||||
<rect key="frame" x="0.0" y="31" width="65" height="21"/>
|
||||
<fontDescription key="fontDescription" type="system" 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="width" constant="144" id="89O-59-1OW"/>
|
||||
<constraint firstItem="PHa-x5-DVB" firstAttribute="leading" secondItem="2BW-OF-VOy" secondAttribute="leading" id="8VJ-4l-1TM"/>
|
||||
<constraint firstItem="PHa-x5-DVB" firstAttribute="top" secondItem="O4Z-GU-Zzm" secondAttribute="bottom" constant="4.5" id="Zzw-W2-8T2"/>
|
||||
<constraint firstItem="O4Z-GU-Zzm" firstAttribute="leading" secondItem="2BW-OF-VOy" secondAttribute="leading" id="dde-7B-MTu"/>
|
||||
<constraint firstAttribute="height" constant="57" id="fzo-xh-OfY"/>
|
||||
<constraint firstItem="O4Z-GU-Zzm" firstAttribute="top" secondItem="2BW-OF-VOy" secondAttribute="top" constant="6" id="lI7-pR-gxX"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="GIz-uF-vcg">
|
||||
<rect key="frame" x="160" y="21" width="144" height="57"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Longitude" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1CC-IC-loe">
|
||||
<rect key="frame" x="0.0" y="6" width="80.5" height="20.5"/>
|
||||
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="37,6396" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OdR-09-IJM">
|
||||
<rect key="frame" x="0.0" y="31" width="63.5" height="21"/>
|
||||
<fontDescription key="fontDescription" type="system" 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 firstItem="OdR-09-IJM" firstAttribute="top" secondItem="1CC-IC-loe" secondAttribute="bottom" constant="4.5" id="AMf-N3-oDd"/>
|
||||
<constraint firstAttribute="width" constant="144" id="E6C-hB-I7b"/>
|
||||
<constraint firstItem="OdR-09-IJM" firstAttribute="leading" secondItem="GIz-uF-vcg" secondAttribute="leading" id="JfJ-db-3F4"/>
|
||||
<constraint firstItem="1CC-IC-loe" firstAttribute="leading" secondItem="GIz-uF-vcg" secondAttribute="leading" id="QWy-5B-ZYq"/>
|
||||
<constraint firstItem="1CC-IC-loe" firstAttribute="top" secondItem="GIz-uF-vcg" secondAttribute="top" constant="6" id="TiE-eN-pF4"/>
|
||||
<constraint firstAttribute="height" constant="57" id="WWh-bP-ydX"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cn6-BJ-hcD">
|
||||
<rect key="frame" x="16" y="83" width="288" height="1"/>
|
||||
<color key="backgroundColor" red="0.50196078431372548" green="0.50196078431372548" blue="0.50196078431372548" alpha="0.59946322278911568" colorSpace="custom" customColorSpace="displayP3"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="1" id="vRG-Ta-FdW"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="GIz-uF-vcg" firstAttribute="centerX" secondItem="RUz-Xu-MJC" secondAttribute="centerX" constant="72" id="BEO-em-49E"/>
|
||||
<constraint firstAttribute="bottom" secondItem="cn6-BJ-hcD" secondAttribute="bottom" constant="5" id="Dcz-1e-Ybc"/>
|
||||
<constraint firstAttribute="trailing" secondItem="cn6-BJ-hcD" secondAttribute="trailing" constant="16" id="I29-Mr-3xf"/>
|
||||
<constraint firstItem="cn6-BJ-hcD" firstAttribute="leading" secondItem="RUz-Xu-MJC" secondAttribute="leading" constant="16" id="OMu-nn-Dgd"/>
|
||||
<constraint firstItem="GIz-uF-vcg" firstAttribute="top" secondItem="RUz-Xu-MJC" secondAttribute="top" constant="21" id="SVk-Xc-w1r"/>
|
||||
<constraint firstItem="2BW-OF-VOy" firstAttribute="top" secondItem="RUz-Xu-MJC" secondAttribute="top" constant="21" id="dbP-ec-blL"/>
|
||||
<constraint firstItem="2BW-OF-VOy" firstAttribute="leading" secondItem="RUz-Xu-MJC" secondAttribute="leading" constant="16" id="gfU-Dx-kjg"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="RUz-Xu-MJC" secondAttribute="bottom" id="TfI-Eg-mWd"/>
|
||||
<constraint firstItem="RUz-Xu-MJC" firstAttribute="leading" secondItem="3Bv-wN-gVG" secondAttribute="leading" id="iEV-l0-gOa"/>
|
||||
<constraint firstAttribute="trailing" secondItem="RUz-Xu-MJC" secondAttribute="trailing" id="mgV-gD-hya"/>
|
||||
<constraint firstItem="RUz-Xu-MJC" firstAttribute="top" secondItem="3Bv-wN-gVG" secondAttribute="top" id="zAl-Wo-TEF"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<connections>
|
||||
<outlet property="latitudeLabel" destination="O4Z-GU-Zzm" id="q8t-B4-gDz"/>
|
||||
<outlet property="latitudeValueLabel" destination="PHa-x5-DVB" id="sn1-nr-Wa9"/>
|
||||
<outlet property="longitudeLabel" destination="1CC-IC-loe" id="526-1N-8Kg"/>
|
||||
<outlet property="longitudeValueLabel" destination="OdR-09-IJM" id="x7D-uU-wbn"/>
|
||||
<outlet property="separatorHeight" destination="vRG-Ta-FdW" id="Rmg-3c-eJe"/>
|
||||
<outlet property="separatorView" destination="cn6-BJ-hcD" id="aVb-5i-c3m"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="127.2" y="111.0944527736132"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
</document>
|
||||
@@ -0,0 +1,83 @@
|
||||
|
||||
|
||||
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
// MARK: - Item
|
||||
|
||||
class LocationTextCellItem: TableAdapterItem {
|
||||
|
||||
init(title: String? = nil,
|
||||
image: UIImage? = nil) {
|
||||
|
||||
let cellData = LocationTextCellData(title, image)
|
||||
|
||||
super.init(cellClass: LocationTextCell.self, cellData: cellData)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Data
|
||||
|
||||
class LocationTextCellData: TableAdapterCellData {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
var title: String?
|
||||
var image: UIImage?
|
||||
|
||||
// MARK: Inits
|
||||
|
||||
init(_ title: String? = nil,
|
||||
_ image: UIImage? = nil) {
|
||||
|
||||
self.title = title
|
||||
self.image = image
|
||||
|
||||
super.init()
|
||||
}
|
||||
|
||||
override public func cellHeight() -> CGFloat {
|
||||
return 61
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Cell
|
||||
|
||||
class LocationTextCell : TableAdapterCell {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
public var data: LocationTextCellData?
|
||||
|
||||
// MARK: Outlets
|
||||
|
||||
@IBOutlet override var selectedView: UIView? {
|
||||
didSet { }
|
||||
}
|
||||
|
||||
@IBOutlet private weak var titleLabel: UILabel?
|
||||
@IBOutlet private weak var imageButton: DesignButton?
|
||||
|
||||
// MARK: Initialize
|
||||
|
||||
override func awakeFromNib() {
|
||||
separatorInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: CGFloat(Double.greatestFiniteMagnitude))
|
||||
}
|
||||
|
||||
override func fill(data: TableAdapterCellData?) {
|
||||
guard let data = data as? LocationTextCellData else { return }
|
||||
self.data = data
|
||||
|
||||
titleLabel?.text = data.title ?? ""
|
||||
|
||||
if let image = data.image {
|
||||
imageButton?.setImage(image, for: .normal)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" id="f2l-3p-uee" customClass="LocationTextCell" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="61"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="f2l-3p-uee" id="3Bv-wN-gVG">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="61"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ZzU-qf-hXw">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="61"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Text Add " textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QwB-2C-q0H">
|
||||
<rect key="frame" x="16" y="20" width="235" height="21"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" systemColor="systemBlueColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<button opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ba2-IZ-f9B" customClass="DesignButton" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="267" y="12" width="37" height="37"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="37" id="gJa-3f-2SK"/>
|
||||
<constraint firstAttribute="width" constant="37" id="ntV-dU-a1e"/>
|
||||
</constraints>
|
||||
<state key="normal" image="plus" catalog="system"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" white="0.5" alpha="0.15149340986653059" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="-1"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</button>
|
||||
<view alpha="0.0" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Pfh-pn-hig">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="61"/>
|
||||
<color key="backgroundColor" white="0.49936224489795916" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="ba2-IZ-f9B" secondAttribute="trailing" constant="16" id="3Yu-nS-yuC"/>
|
||||
<constraint firstItem="ba2-IZ-f9B" firstAttribute="leading" secondItem="QwB-2C-q0H" secondAttribute="trailing" constant="16" id="4oi-lH-TxJ"/>
|
||||
<constraint firstItem="QwB-2C-q0H" firstAttribute="top" secondItem="ZzU-qf-hXw" secondAttribute="top" constant="20" id="7sc-F2-vlU"/>
|
||||
<constraint firstItem="Pfh-pn-hig" firstAttribute="top" secondItem="ZzU-qf-hXw" secondAttribute="top" id="N2J-bw-NMz"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Pfh-pn-hig" secondAttribute="trailing" id="Q9d-v6-Vsd"/>
|
||||
<constraint firstItem="Pfh-pn-hig" firstAttribute="leading" secondItem="ZzU-qf-hXw" secondAttribute="leading" id="iLD-eM-g7P"/>
|
||||
<constraint firstAttribute="bottom" secondItem="Pfh-pn-hig" secondAttribute="bottom" id="m7s-9M-nK9"/>
|
||||
<constraint firstItem="ba2-IZ-f9B" firstAttribute="top" secondItem="ZzU-qf-hXw" secondAttribute="top" constant="12" id="rZo-L6-Mr3"/>
|
||||
<constraint firstItem="QwB-2C-q0H" firstAttribute="leading" secondItem="ZzU-qf-hXw" secondAttribute="leading" constant="16" id="rgu-6j-XZ5"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="ZzU-qf-hXw" secondAttribute="bottom" id="F21-Rd-n69"/>
|
||||
<constraint firstItem="ZzU-qf-hXw" firstAttribute="top" secondItem="3Bv-wN-gVG" secondAttribute="top" id="LsM-xz-qr0"/>
|
||||
<constraint firstItem="ZzU-qf-hXw" firstAttribute="leading" secondItem="3Bv-wN-gVG" secondAttribute="leading" id="o5l-Fh-1Lq"/>
|
||||
<constraint firstAttribute="trailing" secondItem="ZzU-qf-hXw" secondAttribute="trailing" id="vip-iJ-yaa"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<connections>
|
||||
<outlet property="imageButton" destination="ba2-IZ-f9B" id="F81-2U-qWw"/>
|
||||
<outlet property="selectedView" destination="Pfh-pn-hig" id="SL5-G9-vl3"/>
|
||||
<outlet property="titleLabel" destination="QwB-2C-q0H" id="KBr-kK-scj"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="126.40000000000001" y="111.0944527736132"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="plus" catalog="system" width="64" height="56"/>
|
||||
</resources>
|
||||
</document>
|
||||
@@ -0,0 +1,36 @@
|
||||
//
|
||||
// MapsCollectionCellView.swift
|
||||
// PatternsSwift
|
||||
//
|
||||
// Created by mrustaa on 13/05/2020.
|
||||
// Copyright © 2020 mrusta. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
@IBDesignable
|
||||
class MapsCollectionCellView: UIView {
|
||||
|
||||
override func draw(_ rect: CGRect) {
|
||||
|
||||
//// Color Declarations
|
||||
let color10 = Colors.rgba(185, 185, 185, 0.37)
|
||||
|
||||
//// Bezier Drawing
|
||||
let bezierPath = UIBezierPath()
|
||||
bezierPath.move(to: CGPoint(x: 4, y: 51))
|
||||
bezierPath.addCurve(to: CGPoint(x: 4, y: 16), controlPoint1: CGPoint(x: 3.9, y: 44.69), controlPoint2: CGPoint(x: 4, y: 24.46))
|
||||
bezierPath.addCurve(to: CGPoint(x: 16, y: 4), controlPoint1: CGPoint(x: 4, y: 6), controlPoint2: CGPoint(x: 6, y: 4))
|
||||
bezierPath.addCurve(to: CGPoint(x: 51, y: 4), controlPoint1: CGPoint(x: 26, y: 4), controlPoint2: CGPoint(x: 51, y: 4))
|
||||
bezierPath.addCurve(to: CGPoint(x: 44, y: -0), controlPoint1: CGPoint(x: 51, y: 4), controlPoint2: CGPoint(x: 50, y: -0))
|
||||
bezierPath.addCurve(to: CGPoint(x: 7, y: -0), controlPoint1: CGPoint(x: 38, y: -0), controlPoint2: CGPoint(x: 11, y: -0))
|
||||
bezierPath.addCurve(to: CGPoint(x: 0, y: 7), controlPoint1: CGPoint(x: 3, y: -0), controlPoint2: CGPoint(x: 0, y: 2))
|
||||
bezierPath.addCurve(to: CGPoint(x: 0, y: 44), controlPoint1: CGPoint(x: 0, y: 12), controlPoint2: CGPoint(x: 0, y: 34.5))
|
||||
bezierPath.addCurve(to: CGPoint(x: 4, y: 51), controlPoint1: CGPoint(x: 0, y: 50), controlPoint2: CGPoint(x: 4, y: 51))
|
||||
bezierPath.close()
|
||||
color10.setFill()
|
||||
bezierPath.fill()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
|
||||
|
||||
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
// MARK: - Item
|
||||
|
||||
class MapsCollectionsCellItem: TableAdapterItem {
|
||||
|
||||
init() {
|
||||
let cellData = MapsCollectionsCellData()
|
||||
super.init(cellClass: MapsCollectionsCell .self, cellData: cellData)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Data
|
||||
|
||||
class MapsCollectionsCellData: TableAdapterCellData {
|
||||
|
||||
// MARK: Inits
|
||||
|
||||
override public func cellHeight() -> CGFloat {
|
||||
return 98
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Cell
|
||||
|
||||
class MapsCollectionsCell : TableAdapterCell {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
public var data: MapsCollectionsCellData?
|
||||
|
||||
// MARK: Outlets
|
||||
|
||||
@IBOutlet override var selectedView: UIView? {
|
||||
didSet { }
|
||||
}
|
||||
|
||||
@IBOutlet private weak var titleLabel: UILabel?
|
||||
|
||||
var collView: MapsCollectionCellView!
|
||||
|
||||
// MARK: Initialize
|
||||
|
||||
override func awakeFromNib() {
|
||||
separatorInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: CGFloat(Double.greatestFiniteMagnitude))
|
||||
}
|
||||
|
||||
override func fill(data: TableAdapterCellData?) {
|
||||
guard let data = data as? MapsCollectionsCellData else { return }
|
||||
self.data = data
|
||||
|
||||
titleLabel?.text = _L("LNG_MAPS_NEW_COLLECTION")
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="ADc-Wu-299" customClass="MapsCollectionsCell" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="98"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="ADc-Wu-299" id="Qrk-n6-aPT">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="98"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ONT-71-dU0">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="98"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="36L-DF-KyB" customClass="MapsCollectionCellView" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="15" y="11" width="63" height="63"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="63" id="7a0-MR-jPv"/>
|
||||
<constraint firstAttribute="height" constant="63" id="Nwc-Ga-6nM"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Waf-Nj-agf" customClass="DesignView" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="22" y="18" width="52" height="52"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hv9-26-5Vp" customClass="DesignButton" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="52" height="52"/>
|
||||
<state key="normal" image="plus" catalog="system"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="-1"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</button>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="hv9-26-5Vp" secondAttribute="bottom" id="1Ky-au-vkC"/>
|
||||
<constraint firstAttribute="width" constant="52" id="Mpc-sk-GR8"/>
|
||||
<constraint firstAttribute="height" constant="52" id="cMa-eX-dve"/>
|
||||
<constraint firstAttribute="trailing" secondItem="hv9-26-5Vp" secondAttribute="trailing" id="fow-pe-M85"/>
|
||||
<constraint firstItem="hv9-26-5Vp" firstAttribute="leading" secondItem="Waf-Nj-agf" secondAttribute="leading" id="oDR-ED-g1H"/>
|
||||
<constraint firstItem="hv9-26-5Vp" firstAttribute="top" secondItem="Waf-Nj-agf" secondAttribute="top" id="y5i-Js-JiV"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="5"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" red="0.72549019607843135" green="0.72549019607843135" blue="0.72549019607843135" alpha="0.37034970238095244" colorSpace="custom" customColorSpace="displayP3"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
|
||||
<real key="value" value="2.5"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="New Collection..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="D9Q-RB-lNN">
|
||||
<rect key="frame" x="87" y="29" width="228" height="24"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="20"/>
|
||||
<color key="textColor" systemColor="systemBlueColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="D9Q-RB-lNN" secondAttribute="trailing" constant="60" id="Bcg-JX-baQ"/>
|
||||
<constraint firstItem="D9Q-RB-lNN" firstAttribute="top" secondItem="ONT-71-dU0" secondAttribute="top" constant="29" id="Hg5-5V-wcW"/>
|
||||
<constraint firstItem="D9Q-RB-lNN" firstAttribute="leading" secondItem="ONT-71-dU0" secondAttribute="leading" constant="87" id="Q5e-tb-mAM"/>
|
||||
<constraint firstItem="36L-DF-KyB" firstAttribute="leading" secondItem="ONT-71-dU0" secondAttribute="leading" constant="15" id="TR4-Ov-ua5"/>
|
||||
<constraint firstItem="Waf-Nj-agf" firstAttribute="top" secondItem="ONT-71-dU0" secondAttribute="top" constant="18" id="VrY-Ra-h2l"/>
|
||||
<constraint firstItem="36L-DF-KyB" firstAttribute="top" secondItem="ONT-71-dU0" secondAttribute="top" constant="11" id="mp3-Pl-NrN"/>
|
||||
<constraint firstItem="Waf-Nj-agf" firstAttribute="leading" secondItem="ONT-71-dU0" secondAttribute="leading" constant="22" id="uM0-V8-Jgj"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view alpha="0.0" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="SBX-VY-QTn" customClass="DesignView" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="84"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="84" id="B1M-3U-LVV"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" white="0.50026573129251706" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
|
||||
<size key="value" width="0.0" height="0.0"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="SBX-VY-QTn" firstAttribute="top" secondItem="Qrk-n6-aPT" secondAttribute="top" id="3lr-vE-cPQ"/>
|
||||
<constraint firstItem="ONT-71-dU0" firstAttribute="top" secondItem="Qrk-n6-aPT" secondAttribute="top" id="8EI-DT-HsN"/>
|
||||
<constraint firstAttribute="trailing" secondItem="ONT-71-dU0" secondAttribute="trailing" id="FbH-It-kU1"/>
|
||||
<constraint firstItem="ONT-71-dU0" firstAttribute="leading" secondItem="Qrk-n6-aPT" secondAttribute="leading" id="Ik2-or-IDu"/>
|
||||
<constraint firstAttribute="trailing" secondItem="SBX-VY-QTn" secondAttribute="trailing" id="hCN-sB-xVr"/>
|
||||
<constraint firstItem="SBX-VY-QTn" firstAttribute="leading" secondItem="Qrk-n6-aPT" secondAttribute="leading" id="ngv-cW-XAc"/>
|
||||
<constraint firstAttribute="bottom" secondItem="ONT-71-dU0" secondAttribute="bottom" id="uF5-Cl-Uxg"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<connections>
|
||||
<outlet property="selectedView" destination="SBX-VY-QTn" id="f4e-f3-aNj"/>
|
||||
<outlet property="titleLabel" destination="D9Q-RB-lNN" id="FUw-um-oFd"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="127.2" y="111.54422788605699"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="plus" catalog="system" width="64" height="56"/>
|
||||
</resources>
|
||||
</document>
|
||||
@@ -0,0 +1,98 @@
|
||||
|
||||
|
||||
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
// MARK: - Item
|
||||
|
||||
class MapsFavoritesCellItem: TableAdapterItem {
|
||||
|
||||
init(title: String? = nil,
|
||||
subtitle: String? = nil,
|
||||
image: UIImage? = nil,
|
||||
darkStyle: Bool = false,
|
||||
clickCallback: (() -> Void)? = nil) {
|
||||
|
||||
let cellData = MapsFavoritesCellData(title, subtitle, darkStyle, clickCallback)
|
||||
|
||||
super.init(cellClass: MapsFavoritesCell.self, cellData: cellData)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Data
|
||||
|
||||
class MapsFavoritesCellData: TableAdapterCellData {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
var title: String?
|
||||
var subtitle: String?
|
||||
var darkStyle: Bool
|
||||
var clickCallback: (() -> Void)?
|
||||
|
||||
// MARK: Inits
|
||||
|
||||
init(_ title: String? = nil,
|
||||
_ subtitle: String? = nil,
|
||||
_ darkStyle: Bool,
|
||||
_ clickCallback: (() -> Void)?) {
|
||||
|
||||
self.title = title
|
||||
self.subtitle = subtitle
|
||||
self.darkStyle = darkStyle
|
||||
self.clickCallback = clickCallback
|
||||
|
||||
super.init()
|
||||
}
|
||||
|
||||
override public func cellHeight() -> CGFloat {
|
||||
return 137
|
||||
}
|
||||
|
||||
class func collectionItems(darkStyle: Bool = false, clickCallback: (() -> Void)? = nil) -> [CollectionAdapterItem] {
|
||||
var items: [CollectionAdapterItem] = []
|
||||
items.append( MapsFavoriteItem(title: _L("LNG_MAPS_HOME"), subtitle: _L("LNG_MAPS_ADD"), colorType: .blue, image: UIImage(systemName:"house.fill"), darkStyle: darkStyle, clickCallback: { clickCallback?() }) )
|
||||
items.append( MapsFavoriteItem(title: _L("LNG_MAPS_WORK"), subtitle: _L("LNG_MAPS_ADD"), colorType: .brown, image: UIImage(systemName: "briefcase.fill"), darkStyle: darkStyle, clickCallback: { clickCallback?() }) )
|
||||
items.append( MapsFavoriteItem(title: _L("LNG_MAPS_STREET"), subtitle: "", colorType: .red, image: UIImage(systemName: "mappin"), darkStyle: darkStyle, clickCallback: { clickCallback?() }) )
|
||||
items.append( MapsFavoriteItem(title: _L("LNG_MAPS_SCORE"), subtitle: "", colorType: .orange, image: UIImage(systemName: "cart.fill"), darkStyle: darkStyle, clickCallback: { clickCallback?() }) )
|
||||
items.append( MapsFavoriteItem(title: _L("LNG_MAPS_STREET"), subtitle: "", colorType: .yellow, image: UIImage(systemName: "person.circle.fill"), darkStyle: darkStyle, clickCallback: { clickCallback?() }) )
|
||||
items.append( MapsFavoriteItem(title: _L("LNG_MAPS_ADD"), subtitle: "", colorType: .gray, image: UIImage(systemName: "plus"), darkStyle: darkStyle, clickCallback: { clickCallback?() }) )
|
||||
return items
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Cell
|
||||
|
||||
class MapsFavoritesCell: TableAdapterCell {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
public var data: MapsFavoritesCellData?
|
||||
|
||||
// MARK: Outlets
|
||||
|
||||
@IBOutlet weak var colletionView: CollectionAdapterView!
|
||||
var items: [CollectionAdapterItem] = []
|
||||
|
||||
// MARK: Initialize
|
||||
|
||||
override func awakeFromNib() {
|
||||
separatorInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: CGFloat(Double.greatestFiniteMagnitude))
|
||||
}
|
||||
|
||||
override func fill(data: TableAdapterCellData?) {
|
||||
guard let data = data as? MapsFavoritesCellData else { return }
|
||||
self.data = data
|
||||
|
||||
items = []
|
||||
|
||||
items = MapsFavoritesCellData.collectionItems(darkStyle: data.darkStyle, clickCallback: data.clickCallback)
|
||||
|
||||
colletionView.set(items: items)
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="none" indentationWidth="10" id="ADc-Wu-299" customClass="MapsFavoritesCell" customModule="ContainerControllerSwift_Example" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="137"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="ADc-Wu-299" id="Qrk-n6-aPT">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="137"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" alwaysBounceHorizontal="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="none" translatesAutoresizingMaskIntoConstraints="NO" id="rJA-Ae-lwF" customClass="CollectionAdapterView" customModule="ContainerControllerSwift">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="137"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" minimumLineSpacing="0.0" minimumInteritemSpacing="0.0" id="8zy-3T-TFU">
|
||||
<size key="itemSize" width="50" height="50"/>
|
||||
<size key="headerReferenceSize" width="0.0" height="0.0"/>
|
||||
<size key="footerReferenceSize" width="0.0" height="0.0"/>
|
||||
<inset key="sectionInset" minX="2" minY="0.0" maxX="2" maxY="0.0"/>
|
||||
</collectionViewFlowLayout>
|
||||
</collectionView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="rJA-Ae-lwF" secondAttribute="bottom" id="aeV-Wh-BNT"/>
|
||||
<constraint firstItem="rJA-Ae-lwF" firstAttribute="leading" secondItem="Qrk-n6-aPT" secondAttribute="leading" id="e8C-5p-MSj"/>
|
||||
<constraint firstItem="rJA-Ae-lwF" firstAttribute="top" secondItem="Qrk-n6-aPT" secondAttribute="top" id="jAy-ZV-yST"/>
|
||||
<constraint firstAttribute="trailing" secondItem="rJA-Ae-lwF" secondAttribute="trailing" id="whc-9V-gH6"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<connections>
|
||||
<outlet property="colletionView" destination="rJA-Ae-lwF" id="Y2o-G6-tdn"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="127.2" y="111.0944527736132"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
</document>
|
||||
@@ -0,0 +1,108 @@
|
||||
|
||||
|
||||
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
enum MapsLocationCellColorType {
|
||||
case red
|
||||
case black
|
||||
}
|
||||
|
||||
// MARK: - Item
|
||||
|
||||
class MapsLocationCellItem: TableAdapterItem {
|
||||
|
||||
init(title: String? = nil,
|
||||
subtitle: String? = nil,
|
||||
colorType: MapsLocationCellColorType,
|
||||
darkStyle: Bool = false) {
|
||||
|
||||
|
||||
let cellData = MapsLocationCellData(title, subtitle, colorType, darkStyle)
|
||||
|
||||
super.init(cellClass: MapsLocationCell.self, cellData: cellData)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Data
|
||||
|
||||
class MapsLocationCellData: TableAdapterCellData {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
var title: String?
|
||||
var subtitle: String?
|
||||
var colorType: MapsLocationCellColorType
|
||||
var darkStyle: Bool
|
||||
|
||||
// MARK: Inits
|
||||
|
||||
init(_ title: String? = nil,
|
||||
_ subtitle: String? = nil,
|
||||
_ colorType: MapsLocationCellColorType,
|
||||
_ darkStyle: Bool) {
|
||||
|
||||
self.title = title
|
||||
self.subtitle = subtitle
|
||||
self.colorType = colorType
|
||||
self.darkStyle = darkStyle
|
||||
|
||||
super.init()
|
||||
}
|
||||
|
||||
override public func cellHeight() -> CGFloat {
|
||||
return 75
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Cell
|
||||
|
||||
class MapsLocationCell: TableAdapterCell {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
public var data: MapsLocationCellData?
|
||||
|
||||
// MARK: Outlets
|
||||
|
||||
@IBOutlet override var selectedView: UIView? {
|
||||
didSet { }
|
||||
}
|
||||
|
||||
@IBOutlet weak var circleBlackView: DesignView!
|
||||
@IBOutlet weak var circleView: DesignView!
|
||||
@IBOutlet private weak var titleLabel: UILabel?
|
||||
@IBOutlet private weak var subtitleLabel: UILabel?
|
||||
|
||||
// MARK: Initialize
|
||||
|
||||
override func awakeFromNib() {
|
||||
}
|
||||
|
||||
// MARK: Initialize
|
||||
|
||||
override func fill(data: TableAdapterCellData?) {
|
||||
guard let data = data as? MapsLocationCellData else { return }
|
||||
self.data = data
|
||||
|
||||
titleLabel?.textColor = data.darkStyle ? .white : .black
|
||||
|
||||
|
||||
if data.colorType == .red {
|
||||
circleView.alpha = 1.0
|
||||
circleBlackView.alpha = 0.0
|
||||
} else {
|
||||
circleView.alpha = 0.0
|
||||
circleBlackView.alpha = 1.0
|
||||
}
|
||||
|
||||
titleLabel?.text = data.title ?? ""
|
||||
subtitleLabel?.text = data.subtitle ?? ""
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" id="ADc-Wu-299" customClass="MapsLocationCell" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="75"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="ADc-Wu-299" id="Qrk-n6-aPT">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="75"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="kD1-Sb-cwH">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="75"/>
|
||||
<subviews>
|
||||
<view alpha="0.0" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UsU-8x-BRH" customClass="DesignView" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="14" y="22" width="31" height="31"/>
|
||||
<subviews>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="arrow.up" catalog="system" translatesAutoresizingMaskIntoConstraints="NO" id="N8r-bF-Tyg">
|
||||
<rect key="frame" x="6" y="7" width="19" height="18"/>
|
||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<preferredSymbolConfiguration key="preferredSymbolConfiguration" weight="bold"/>
|
||||
</imageView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="31" id="P4w-wD-bPI"/>
|
||||
<constraint firstAttribute="width" constant="31" id="p93-3G-SXo"/>
|
||||
<constraint firstItem="N8r-bF-Tyg" firstAttribute="leading" secondItem="UsU-8x-BRH" secondAttribute="leading" constant="6" id="q8x-q6-utm"/>
|
||||
<constraint firstAttribute="bottom" secondItem="N8r-bF-Tyg" secondAttribute="bottom" constant="5" id="qcd-mi-KdL"/>
|
||||
<constraint firstItem="N8r-bF-Tyg" firstAttribute="top" secondItem="UsU-8x-BRH" secondAttribute="top" constant="6" id="xcE-jY-e10"/>
|
||||
<constraint firstAttribute="trailing" secondItem="N8r-bF-Tyg" secondAttribute="trailing" constant="6" id="zHh-aF-g0I"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" red="0.30196078431372547" green="0.30196078431372547" blue="0.30196078431372547" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="-1"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="a1g-wA-sCi" customClass="DesignView" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="14" y="22" width="31" height="31"/>
|
||||
<subviews>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="mappin" catalog="system" translatesAutoresizingMaskIntoConstraints="NO" id="P1E-az-wCH">
|
||||
<rect key="frame" x="6" y="6" width="19" height="20"/>
|
||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</imageView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="P1E-az-wCH" secondAttribute="trailing" constant="6" id="5iM-hi-FJn"/>
|
||||
<constraint firstAttribute="bottom" secondItem="P1E-az-wCH" secondAttribute="bottom" constant="4.5" id="K53-lF-t7q"/>
|
||||
<constraint firstItem="P1E-az-wCH" firstAttribute="leading" secondItem="a1g-wA-sCi" secondAttribute="leading" constant="6" id="L6F-0e-bdh"/>
|
||||
<constraint firstAttribute="width" secondItem="a1g-wA-sCi" secondAttribute="height" multiplier="1:1" id="TxY-03-Gua"/>
|
||||
<constraint firstAttribute="width" constant="31" id="bv4-z2-TzD"/>
|
||||
<constraint firstAttribute="height" constant="31" id="eff-hg-ZnM"/>
|
||||
<constraint firstItem="P1E-az-wCH" firstAttribute="top" secondItem="a1g-wA-sCi" secondAttribute="top" constant="6.5" id="fk2-fG-MrQ"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" red="0.92156862750000001" green="0.37647058820000001" blue="0.27450980390000002" alpha="0.88113839289999996" colorSpace="custom" customColorSpace="displayP3"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
|
||||
<real key="value" value="-1"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Marked Location" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ULh-fe-Uqb">
|
||||
<rect key="frame" x="56" y="16" width="305" height="21"/>
|
||||
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Directions from My Location" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DcB-qc-BNr">
|
||||
<rect key="frame" x="56" y="40" width="305" height="18"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="15"/>
|
||||
<color key="textColor" systemColor="systemGrayColor" red="0.5568627451" green="0.5568627451" blue="0.57647058819999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="UsU-8x-BRH" firstAttribute="top" secondItem="kD1-Sb-cwH" secondAttribute="top" constant="22" id="5VC-wk-gC3"/>
|
||||
<constraint firstItem="ULh-fe-Uqb" firstAttribute="top" secondItem="kD1-Sb-cwH" secondAttribute="top" constant="16" id="BvZ-um-m4Y"/>
|
||||
<constraint firstAttribute="trailing" secondItem="ULh-fe-Uqb" secondAttribute="trailing" constant="14" id="GgZ-Kv-5dU"/>
|
||||
<constraint firstItem="DcB-qc-BNr" firstAttribute="leading" secondItem="kD1-Sb-cwH" secondAttribute="leading" constant="56" id="RWS-Df-5Jh"/>
|
||||
<constraint firstItem="a1g-wA-sCi" firstAttribute="leading" secondItem="kD1-Sb-cwH" secondAttribute="leading" constant="14" id="Vhr-IP-rYN"/>
|
||||
<constraint firstAttribute="trailing" secondItem="DcB-qc-BNr" secondAttribute="trailing" constant="14" id="Vmx-8C-hhR"/>
|
||||
<constraint firstItem="DcB-qc-BNr" firstAttribute="top" secondItem="ULh-fe-Uqb" secondAttribute="bottom" constant="3" id="YBL-iv-C3y"/>
|
||||
<constraint firstItem="ULh-fe-Uqb" firstAttribute="leading" secondItem="kD1-Sb-cwH" secondAttribute="leading" constant="56" id="ii3-fQ-iff"/>
|
||||
<constraint firstItem="a1g-wA-sCi" firstAttribute="top" secondItem="kD1-Sb-cwH" secondAttribute="top" constant="22" id="tHa-TF-dAm"/>
|
||||
<constraint firstItem="UsU-8x-BRH" firstAttribute="leading" secondItem="kD1-Sb-cwH" secondAttribute="leading" constant="14" id="xev-IW-FA3"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view alpha="0.0" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="SBX-VY-QTn" customClass="DesignView" customModule="PatternsSwift" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="75"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="fillColor">
|
||||
<color key="value" white="0.49593431122448978" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="shadowColor">
|
||||
<color key="value" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
|
||||
<size key="value" width="0.0" height="0.0"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
|
||||
<real key="value" value="10"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
|
||||
<real key="value" value="3"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="kD1-Sb-cwH" secondAttribute="bottom" id="3C6-i0-2DF"/>
|
||||
<constraint firstItem="SBX-VY-QTn" firstAttribute="top" secondItem="Qrk-n6-aPT" secondAttribute="top" id="3lr-vE-cPQ"/>
|
||||
<constraint firstAttribute="bottom" secondItem="SBX-VY-QTn" secondAttribute="bottom" id="MBj-f5-7vA"/>
|
||||
<constraint firstItem="kD1-Sb-cwH" firstAttribute="top" secondItem="Qrk-n6-aPT" secondAttribute="top" id="Yhe-uG-Vv1"/>
|
||||
<constraint firstAttribute="trailing" secondItem="SBX-VY-QTn" secondAttribute="trailing" id="hCN-sB-xVr"/>
|
||||
<constraint firstItem="SBX-VY-QTn" firstAttribute="leading" secondItem="Qrk-n6-aPT" secondAttribute="leading" id="ngv-cW-XAc"/>
|
||||
<constraint firstItem="kD1-Sb-cwH" firstAttribute="leading" secondItem="Qrk-n6-aPT" secondAttribute="leading" id="opY-th-YE0"/>
|
||||
<constraint firstAttribute="trailing" secondItem="kD1-Sb-cwH" secondAttribute="trailing" id="tXN-YA-aJn"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<connections>
|
||||
<outlet property="circleBlackView" destination="UsU-8x-BRH" id="6Id-uH-dEY"/>
|
||||
<outlet property="circleView" destination="a1g-wA-sCi" id="D6w-W3-oFE"/>
|
||||
<outlet property="selectedView" destination="SBX-VY-QTn" id="f4e-f3-aNj"/>
|
||||
<outlet property="subtitleLabel" destination="DcB-qc-BNr" id="XIU-C1-zpy"/>
|
||||
<outlet property="titleLabel" destination="ULh-fe-Uqb" id="gmt-Jg-Obo"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="127.2" y="111.0944527736132"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="arrow.up" catalog="system" width="60" height="64"/>
|
||||
<image name="mappin" catalog="system" width="52" height="64"/>
|
||||
</resources>
|
||||
</document>
|
||||
@@ -0,0 +1,72 @@
|
||||
|
||||
|
||||
|
||||
|
||||
import UIKit
|
||||
import ContainerControllerSwift
|
||||
|
||||
// MARK: - Item
|
||||
|
||||
class MapsSectionCellItem: TableAdapterItem {
|
||||
|
||||
init(title: String? = nil,
|
||||
textButton: String? = nil) {
|
||||
|
||||
let cellData = MapsSectionCellData(title ?? "", textButton ?? _L("LNG_MAPS_SECTION_SEE_ALL"))
|
||||
|
||||
super.init(cellClass: MapsSectionCell.self, cellData: cellData)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Data
|
||||
|
||||
class MapsSectionCellData: TableAdapterCellData {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
var title: String
|
||||
var textButton: String
|
||||
|
||||
// MARK: Inits
|
||||
|
||||
init(_ title: String,
|
||||
_ textButton: String) {
|
||||
|
||||
self.title = title
|
||||
self.textButton = textButton
|
||||
|
||||
super.init()
|
||||
}
|
||||
|
||||
override public func cellHeight() -> CGFloat {
|
||||
return 30
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Cell
|
||||
|
||||
class MapsSectionCell: TableAdapterCell {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
public var data: MapsSectionCellData?
|
||||
|
||||
// MARK: Outlets
|
||||
|
||||
@IBOutlet private weak var titleLabel: UILabel?
|
||||
@IBOutlet private weak var textButton: UIButton?
|
||||
|
||||
// MARK: Initialize
|
||||
|
||||
override func fill(data: TableAdapterCellData?) {
|
||||
guard let data = data as? MapsSectionCellData else { return }
|
||||
self.data = data
|
||||
|
||||
titleLabel?.text = data.title
|
||||
textButton?.setTitle( data.textButton, for: .normal)
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||