forked from organicmaps/organicmaps
[ios] update authorization UI, add custom controls, align checkmarks, add google button disabled state
This commit is contained in:
parent
cd834d31ba
commit
1a21e7844e
6 changed files with 173 additions and 45 deletions
21
iphone/Maps/Categories/NSAttributedString+HTML.swift
Normal file
21
iphone/Maps/Categories/NSAttributedString+HTML.swift
Normal file
|
@ -0,0 +1,21 @@
|
|||
//
|
||||
// NSAttributedString+HTML.swift
|
||||
// MAPS.ME
|
||||
//
|
||||
// Created by Aleksey Belousov on 15/05/2018.
|
||||
// Copyright © 2018 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
extension NSAttributedString {
|
||||
public class func string(withHtml htmlString:String, defaultAttributes attributes:[NSAttributedStringKey : Any]) -> NSAttributedString? {
|
||||
guard let data = htmlString.data(using: .utf8) else { return nil }
|
||||
guard let text = try? NSMutableAttributedString(data: data,
|
||||
options: [.documentType: NSAttributedString.DocumentType.html,
|
||||
.characterEncoding: String.Encoding.utf8.rawValue],
|
||||
documentAttributes: nil) else { return nil }
|
||||
text.addAttributes(attributes, range: NSMakeRange(0, text.length))
|
||||
return text
|
||||
}
|
||||
}
|
|
@ -74,7 +74,35 @@ class Checkmark: UIControl {
|
|||
super.layoutSubviews()
|
||||
|
||||
imageView.sizeToFit()
|
||||
imageView.center = CGPoint(x: bounds.width / 2, y: bounds.height / 2)
|
||||
|
||||
var left: CGFloat = 0;
|
||||
var top: CGFloat = 0;
|
||||
var width: CGFloat = imageView.width;
|
||||
var height: CGFloat = imageView.height;
|
||||
|
||||
switch effectiveContentHorizontalAlignment {
|
||||
case .right:
|
||||
left = bounds.width - imageView.width
|
||||
case .center:
|
||||
left = floor(bounds.width - width) / 2
|
||||
case .fill:
|
||||
width = bounds.width
|
||||
default:
|
||||
left = 0
|
||||
}
|
||||
|
||||
switch contentVerticalAlignment {
|
||||
case .top:
|
||||
top = 0
|
||||
case .bottom:
|
||||
top = bounds.height - height
|
||||
case .center:
|
||||
top = floor(bounds.height - height) / 2
|
||||
case .fill:
|
||||
height = bounds.height
|
||||
}
|
||||
|
||||
imageView.frame = CGRect(x: left, y: top, width: width, height: height)
|
||||
}
|
||||
|
||||
@objc func onTouch() {
|
||||
|
|
23
iphone/Maps/Classes/Components/LeftAlignedIconButton.swift
Normal file
23
iphone/Maps/Classes/Components/LeftAlignedIconButton.swift
Normal file
|
@ -0,0 +1,23 @@
|
|||
//
|
||||
// LeftAlignedIconButton.swift
|
||||
// MAPS.ME
|
||||
//
|
||||
// Created by Aleksey Belousov on 15/05/2018.
|
||||
// Copyright © 2018 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
@IBDesignable
|
||||
class LeftAlignedIconButton: UIButton {
|
||||
override func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
contentHorizontalAlignment = .left
|
||||
let availableSpace = UIEdgeInsetsInsetRect(bounds, contentEdgeInsets)
|
||||
let imageWidth = imageView?.frame.width ?? 0
|
||||
let titleWidth = titleLabel?.frame.width ?? 0
|
||||
let availableWidth = availableSpace.width - imageEdgeInsets.right - imageWidth - titleWidth
|
||||
titleEdgeInsets = UIEdgeInsets(top: 0, left: availableWidth / 2, bottom: 0, right: 0)
|
||||
}
|
||||
}
|
||||
|
|
@ -346,6 +346,8 @@
|
|||
45CBCCBA20590AAB006B55C2 /* libkml.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 45CBCCBB20590AAB006B55C2 /* libkml.a */; };
|
||||
45FFD65D1E965EBE00DB854E /* liblocal_ads.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 45FFD65C1E965EBE00DB854E /* liblocal_ads.a */; };
|
||||
4767CD9F20AAD48A00BD8166 /* Checkmark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4767CD9E20AAD48A00BD8166 /* Checkmark.swift */; };
|
||||
4767CDA420AAF66B00BD8166 /* NSAttributedString+HTML.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4767CDA320AAF66B00BD8166 /* NSAttributedString+HTML.swift */; };
|
||||
4767CDA620AB1F6200BD8166 /* LeftAlignedIconButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4767CDA520AB1F6200BD8166 /* LeftAlignedIconButton.swift */; };
|
||||
4A300ED51C6DCFD400140018 /* countries-strings in Resources */ = {isa = PBXBuildFile; fileRef = 4A300ED31C6DCFD400140018 /* countries-strings */; };
|
||||
56C74C391C74A3BC00B71B9F /* MWMInputEmailValidator.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34ABA62F1C2D58F300FE1BEC /* MWMInputEmailValidator.mm */; };
|
||||
56EE14D11FE804550036F20C /* libtransit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 56EE14D21FE804550036F20C /* libtransit.a */; };
|
||||
|
@ -1273,6 +1275,8 @@
|
|||
46F26CD710F623BA00ECCA39 /* EAGLView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = EAGLView.mm; sourceTree = "<group>"; };
|
||||
46F8A2EB10EB63040045521A /* MapViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = MapViewController.h; sourceTree = "<group>"; };
|
||||
4767CD9E20AAD48A00BD8166 /* Checkmark.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Checkmark.swift; sourceTree = "<group>"; };
|
||||
4767CDA320AAF66B00BD8166 /* NSAttributedString+HTML.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSAttributedString+HTML.swift"; sourceTree = "<group>"; };
|
||||
4767CDA520AB1F6200BD8166 /* LeftAlignedIconButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LeftAlignedIconButton.swift; sourceTree = "<group>"; };
|
||||
4A00DBDE1AB704C400113624 /* drules_proto_dark.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; name = drules_proto_dark.bin; path = ../../data/drules_proto_dark.bin; sourceTree = "<group>"; };
|
||||
4A23D1561B8B4DD700D4EB6F /* drules_proto_clear.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; name = drules_proto_clear.bin; path = ../../data/drules_proto_clear.bin; sourceTree = "<group>"; };
|
||||
4A23D1571B8B4DD700D4EB6F /* resources-6plus_clear */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "resources-6plus_clear"; path = "../../data/resources-6plus_clear"; sourceTree = "<group>"; };
|
||||
|
@ -2397,6 +2401,7 @@
|
|||
34F7422F1E0834F400AC1FD6 /* UIViewController+Navigation.h */,
|
||||
34F742301E0834F400AC1FD6 /* UIViewController+Navigation.mm */,
|
||||
347E03981FAC5F1D00426032 /* UIWindow+InputLanguage.swift */,
|
||||
4767CDA320AAF66B00BD8166 /* NSAttributedString+HTML.swift */,
|
||||
);
|
||||
path = Categories;
|
||||
sourceTree = "<group>";
|
||||
|
@ -2552,6 +2557,7 @@
|
|||
344BEAEF1F66BDC30045DC45 /* RatingSummaryView */,
|
||||
348A8DF01F66775A00D83026 /* RatingView */,
|
||||
4767CD9E20AAD48A00BD8166 /* Checkmark.swift */,
|
||||
4767CDA520AB1F6200BD8166 /* LeftAlignedIconButton.swift */,
|
||||
);
|
||||
path = Components;
|
||||
sourceTree = "<group>";
|
||||
|
@ -4385,6 +4391,7 @@
|
|||
348A8DF51F66775A00D83026 /* RatingView.swift in Sources */,
|
||||
F63AF50F1EA6215100A1DB98 /* FilterPriceCategoryCell.swift in Sources */,
|
||||
34D3AFF61E37A36A004100F9 /* UICollectionView+Cells.swift in Sources */,
|
||||
4767CDA420AAF66B00BD8166 /* NSAttributedString+HTML.swift in Sources */,
|
||||
6741A9A91BF340DE002C974C /* MWMDefaultAlert.mm in Sources */,
|
||||
340708781F2B5D6C00029ECC /* DimBackground.swift in Sources */,
|
||||
3490D2DF1CE9DD2500D0B838 /* MWMSideButtons.mm in Sources */,
|
||||
|
@ -4470,6 +4477,7 @@
|
|||
6741A9CF1BF340DE002C974C /* MWMLocationAlert.mm in Sources */,
|
||||
34ABA62D1C2D57D500FE1BEC /* MWMInputPasswordValidator.mm in Sources */,
|
||||
F6E2FDA11E097BA00083EBEC /* MWMEditorAdditionalNamesTableViewController.mm in Sources */,
|
||||
4767CDA620AB1F6200BD8166 /* LeftAlignedIconButton.swift in Sources */,
|
||||
3454D7D41E07F045004AF2AD /* UIImageView+Coloring.mm in Sources */,
|
||||
3463BA671DE81DB90082417F /* MWMTrafficButtonViewController.mm in Sources */,
|
||||
F6E2FE551E097BA00083EBEC /* MWMPlacePageActionBar.mm in Sources */,
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import FBSDKCoreKit
|
||||
import FBSDKLoginKit
|
||||
import GoogleSignIn
|
||||
import SafariServices
|
||||
|
||||
@objc(MWMAuthorizationViewController)
|
||||
final class AuthorizationViewController: MWMViewController {
|
||||
|
@ -52,7 +53,7 @@ final class AuthorizationViewController: MWMViewController {
|
|||
didSet {
|
||||
textLabel.font = UIFont.regular14()
|
||||
textLabel.textColor = UIColor.blackSecondaryText()
|
||||
textLabel.text = L("profile_authorization_message")
|
||||
textLabel.text = L("sign_message_gdpr")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -65,7 +66,9 @@ final class AuthorizationViewController: MWMViewController {
|
|||
googleButton.clipsToBounds = true
|
||||
googleButton.setTitle("Google", for: .normal)
|
||||
googleButton.setTitleColor(UIColor.blackPrimaryText(), for: .normal)
|
||||
googleButton.setTitleColor(UIColor.blackSecondaryText(), for: .disabled)
|
||||
googleButton.titleLabel?.font = UIFont.bold14()
|
||||
googleButton.isEnabled = false
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -86,6 +89,7 @@ final class AuthorizationViewController: MWMViewController {
|
|||
button.loginBehavior = .systemAccount
|
||||
button.setAttributedTitle(NSAttributedString(string: "Facebook"), for: .normal)
|
||||
button.readPermissions = ["public_profile", "email"]
|
||||
button.isEnabled = false
|
||||
return button
|
||||
}()
|
||||
|
||||
|
@ -103,6 +107,12 @@ final class AuthorizationViewController: MWMViewController {
|
|||
MapViewController.topViewController().navigationController?.pushViewController(wv!, animated: true)
|
||||
}
|
||||
}
|
||||
|
||||
@IBOutlet private weak var phoneSignInButton: UIButton! {
|
||||
didSet {
|
||||
phoneSignInButton.isEnabled = false
|
||||
}
|
||||
}
|
||||
|
||||
@IBOutlet private weak var facebookButtonHolder: UIView! {
|
||||
didSet {
|
||||
|
@ -115,46 +125,65 @@ final class AuthorizationViewController: MWMViewController {
|
|||
}
|
||||
}
|
||||
|
||||
@IBOutlet private weak var privacyPolicyCheck: UIButton! {
|
||||
@IBOutlet private weak var privacyPolicyCheck: Checkmark! {
|
||||
didSet {
|
||||
privacyPolicyCheck.tintColor = .blackHintText()
|
||||
privacyPolicyCheck.offTintColor = .blackHintText()
|
||||
privacyPolicyCheck.onTintColor = .linkBlue()
|
||||
privacyPolicyCheck.contentHorizontalAlignment = .left
|
||||
}
|
||||
}
|
||||
|
||||
@IBOutlet private weak var termsOfUseCheck: UIButton! {
|
||||
@IBOutlet private weak var termsOfUseCheck: Checkmark! {
|
||||
didSet {
|
||||
termsOfUseCheck.tintColor = .blackHintText()
|
||||
termsOfUseCheck.offTintColor = .blackHintText()
|
||||
termsOfUseCheck.onTintColor = .linkBlue()
|
||||
termsOfUseCheck.contentHorizontalAlignment = .left
|
||||
}
|
||||
}
|
||||
|
||||
@IBOutlet private weak var latestNewsCheck: UIButton! {
|
||||
@IBOutlet private weak var latestNewsCheck: Checkmark! {
|
||||
didSet {
|
||||
latestNewsCheck.tintColor = .blackHintText()
|
||||
latestNewsCheck.offTintColor = .blackHintText()
|
||||
latestNewsCheck.onTintColor = .linkBlue()
|
||||
latestNewsCheck.contentHorizontalAlignment = .left
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func onCheck(_ sender: Checkmark) {
|
||||
let allButtonsChecked = privacyPolicyCheck.isChecked &&
|
||||
termsOfUseCheck.isChecked;
|
||||
|
||||
googleButton.isEnabled = allButtonsChecked;
|
||||
facebookButton.isEnabled = allButtonsChecked;
|
||||
phoneSignInButton.isEnabled = allButtonsChecked;
|
||||
}
|
||||
|
||||
@IBOutlet private weak var privacyPolicyTextView: UITextView! {
|
||||
didSet {
|
||||
let htmlString = L("sign_agree_pp_gdpr")
|
||||
guard let data = htmlString.data(using: .utf8) else { return }
|
||||
guard let text = try? NSMutableAttributedString(data: data,
|
||||
options: [.documentType: NSAttributedString.DocumentType.html,
|
||||
.characterEncoding: String.Encoding.utf8.rawValue],
|
||||
documentAttributes: nil) else { return }
|
||||
text.addAttributes([NSAttributedStringKey.font: UIFont.regular16()], range: NSMakeRange(0, text.length))
|
||||
privacyPolicyTextView.attributedText = text
|
||||
let attributes: [NSAttributedStringKey : Any] = [NSAttributedStringKey.font: UIFont.regular16(),
|
||||
NSAttributedStringKey.foregroundColor: UIColor.blackPrimaryText()]
|
||||
privacyPolicyTextView.attributedText = NSAttributedString.string(withHtml: htmlString,
|
||||
defaultAttributes: attributes)
|
||||
privacyPolicyTextView.delegate = self
|
||||
}
|
||||
}
|
||||
|
||||
@IBOutlet private weak var termsOfUseTextView: UITextView! {
|
||||
didSet {
|
||||
|
||||
let htmlString = L("sign_agree_tof_gdpr")
|
||||
let attributes: [NSAttributedStringKey : Any] = [NSAttributedStringKey.font: UIFont.regular16(),
|
||||
NSAttributedStringKey.foregroundColor: UIColor.blackPrimaryText()]
|
||||
termsOfUseTextView.attributedText = NSAttributedString.string(withHtml: htmlString,
|
||||
defaultAttributes: attributes)
|
||||
termsOfUseTextView.delegate = self
|
||||
}
|
||||
}
|
||||
|
||||
@IBOutlet private weak var latestNewsTextView: UITextView! {
|
||||
didSet {
|
||||
|
||||
latestNewsTextView.text = L("sign_agree_news_gdpr")
|
||||
latestNewsTextView.textColor = UIColor.blackPrimaryText()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -281,6 +310,8 @@ extension AuthorizationViewController: GIDSignInDelegate {
|
|||
|
||||
extension AuthorizationViewController: UITextViewDelegate {
|
||||
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
|
||||
return true;
|
||||
let safari = SFSafariViewController(url: URL)
|
||||
self.present(safari, animated: true, completion: nil)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
<outlet property="googleButton" destination="8iU-Se-s8N" id="rSq-jz-U5t"/>
|
||||
<outlet property="latestNewsCheck" destination="Z2X-Qq-dwV" id="8oR-t5-2oo"/>
|
||||
<outlet property="latestNewsTextView" destination="p04-D7-97V" id="AIZ-wF-v4D"/>
|
||||
<outlet property="phoneSignInButton" destination="ZDx-fj-xoO" id="vMM-Al-0Ex"/>
|
||||
<outlet property="privacyPolicyCheck" destination="33D-0u-y3N" id="kAN-wB-yUl"/>
|
||||
<outlet property="privacyPolicyTextView" destination="LhW-gs-XN9" id="HWt-AO-vvH"/>
|
||||
<outlet property="separator" destination="hWD-aE-jYh" id="myS-1z-Saw"/>
|
||||
|
@ -34,7 +35,7 @@
|
|||
<subviews>
|
||||
<view contentMode="scaleToFill" verticalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="5kf-Pd-KAZ">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="212.5"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.19983411815068494" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<gestureRecognizers/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="40" id="NYl-aG-vKs"/>
|
||||
|
@ -68,16 +69,22 @@
|
|||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Cdf-p5-Bbb">
|
||||
<rect key="frame" x="32" y="59" width="311" height="55.5"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="33D-0u-y3N">
|
||||
<view opaque="NO" contentMode="center" translatesAutoresizingMaskIntoConstraints="NO" id="33D-0u-y3N" customClass="Checkmark" customModule="maps_me" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="40" height="55.5"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="40" id="awT-NV-5En"/>
|
||||
</constraints>
|
||||
<state key="normal" image="radioBtnOff"/>
|
||||
</button>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="image" keyPath="offImage" value="radioBtnOff"/>
|
||||
<userDefinedRuntimeAttribute type="image" keyPath="onImage" value="radioBtnOn"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="onCheck:" destination="-1" eventType="valueChanged" id="GHm-Xj-Fic"/>
|
||||
</connections>
|
||||
</view>
|
||||
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" editable="NO" text="I agree to Privacy Policy" translatesAutoresizingMaskIntoConstraints="NO" id="LhW-gs-XN9">
|
||||
<rect key="frame" x="40" y="10" width="263" height="35.5"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<rect key="frame" x="40" y="10" width="182.5" height="35.5"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<fontDescription key="fontDescription" name=".AppleSystemUIFont" family=".AppleSystemUIFont" pointSize="16"/>
|
||||
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
|
@ -93,13 +100,13 @@
|
|||
</connections>
|
||||
</textView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="33D-0u-y3N" firstAttribute="leading" secondItem="Cdf-p5-Bbb" secondAttribute="leading" id="bfU-g4-jey"/>
|
||||
<constraint firstItem="33D-0u-y3N" firstAttribute="top" secondItem="Cdf-p5-Bbb" secondAttribute="top" id="cE0-Vo-mlj"/>
|
||||
<constraint firstAttribute="bottom" secondItem="33D-0u-y3N" secondAttribute="bottom" id="gmp-bg-gGj"/>
|
||||
<constraint firstItem="LhW-gs-XN9" firstAttribute="top" secondItem="Cdf-p5-Bbb" secondAttribute="top" constant="10" id="mhL-Bd-ArP"/>
|
||||
<constraint firstAttribute="trailing" secondItem="LhW-gs-XN9" secondAttribute="trailing" constant="8" id="v1T-SO-6ll"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="LhW-gs-XN9" secondAttribute="trailing" constant="8" id="v1T-SO-6ll"/>
|
||||
<constraint firstAttribute="bottom" secondItem="LhW-gs-XN9" secondAttribute="bottom" constant="10" id="xgl-tw-klI"/>
|
||||
<constraint firstItem="LhW-gs-XN9" firstAttribute="leading" secondItem="33D-0u-y3N" secondAttribute="trailing" id="yOg-UF-SwU"/>
|
||||
</constraints>
|
||||
|
@ -107,16 +114,22 @@
|
|||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XHd-bd-GsP">
|
||||
<rect key="frame" x="32" y="115" width="311" height="55.5"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="3cN-Qb-mdM">
|
||||
<view opaque="NO" contentMode="center" translatesAutoresizingMaskIntoConstraints="NO" id="3cN-Qb-mdM" customClass="Checkmark" customModule="maps_me" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="40" height="55.5"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="40" id="Gsk-Bp-DHv"/>
|
||||
</constraints>
|
||||
<state key="normal" image="radioBtnOff"/>
|
||||
</button>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="image" keyPath="offImage" value="radioBtnOff"/>
|
||||
<userDefinedRuntimeAttribute type="image" keyPath="onImage" value="radioBtnOn"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="onCheck:" destination="-1" eventType="valueChanged" id="3jl-dT-yZS"/>
|
||||
</connections>
|
||||
</view>
|
||||
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" editable="NO" text="I agree to Terms of Use" translatesAutoresizingMaskIntoConstraints="NO" id="PBR-9l-2Gh">
|
||||
<rect key="frame" x="40" y="10" width="263" height="35.5"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<rect key="frame" x="40" y="10" width="178.5" height="35.5"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<fontDescription key="fontDescription" name=".AppleSystemUIFont" family=".AppleSystemUIFont" pointSize="16"/>
|
||||
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
|
@ -129,7 +142,7 @@
|
|||
</userDefinedRuntimeAttributes>
|
||||
</textView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="PBR-9l-2Gh" secondAttribute="bottom" constant="10" id="0VT-4u-6Fg"/>
|
||||
<constraint firstItem="PBR-9l-2Gh" firstAttribute="top" secondItem="XHd-bd-GsP" secondAttribute="top" constant="10" id="9eq-98-ygD"/>
|
||||
|
@ -137,22 +150,25 @@
|
|||
<constraint firstItem="3cN-Qb-mdM" firstAttribute="leading" secondItem="XHd-bd-GsP" secondAttribute="leading" id="Z3C-FT-yqQ"/>
|
||||
<constraint firstItem="3cN-Qb-mdM" firstAttribute="top" secondItem="XHd-bd-GsP" secondAttribute="top" id="dkg-sP-6gL"/>
|
||||
<constraint firstAttribute="bottom" secondItem="3cN-Qb-mdM" secondAttribute="bottom" id="pRC-nx-yBP"/>
|
||||
<constraint firstAttribute="trailing" secondItem="PBR-9l-2Gh" secondAttribute="trailing" constant="8" id="x3t-yD-KpE"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="PBR-9l-2Gh" secondAttribute="trailing" constant="8" id="x3t-yD-KpE"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="4NF-GO-a8Q">
|
||||
<rect key="frame" x="32" y="170.5" width="311" height="55.5"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Z2X-Qq-dwV">
|
||||
<view opaque="NO" contentMode="center" translatesAutoresizingMaskIntoConstraints="NO" id="Z2X-Qq-dwV" customClass="Checkmark" customModule="maps_me" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="40" height="55.5"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="40" id="Ed8-DA-DiE"/>
|
||||
</constraints>
|
||||
<state key="normal" image="radioBtnOff"/>
|
||||
</button>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="image" keyPath="offImage" value="radioBtnOff"/>
|
||||
<userDefinedRuntimeAttribute type="image" keyPath="onImage" value="radioBtnOn"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" editable="NO" text="I agree to recieve latest news about our products" translatesAutoresizingMaskIntoConstraints="NO" id="p04-D7-97V">
|
||||
<rect key="frame" x="40" y="10" width="263" height="35.5"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<fontDescription key="fontDescription" name=".AppleSystemUIFont" family=".AppleSystemUIFont" pointSize="16"/>
|
||||
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
|
@ -165,7 +181,7 @@
|
|||
</userDefinedRuntimeAttributes>
|
||||
</textView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="p04-D7-97V" firstAttribute="top" secondItem="4NF-GO-a8Q" secondAttribute="top" constant="10" id="7DY-f4-uiW"/>
|
||||
<constraint firstAttribute="bottom" secondItem="p04-D7-97V" secondAttribute="bottom" constant="10" id="At3-DG-uub"/>
|
||||
|
@ -173,18 +189,18 @@
|
|||
<constraint firstItem="Z2X-Qq-dwV" firstAttribute="top" secondItem="4NF-GO-a8Q" secondAttribute="top" id="d3x-dj-I9Q"/>
|
||||
<constraint firstItem="Z2X-Qq-dwV" firstAttribute="leading" secondItem="4NF-GO-a8Q" secondAttribute="leading" id="gTk-JI-cfK"/>
|
||||
<constraint firstItem="p04-D7-97V" firstAttribute="leading" secondItem="Z2X-Qq-dwV" secondAttribute="trailing" id="jda-uN-kLq"/>
|
||||
<constraint firstAttribute="trailing" secondItem="p04-D7-97V" secondAttribute="trailing" constant="8" id="u9Y-IJ-lA3"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="p04-D7-97V" secondAttribute="trailing" constant="8" id="u9Y-IJ-lA3"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="8iU-Se-s8N">
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="8iU-Se-s8N" customClass="LeftAlignedIconButton" customModule="maps_me" customModuleProvider="target">
|
||||
<rect key="frame" x="32" y="238" width="311" height="40"/>
|
||||
<inset key="contentEdgeInsets" minX="20" minY="0.0" maxX="0.0" maxY="0.0"/>
|
||||
<state key="normal" title="Google"/>
|
||||
<inset key="imageEdgeInsets" minX="16" minY="0.0" maxX="0.0" maxY="0.0"/>
|
||||
<state key="normal" title="Google" image="login_google_button"/>
|
||||
<connections>
|
||||
<action selector="googleSignIn" destination="-1" eventType="touchUpInside" id="pit-ir-2fB"/>
|
||||
</connections>
|
||||
</button>
|
||||
<imageView userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="login_google_button" translatesAutoresizingMaskIntoConstraints="NO" id="hia-tk-X0k">
|
||||
<imageView hidden="YES" userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="login_google_button" translatesAutoresizingMaskIntoConstraints="NO" id="hia-tk-X0k">
|
||||
<rect key="frame" x="48" y="246" width="24" height="24"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="24" id="OyH-4I-nMX"/>
|
||||
|
@ -193,7 +209,7 @@
|
|||
</imageView>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="iK0-TH-4mm">
|
||||
<rect key="frame" x="32" y="294" width="311" height="40"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</view>
|
||||
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ZDx-fj-xoO">
|
||||
<rect key="frame" x="32" y="350" width="311" height="40"/>
|
||||
|
@ -223,7 +239,7 @@
|
|||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="0EA-1u-hvB" firstAttribute="trailing" secondItem="Cdf-p5-Bbb" secondAttribute="trailing" id="0aL-94-2S0"/>
|
||||
<constraint firstItem="ZDx-fj-xoO" firstAttribute="top" secondItem="iK0-TH-4mm" secondAttribute="bottom" constant="16" id="0f2-8L-isT"/>
|
||||
|
@ -301,5 +317,6 @@
|
|||
<resources>
|
||||
<image name="login_google_button" width="24" height="24"/>
|
||||
<image name="radioBtnOff" width="22" height="22"/>
|
||||
<image name="radioBtnOn" width="22" height="22"/>
|
||||
</resources>
|
||||
</document>
|
||||
|
|
Loading…
Add table
Reference in a new issue