[ios] update authorization UI, add custom controls, align checkmarks, add google button disabled state

This commit is contained in:
Aleksey Belousov 2018-05-15 17:13:06 +03:00 committed by Aleksey Belousov
parent cd834d31ba
commit 1a21e7844e
6 changed files with 173 additions and 45 deletions

View 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
}
}

View file

@ -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() {

View 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)
}
}

View file

@ -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 */,

View file

@ -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;
}
}

View file

@ -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>