Compare commits
63 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a9862768c9 | |||
| 638bdd85f7 | |||
| 723ec56928 | |||
| d870af6f60 | |||
| 4c98d75ebf | |||
| 66b65065eb | |||
| 6753c18c88 | |||
| 2c696f793c | |||
| e0fd17dcf9 | |||
| 22dc85ef9a | |||
| db3184c16c | |||
| 1fd7e5f2c1 | |||
| 2d954c904d | |||
| 2de54e1387 | |||
| 686ca24a06 | |||
| a8cb461213 | |||
| 181d20315c | |||
| 583f01a149 | |||
| c6575ac042 | |||
| 9f83a13354 | |||
| a47b2d80f3 | |||
| 6691322781 | |||
| 8bdbc44f39 | |||
| 5ae5c97f00 | |||
| 1108944654 | |||
| 365840db98 | |||
| 1024939b76 | |||
| c43e82be23 | |||
| 33c590a228 | |||
| f26290d678 | |||
| 0ce377769e | |||
| dbea32781b | |||
| 92ebbd1a60 | |||
| b771157496 | |||
| a253a13ffb | |||
| 4c426503c9 | |||
| 2993da6f9a | |||
| 7d0e772c3e | |||
| ad77cebc00 | |||
| d02547e758 | |||
| 851cbad148 | |||
| 665d45b421 | |||
| 93a0c79268 | |||
| a6ccd66c9b | |||
| 1dc661fb06 | |||
| c0c479cdba | |||
| d76389e430 | |||
| c7563abb4e | |||
| 68d1d645e4 | |||
| 125b276319 | |||
| bb542c0ef9 | |||
| 59ac63c3f1 | |||
| 3620387efc | |||
| e9b9dc7e0e | |||
| 5dc40100bf | |||
| 061acc97cf | |||
| 5c8a4252d3 | |||
| e6ef615083 | |||
| 8275176f21 | |||
| 4e028ee4e9 | |||
| e925415429 | |||
| 36a19cba83 | |||
| 17da6c00e4 |
@@ -39,6 +39,7 @@ playground.xcworkspace
|
||||
# Package.pins
|
||||
# Package.resolved
|
||||
.build/
|
||||
.swiftpm/xcode/xcuserdata
|
||||
|
||||
# CocoaPods
|
||||
#
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1300"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "CodeTests"
|
||||
BuildableName = "CodeTests"
|
||||
BlueprintName = "CodeTests"
|
||||
ReferencedContainer = "container:">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1300"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "IntrinsicContentViewKeyboardTests"
|
||||
BuildableName = "IntrinsicContentViewKeyboardTests"
|
||||
BlueprintName = "IntrinsicContentViewKeyboardTests"
|
||||
ReferencedContainer = "container:">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1300"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "IntrinsicSizeTests"
|
||||
BuildableName = "IntrinsicSizeTests"
|
||||
BlueprintName = "IntrinsicSizeTests"
|
||||
ReferencedContainer = "container:">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1300"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "ManagerTests"
|
||||
BuildableName = "ManagerTests"
|
||||
BlueprintName = "ManagerTests"
|
||||
ReferencedContainer = "container:">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@@ -0,0 +1,141 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1300"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "ScrollingContentViewController"
|
||||
BuildableName = "ScrollingContentViewController"
|
||||
BlueprintName = "ScrollingContentViewController"
|
||||
ReferencedContainer = "container:">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "Common"
|
||||
BuildableName = "Common"
|
||||
BlueprintName = "Common"
|
||||
ReferencedContainer = "container:">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "CodeTests"
|
||||
BuildableName = "CodeTests"
|
||||
BlueprintName = "CodeTests"
|
||||
ReferencedContainer = "container:">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "InsetContentViewKeyboardTests"
|
||||
BuildableName = "InsetContentViewKeyboardTests"
|
||||
BlueprintName = "InsetContentViewKeyboardTests"
|
||||
ReferencedContainer = "container:">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "IntrinsicSizeTests"
|
||||
BuildableName = "IntrinsicSizeTests"
|
||||
BlueprintName = "IntrinsicSizeTests"
|
||||
ReferencedContainer = "container:">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "KeyboardTests"
|
||||
BuildableName = "KeyboardTests"
|
||||
BlueprintName = "KeyboardTests"
|
||||
ReferencedContainer = "container:">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "ManagerTests"
|
||||
BuildableName = "ManagerTests"
|
||||
BlueprintName = "ManagerTests"
|
||||
ReferencedContainer = "container:">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "StoryboardTests"
|
||||
BuildableName = "StoryboardTests"
|
||||
BlueprintName = "StoryboardTests"
|
||||
ReferencedContainer = "container:">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "ScrollingContentViewController"
|
||||
BuildableName = "ScrollingContentViewController"
|
||||
BlueprintName = "ScrollingContentViewController"
|
||||
ReferencedContainer = "container:">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1300"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "StoryboardTests"
|
||||
BuildableName = "StoryboardTests"
|
||||
BlueprintName = "StoryboardTests"
|
||||
ReferencedContainer = "container:">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@@ -1,5 +0,0 @@
|
||||
language: swift
|
||||
osx_image: xcode10.1
|
||||
xcode_project: ScrollingContentViewController.xcodeproj
|
||||
xcode_scheme: ScrollingContentViewController
|
||||
xcode_destination: platform=iOS Simulator,OS=12.1,name=iPhone X
|
||||
@@ -41,5 +41,7 @@
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UIUserInterfaceStyle</key>
|
||||
<string>Light</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -100,7 +100,6 @@ class SignUpViewController: ScrollingContentViewController {
|
||||
textField.isSecureTextEntry = isSecureTextEntry
|
||||
}
|
||||
|
||||
// swiftlint:disable:next function_body_length
|
||||
private func addConstraints() {
|
||||
logoImageView.translatesAutoresizingMaskIntoConstraints = false
|
||||
nameTextField.translatesAutoresizingMaskIntoConstraints = false
|
||||
|
||||
@@ -43,5 +43,7 @@
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UIUserInterfaceStyle</key>
|
||||
<string>Light</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -41,5 +41,7 @@
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UIUserInterfaceStyle</key>
|
||||
<string>Light</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -41,5 +41,7 @@
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UIUserInterfaceStyle</key>
|
||||
<string>Light</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
import UIKit
|
||||
|
||||
/// Delegate for SignUpController.
|
||||
protocol SignUpControllerDelegate: class {
|
||||
protocol SignUpControllerDelegate: AnyObject {
|
||||
|
||||
/// Tells the delegate to scroll the scroll view so that the first responder becomes
|
||||
/// visible.
|
||||
|
||||
@@ -43,5 +43,7 @@
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UIUserInterfaceStyle</key>
|
||||
<string>Light</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
// swift-tools-version:5.3
|
||||
|
||||
import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
name: "ScrollingContentViewController",
|
||||
platforms: [
|
||||
.iOS(.v12)
|
||||
],
|
||||
products: [
|
||||
.library(
|
||||
name: "ScrollingContentViewController",
|
||||
targets: ["ScrollingContentViewController"]
|
||||
)
|
||||
],
|
||||
dependencies: [
|
||||
],
|
||||
targets: [
|
||||
.target(
|
||||
name: "ScrollingContentViewController",
|
||||
dependencies: []
|
||||
)
|
||||
// .target(
|
||||
// name: "Common",
|
||||
// dependencies: ["ScrollingContentViewController"],
|
||||
// path: "Tests/Common"
|
||||
// ),
|
||||
// .testTarget(
|
||||
// name: "StoryboardTests",
|
||||
// dependencies: ["ScrollingContentViewController", "Common"]
|
||||
// ),
|
||||
// .testTarget(
|
||||
// name: "CodeTests",
|
||||
// dependencies: ["ScrollingContentViewController", "Common"]
|
||||
// ),
|
||||
// .testTarget(
|
||||
// name: "ManagerTests",
|
||||
// dependencies: ["ScrollingContentViewController", "Common"]
|
||||
// ),
|
||||
// .testTarget(
|
||||
// name: "IntrinsicSizeTests",
|
||||
// dependencies: ["ScrollingContentViewController"]
|
||||
// ),
|
||||
// .testTarget(
|
||||
// name: "KeyboardTests",
|
||||
// dependencies: ["ScrollingContentViewController"]
|
||||
// ),
|
||||
// .testTarget(
|
||||
// name: "InsetContentViewKeyboardTests",
|
||||
// dependencies: ["ScrollingContentViewController"]
|
||||
// )
|
||||
]
|
||||
)
|
||||
@@ -1,10 +1,8 @@
|
||||
# ScrollingContentViewController
|
||||
|
||||
[](https://travis-ci.org/drewolbrich/ScrollingContentViewController)
|
||||
[](http://developer.apple.com/ios)
|
||||
[](https://developer.apple.com/swift)
|
||||
[](https://developer.apple.com/swift)
|
||||
[](LICENSE)
|
||||
[](http://twitter.com/drewolbrich)
|
||||
|
||||
* [Overview](#overview)
|
||||
* [Background](#background)
|
||||
@@ -21,19 +19,19 @@
|
||||
|
||||
## Overview
|
||||
|
||||
ScrollingContentViewController makes it easy to create a view controller with a single scrolling content view, or to convert an existing static view controller into one that scrolls. Most importantly, it takes care of several tricky undocumented edge cases involving the keyboard, navigation controllers, and device rotations.
|
||||
ScrollingContentViewController makes it easy to create a view controller with a single scrolling content view, or to convert an existing static view controller into one that scrolls. Most importantly, it takes care of several tricky undocumented edge cases involving the keyboard, navigation controllers, and device rotations.
|
||||
|
||||
## Background
|
||||
|
||||
A common UIKit Auto Layout task involves creating a view controller with a fixed layout that is too large to fit older, smaller devices, or devices in landscape orientation, or the area of the screen that remains visible when the keyboard is presented. The problem is compounded when [Dynamic Type](https://developer.apple.com/documentation/uikit/uifont/scaling_fonts_automatically) is used to support large font sizes.
|
||||
A common UIKit Auto Layout task involves creating a view controller with a fixed layout that is too large to fit older, smaller devices, or devices in landscape orientation, or the area of the screen that remains visible when the keyboard is presented. The problem is compounded when [Dynamic Type](https://developer.apple.com/documentation/uikit/uifont/scaling_fonts_automatically) is used to support large font sizes.
|
||||
|
||||
For example, consider this sign up screen, which fits iPhone Xs, but not iPhone SE with a keyboard:
|
||||
|
||||
<img src="https://github.com/drewolbrich/ScrollingContentViewController/raw/master/Images/Overview-Comparison.png" width="888px">
|
||||
<img src="https://github.com/drewolbrich/ScrollingContentViewController/raw/main/Images/Overview-Comparison.png" width="888px">
|
||||
|
||||
This case can be handled by nesting the view inside a scroll view. You could do this manually in Interface Builder, as described by Apple's [Working with Scroll Views](https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/WorkingwithScrollViews.html) documentation, but many steps are required. If your view contains text fields, you'll have to write code to adjust the view to compensate for the presented keyboard, as described in [Managing the Keyboard](https://developer.apple.com/library/archive/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html#//apple_ref/doc/uid/TP40009542-CH5-SW3). However, handling the keyboard robustly is [surprisingly complicated](#keyboard-resize-filtering), especially if your app presents a sequence of screens with keyboards in the context of a navigation controller, or when device orientation support is required.
|
||||
|
||||
To simplify this task, ScrollingContentViewController inserts the scroll view into the view hierarchy for you at run time, along with all necessary Auto Layout constraints.
|
||||
To simplify this task, ScrollingContentViewController inserts the scroll view into the view hierarchy for you at run time, along with all necessary Auto Layout constraints.
|
||||
|
||||
When used in a storyboard, ScrollingContentViewController exposes an outlet called [`contentView`](#contentView) that you connect to the view that you'd like to make scrollable. This may be the view controller's root view or an arbitrary subview. Everything else is taken care of automatically, including responding to keyboard presentation and device orientation changes.
|
||||
|
||||
@@ -43,6 +41,12 @@ An explanation of [how ScrollingContentViewController works internally](#how-it-
|
||||
|
||||
## Installation
|
||||
|
||||
To install ScrollingContentViewController using Swift Package Manager, add this package URL to your project:
|
||||
|
||||
```
|
||||
https://github.com/drewolbrich/ScrollingContentViewController
|
||||
```
|
||||
|
||||
To install ScrollingContentViewController using CocoaPods, add this line to your Podfile:
|
||||
|
||||
```ruby
|
||||
@@ -57,7 +61,7 @@ github "drewolbrich/ScrollingContentViewController"
|
||||
|
||||
## Usage
|
||||
|
||||
Subclasses of `ScrollingContentViewController` may be configured using [storyboards](#storyboards) or in [code](#code).
|
||||
Subclasses of `ScrollingContentViewController` may be configured using [storyboards](#storyboards) or in [code](#code).
|
||||
|
||||
This library may also be used without subclassing, by composing the helper class `ScrollingContentViewManager` instead. Refer to [Usage Without Subclassing](#usage-without-subclassing).
|
||||
|
||||
@@ -71,22 +75,22 @@ To configure `ScrollingContentViewController` in a storyboard:
|
||||
import ScrollingContentViewController
|
||||
|
||||
class MyViewController: ScrollingContentViewController {
|
||||
|
||||
|
||||
// ...
|
||||
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
2. In Interface Builder's outline view, control-click your view controller and connect its [`contentView`](#contentView) outlet to your view controller's root view or any other subview that you want to make scrollable.
|
||||
|
||||
<img src="https://github.com/drewolbrich/ScrollingContentViewController/raw/master/Images/Usage-Storyboards.png" width="471px">
|
||||
<img src="https://github.com/drewolbrich/ScrollingContentViewController/raw/main/Images/Usage-Storyboards.png" width="471px">
|
||||
|
||||
3. If your view controller defines a [`viewDidLoad`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621495-viewdidload) method, call `super.viewDidLoad` if you aren't already doing so.
|
||||
|
||||
```swift
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
|
||||
// ...
|
||||
}
|
||||
```
|
||||
@@ -105,25 +109,27 @@ To integrate `ScrollingContentViewController` programmatically:
|
||||
import ScrollingContentViewController
|
||||
|
||||
class MyViewController: ScrollingContentViewController {
|
||||
|
||||
|
||||
// ...
|
||||
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
2. In your view controller's [`viewDidLoad`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621495-viewdidload) method, assign a new view to the [`contentView`](#contentView) property. Add all of your controls to this view instead of referencing the [`view`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621460-view) property so they can scroll freely. The view controller's root view referenced by its [`view`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621460-view) property now acts as a background view behind the scrolling content view.
|
||||
2. In your view controller's [`viewDidLoad`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621495-viewdidload) method, assign a new view to the [`contentView`](#contentView) property. Add all of your controls to this view instead of referencing the [`view`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621460-view) property so they can scroll freely. The view controller's root view referenced by its [`view`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621460-view) property now acts as a background view behind the scrolling content view.
|
||||
|
||||
```swift
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
view.backgroundColor = .systemBackground
|
||||
|
||||
contentView = UIView()
|
||||
|
||||
|
||||
// Add all controls to contentView instead of view.
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
You may also assign [`contentView`](#contentView) to a subview of your view controller's root view, in which case only that subview will be made scrollable.
|
||||
|
||||
## Caveats
|
||||
@@ -140,7 +146,7 @@ To determine the size of the scroll view's content size, ScrollingContentViewCon
|
||||
|
||||
If the size of your view controller is intentionally highly constrained (e.g. consisting exclusively of constraints with [`required`](https://developer.apple.com/documentation/uikit/uilayoutpriority/1622241-required) priority and lacking [`greaterThanOrEqual`](https://developer.apple.com/documentation/uikit/nslayoutconstraint/relation/greaterthanorequal) relation constraints), you may see Auto Layout constraint errors in Interface Builder if the constraints don't match the simulated size of the view, for example, when you switch between simulated device sizes. The easiest way to resolve this issue is to reduce the priority of one of your constraints. The value 240 is a good choice because it is lower than the default content hugging priority (250) and consequently, it will help avoid the undesirable behavior where text fields and labels without height constraints stretch vertically.
|
||||
|
||||
<img src="https://github.com/drewolbrich/ScrollingContentViewController/raw/master/Images/Usage-Auto-Layout-Considerations.png" width="663px">
|
||||
<img src="https://github.com/drewolbrich/ScrollingContentViewController/raw/main/Images/Usage-Auto-Layout-Considerations.png" width="663px">
|
||||
|
||||
### Intrinsic Content Size
|
||||
|
||||
@@ -152,7 +158,7 @@ The default `UIView` content hugging priority is [`defaultLow`](https://develope
|
||||
|
||||
The content view is positioned within the scroll view's safe area. Consequently, the content view's background color won't extend underneath the status bar, home indicator, navigation bar, or toolbar.
|
||||
|
||||
<img src="https://github.com/drewolbrich/ScrollingContentViewController/raw/master/Images/Caveats-Background-Color-Content-View.png" width="233px">
|
||||
<img src="https://github.com/drewolbrich/ScrollingContentViewController/raw/main/Images/Caveats-Background-Color-Content-View.png" width="233px">
|
||||
|
||||
To specify a background color that extends to the edges of the screen:
|
||||
|
||||
@@ -174,7 +180,7 @@ If you make changes to your content view that modify its size, you must call the
|
||||
For example, after updating the view's [`NSLayoutConstraint.constant`](https://developer.apple.com/documentation/uikit/nslayoutconstraint/1526928-constant) properties, you may animate the changes like this:
|
||||
|
||||
```swift
|
||||
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0,
|
||||
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0,
|
||||
options: [], animations: {
|
||||
self.scrollView.setNeedsLayout()
|
||||
self.scrollView.layoutIfNeeded()
|
||||
@@ -185,7 +191,7 @@ UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSp
|
||||
|
||||
In Interface Builder, it's possible to design a view controller that is intentionally larger than the height of the screen. To do this, change the view controller's simulated size to Freeform and adjust its height. When used with ScrollingContentViewController, the view controller's oversized content view will scroll freely, assuming its constraints require it to be larger than the screen.
|
||||
|
||||
<img src="https://github.com/drewolbrich/ScrollingContentViewController/raw/master/Images/Usage-Oversized-View-Controllers.png" width="609px">
|
||||
<img src="https://github.com/drewolbrich/ScrollingContentViewController/raw/main/Images/Usage-Oversized-View-Controllers.png" width="609px">
|
||||
|
||||
## Usage Without Subclassing
|
||||
|
||||
@@ -248,7 +254,7 @@ class MyViewController: UIViewController {
|
||||
}
|
||||
```
|
||||
|
||||
The `ScrollingContentViewManager` class supports all of the same [properties](#properties) and [methods](#methods) as `ScrollingContentViewController`.
|
||||
The `ScrollingContentViewManager` class supports all of the same [properties](#view-controller-properties) and [methods](#scroll-view-properties-and-methods) as `ScrollingContentViewController`.
|
||||
|
||||
`ScrollingContentViewManager` can also be used to create a scrolling view controller programatically:
|
||||
|
||||
@@ -263,7 +269,7 @@ class MyViewController: UIViewController {
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
|
||||
// Populate your content view here.
|
||||
// ...
|
||||
|
||||
@@ -309,7 +315,7 @@ class MyViewController: UIViewController {
|
||||
|
||||
* [ManagerExample](Examples/ManagerExample) - Example using `ScrollingContentViewManager` and class composition instead of subclassing `ScrollingContentViewController`.
|
||||
|
||||
* [SequenceExample](Examples/SequenceExample) - Example of a sequence of pushed scrolling view controllers with keyboards in the context of a navigation controller.
|
||||
* [SequenceExample](Examples/SequenceExample) - Example of a sequence of pushed scrolling view controllers with keyboards in the context of a navigation controller.
|
||||
|
||||
* [ReassignExample](Examples/ReassignExample) - Example of dynamically reassigning `contentView`.
|
||||
|
||||
@@ -319,7 +325,7 @@ The `ScrollingContentViewController` and `ScrollingContentViewManager` classes s
|
||||
|
||||
### contentView
|
||||
|
||||
The scrolling content view parented to the scroll view.
|
||||
The scrolling content view parented to the scroll view.
|
||||
|
||||
When this property is first assigned, the view that it references is parented to [`scrollView`](#scrollView), which is then added to the view controller's view hierarchy.
|
||||
|
||||
@@ -327,7 +333,7 @@ If the content view already has a superview, the scroll view replaces it in the
|
||||
|
||||
If the content view has no superview, the scroll view is parented to the view controller's root view and its frame and autoresizing mask are defined to track the root view's bounds.
|
||||
|
||||
If the [`contentView`](#contentView) property is later reassigned, the new content view replaces the old one as the subview of the scroll view, and the scroll view is left otherwise unmodified.
|
||||
If the [`contentView`](#contentView) property is later reassigned, the new content view replaces the old one as the subview of the scroll view, and the scroll view is left otherwise unmodified.
|
||||
|
||||
### scrollView
|
||||
|
||||
@@ -385,13 +391,13 @@ The optional `margin` parameter specifies an extra margin around the first respo
|
||||
|
||||
ScrollingContentViewController inserts a scroll view between the content view and its superview, using Auto Layout to constrain the scroll view's content layout guide to the size of the content view. The content view's size is also constrained to be greater than or equal to the size of the scroll view's safe area, so it can utilize the full area of the screen assigned to the scroll view.
|
||||
|
||||
<img src="https://github.com/drewolbrich/ScrollingContentViewController/raw/master/Images/How-It-Works-View-Hierarchy.png" width="496px">
|
||||
<img src="https://github.com/drewolbrich/ScrollingContentViewController/raw/main/Images/How-It-Works-View-Hierarchy.png" width="496px">
|
||||
|
||||
When the content view is first assigned, if it has a superview, the scroll view replaces it in the view hierarchy and all of the superview's constraints that reference the content view are retargeted to the content view. The content view's width and height constraints and autoresizing mask are transferred to the scroll view.
|
||||
|
||||
If the content view has no superview, the scroll view is parented to the view controller's root view and its frame and autoresizing mask are defined to track the root view's bounds.
|
||||
|
||||
If the ScrollingContentViewController's `contentView` property references its root view, a new `UIView` is allocated and replaces it as the root view so that the scroll view will have an appropriate view to be parented to.
|
||||
If the ScrollingContentViewController's `contentView` property references its root view, a new `UIView` is allocated and replaces it as the root view so that the scroll view will have an appropriate view to be parented to.
|
||||
|
||||
The content view's superview does not necessarily have to be the view controller's root view, and does not have to match the root view's size.
|
||||
|
||||
@@ -417,7 +423,7 @@ To work around this issue, ScrollingContentViewController filters out sequences
|
||||
|
||||
During a device orientation transition, a [`keyboardWillHide`](https://developer.apple.com/documentation/uikit/uikeyboardwillhidenotification) notification is posted before the animation starts, followed by [`keyboardWillShow`](https://developer.apple.com/documentation/uikit/uiresponder/1621576-keyboardwillshownotification) after it ends, even though the keyboard remains visible during the transition. Because the duration of the animation exceeds the filtering time window, it is therefore necessary to temporarily suspend filtering during the transition. Otherwise, the content view would resize unnecessarily.
|
||||
|
||||
Finally, ScrollingContentViewController correctly handles the case where changes to the size or layout of the scroll view's content may occur in response to keyboard presentation or device orientation changes (in particular when [`shouldResizeContentViewForKeyboard`](#shouldResizeContentViewForKeyboard) is `true`), invaliding the coordinate space of the rectangle passed to [`scrollRectToVisible`](https://developer.apple.com/documentation/uikit/uiscrollview/1619439-scrollrecttovisible) (most importantly, in the case when that method is called automatically by iOS after keyboard changes) which would otherwise result in the scroll view scrolling by an inappropriate amount or leaving the scroll view with a content offset that is outside of the legal scrolling range.
|
||||
Finally, ScrollingContentViewController correctly handles the case where changes to the size or layout of the scroll view's content may occur in response to keyboard presentation or device orientation changes (in particular when [`shouldResizeContentViewForKeyboard`](#shouldResizeContentViewForKeyboard) is `true`), invalidating the coordinate space of the rectangle passed to [`scrollRectToVisible`](https://developer.apple.com/documentation/uikit/uiscrollview/1619439-scrollrecttovisible) (most importantly, in the case when that method is called automatically by iOS after keyboard changes) which would otherwise result in the scroll view scrolling by an inappropriate amount or leaving the scroll view with a content offset that is outside of the legal scrolling range.
|
||||
|
||||
Refer to Apple's [Managing the Keyboard](https://developer.apple.com/library/archive/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html#//apple_ref/doc/uid/TP40009542-CH5-SW3) documentation for more information about responding to changes in keyboard visibility.
|
||||
|
||||
@@ -427,7 +433,7 @@ In addition to [keyboard resize filtering](#keyboard-resize-filtering), above, S
|
||||
|
||||
### Navigation Controllers
|
||||
|
||||
ScrollingContentViewController correctly handles sequences of pushed view controllers in the context of a navigation controller, in particular in the case when each view controller calls a text field's [`becomeFirstResponder`](https://developer.apple.com/documentation/uikit/uiresponder/1621113-becomefirstresponder) method in [`viewWillAppear`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621510-viewwillappear), such that the keyboard remains visible across view controller transitions.
|
||||
ScrollingContentViewController correctly handles sequences of pushed view controllers in the context of a navigation controller, in particular in the case when each view controller calls a text field's [`becomeFirstResponder`](https://developer.apple.com/documentation/uikit/uiresponder/1621113-becomefirstresponder) method in [`viewWillAppear`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621510-viewwillappear), such that the keyboard remains visible across view controller transitions.
|
||||
|
||||
### Device Orientation Changes
|
||||
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
# Release Steps
|
||||
|
||||
1. Determine the new release number, like `1.6.6` and search and replace the previous version number with it in this file.
|
||||
|
||||
2. Verify that the tests pass:
|
||||
```
|
||||
xcodebuild test -scheme ScrollingContentViewControllerTests -sdk iphonesimulator16.2 -destination "OS=16.2,name=iPhone 14"
|
||||
```
|
||||
|
||||
3. In `Sources > Info.plist`, update `Bundle version string` with the new release number.
|
||||
|
||||
4. In `ScrollingContentViewController.podspec`, update `s.version` with the new release number.
|
||||
|
||||
5. Verify that the Swift package file is valid:
|
||||
```
|
||||
swift package describe
|
||||
```
|
||||
|
||||
6. Verify that the Cocoapods spec file is valid:
|
||||
```
|
||||
pod lib lint
|
||||
```
|
||||
|
||||
7. Commit the updated release number and Cocopods spec file:
|
||||
```
|
||||
git add -A && git commit -m "Release 1.6.6"
|
||||
git push
|
||||
```
|
||||
|
||||
8. Create a tag for the new release. For consistency, **do not** prefix tags with 'v'.
|
||||
```
|
||||
git tag '1.6.6'
|
||||
git push --tags
|
||||
```
|
||||
|
||||
9. Submit the new release to the Cocoapods specs repo:
|
||||
```
|
||||
pod trunk push ScrollingContentViewController.podspec
|
||||
```
|
||||
|
||||
If that doesn't work, first follow the steps at https://guides.cocoapods.org/making/getting-setup-with-trunk.html
|
||||
using the email address in `ScrollingContentViewController.podspec` to register the local device with the Cocoapods trunk.
|
||||
```
|
||||
pod trunk register drew@retroactivefiasco.com 'Drew Olbrich' --description='MacBook Pro'
|
||||
```
|
||||
|
||||
10. Draft a new release on GitHub at https://github.com/drewolbrich/ScrollingContentViewController/releases
|
||||
|
||||
11. For the new release, use the release number 1.6.6 as the title and prefix each item in the description with bullets, indicated by '*'.
|
||||
|
||||
12. Leave **Set as the latest release** checked and click **Publish**.
|
||||
@@ -1,6 +1,6 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'ScrollingContentViewController'
|
||||
s.version = '1.4.0'
|
||||
s.version = '1.6.6'
|
||||
s.summary = 'A Swift library that simplifies making a view controller\'s view scrollable'
|
||||
|
||||
s.description = <<-DESC
|
||||
@@ -17,9 +17,9 @@ device rotations.
|
||||
s.source = { :git => 'https://github.com/drewolbrich/ScrollingContentViewController.git', :tag => s.version.to_s }
|
||||
s.social_media_url = 'https://twitter.com/drewolbrich'
|
||||
|
||||
s.ios.deployment_target = '11.0'
|
||||
s.ios.deployment_target = '12.0'
|
||||
|
||||
s.source_files = 'Source/**/*.swift'
|
||||
s.source_files = 'Sources/**/*.swift'
|
||||
|
||||
s.frameworks = 'UIKit'
|
||||
|
||||
|
||||
@@ -3,15 +3,21 @@
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 50;
|
||||
objectVersion = 54;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
3A06577C2200A552005BE8CC /* IsUnitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A06577B2200A552005BE8CC /* IsUnitTest.swift */; };
|
||||
3A3652F621F38E750010CE55 /* StoryboardTests.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3A3652F521F38E750010CE55 /* StoryboardTests.storyboard */; };
|
||||
3A3652F821F390110010CE55 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A3652F721F390110010CE55 /* ContentView.swift */; };
|
||||
3A1A174626A4839F006EE907 /* UIView+FirstResponder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1A174526A4839F006EE907 /* UIView+FirstResponder.swift */; };
|
||||
3A1A176026A485BB006EE907 /* CodeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1A174B26A48489006EE907 /* CodeTests.swift */; };
|
||||
3A1A176226A485C3006EE907 /* StoryboardTests.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3A1A175426A48489006EE907 /* StoryboardTests.storyboard */; };
|
||||
3A1A176326A485C3006EE907 /* IntrinsicSizeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1A174926A48489006EE907 /* IntrinsicSizeTests.swift */; };
|
||||
3A1A176426A485C3006EE907 /* IntrinsicSizeContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1A174E26A48489006EE907 /* IntrinsicSizeContentView.swift */; };
|
||||
3A1A176526A485C3006EE907 /* StoryboardTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1A175526A48489006EE907 /* StoryboardTests.swift */; };
|
||||
3A1A176626A485C3006EE907 /* KeyboardTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1A175026A48489006EE907 /* KeyboardTests.swift */; };
|
||||
3A1A176726A485C3006EE907 /* ManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1A175226A48489006EE907 /* ManagerTests.swift */; };
|
||||
3A1A176826A485C3006EE907 /* InsetContentViewKeyboardTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1A174D26A48489006EE907 /* InsetContentViewKeyboardTests.swift */; };
|
||||
3A5702D821E2CBB600E4CC55 /* ScrollingContentViewController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A5702CE21E2CBB600E4CC55 /* ScrollingContentViewController.framework */; };
|
||||
3A5702DD21E2CBB600E4CC55 /* StoryboardTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A5702DC21E2CBB600E4CC55 /* StoryboardTests.swift */; };
|
||||
3A5702DF21E2CBB600E4CC55 /* ScrollingContentViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A5702D121E2CBB600E4CC55 /* ScrollingContentViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
3A61C80721EB9028001F76A8 /* SecondViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A61C80621EB9028001F76A8 /* SecondViewController.swift */; };
|
||||
3A61C80921EB9032001F76A8 /* ThirdViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A61C80821EB9032001F76A8 /* ThirdViewController.swift */; };
|
||||
@@ -34,16 +40,15 @@
|
||||
3A83273921E700A000E8D95C /* SignUpController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A83273721E700A000E8D95C /* SignUpController.swift */; };
|
||||
3A83273B21E703F600E8D95C /* SignUpControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A83273A21E703F600E8D95C /* SignUpControllerDelegate.swift */; };
|
||||
3A83273C21E703F600E8D95C /* SignUpControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A83273A21E703F600E8D95C /* SignUpControllerDelegate.swift */; };
|
||||
3A881DB9224525F500E21CA2 /* InsetContentViewKeyboardTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A881DB72245257E00E21CA2 /* InsetContentViewKeyboardTests.swift */; };
|
||||
3A89319329D0D127009BD5DD /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A89319229D0D127009BD5DD /* ContentView.swift */; };
|
||||
3AAC048F21E2D4C500D94DA5 /* ScrollingContentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAC048E21E2D4C500D94DA5 /* ScrollingContentViewController.swift */; };
|
||||
3AAC049121E2D4F100D94DA5 /* ScrollingContentViewManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAC049021E2D4F100D94DA5 /* ScrollingContentViewManager.swift */; };
|
||||
3AAC049821E2F01C00D94DA5 /* UIResponder+Current.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAC049321E2F01C00D94DA5 /* UIResponder+Current.swift */; };
|
||||
3AAC049921E2F01C00D94DA5 /* KeyboardObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAC049421E2F01C00D94DA5 /* KeyboardObserver.swift */; };
|
||||
3AAC049A21E2F01C00D94DA5 /* ScrollViewBounceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAC049521E2F01C00D94DA5 /* ScrollViewBounceController.swift */; };
|
||||
3AAC049B21E2F01C00D94DA5 /* AdditionalSafeAreaInsetsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAC049621E2F01C00D94DA5 /* AdditionalSafeAreaInsetsController.swift */; };
|
||||
3AAC049E21E2F18E00D94DA5 /* AdditionalSafeAreaInsetsControlling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAC049D21E2F18E00D94DA5 /* AdditionalSafeAreaInsetsControlling.swift */; };
|
||||
3AAC04A021E2F28A00D94DA5 /* ScrollViewBounceControlling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAC049F21E2F28A00D94DA5 /* ScrollViewBounceControlling.swift */; };
|
||||
3AAC04A221E2F30700D94DA5 /* KeyboardObservering.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAC04A121E2F30700D94DA5 /* KeyboardObservering.swift */; };
|
||||
3AAC04A221E2F30700D94DA5 /* KeyboardObserving.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAC04A121E2F30700D94DA5 /* KeyboardObserving.swift */; };
|
||||
3AAC04A421E301C400D94DA5 /* ScrollViewFilterKeyboardDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAC04A321E301C400D94DA5 /* ScrollViewFilterKeyboardDelegate.swift */; };
|
||||
3AAC04AD21E3A01900D94DA5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAC04AC21E3A01900D94DA5 /* AppDelegate.swift */; };
|
||||
3AAC04BC21E3A07500D94DA5 /* ScrollingContentViewController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A5702CE21E2CBB600E4CC55 /* ScrollingContentViewController.framework */; };
|
||||
@@ -66,11 +71,6 @@
|
||||
3AAC04FC21E4534600D94DA5 /* RoundedCornersImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAC04C421E3A43100D94DA5 /* RoundedCornersImage.swift */; };
|
||||
3AAC04FD21E4534600D94DA5 /* GradientBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAC04C521E3A43100D94DA5 /* GradientBackgroundView.swift */; };
|
||||
3AC88F5221E5B7F600EED460 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AC88F5021E5B7F600EED460 /* AppDelegate.swift */; };
|
||||
3AD597C921F3964000F220A0 /* CodeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AD597C821F3964000F220A0 /* CodeTests.swift */; };
|
||||
3AD597CB21F3995A00F220A0 /* ManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AD597CA21F3995A00F220A0 /* ManagerTests.swift */; };
|
||||
3AD597CD21F3AC2000F220A0 /* IntrinsicSizeContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AD597CC21F3AC2000F220A0 /* IntrinsicSizeContentView.swift */; };
|
||||
3AD597CF21F3AD8000F220A0 /* IntrinsicSizeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AD597CE21F3AD8000F220A0 /* IntrinsicSizeTests.swift */; };
|
||||
3AD597D121F3B70400F220A0 /* KeyboardTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AD597D021F3B70400F220A0 /* KeyboardTests.swift */; };
|
||||
3AD597D321F420ED00F220A0 /* KeyboardNotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AD597D221F420ED00F220A0 /* KeyboardNotificationManager.swift */; };
|
||||
3AD597D521F4221B00F220A0 /* KeyboardNotificationObserving.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AD597D421F4221B00F220A0 /* KeyboardNotificationObserving.swift */; };
|
||||
3ADD380A21EBFC6200396B7A /* KeyboardFrameEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ADD380921EBFC6200396B7A /* KeyboardFrameEvent.swift */; };
|
||||
@@ -199,14 +199,21 @@
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
3A06577B2200A552005BE8CC /* IsUnitTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IsUnitTest.swift; sourceTree = "<group>"; };
|
||||
3A3652F521F38E750010CE55 /* StoryboardTests.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = StoryboardTests.storyboard; sourceTree = "<group>"; };
|
||||
3A3652F721F390110010CE55 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
||||
3A1A174526A4839F006EE907 /* UIView+FirstResponder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+FirstResponder.swift"; sourceTree = "<group>"; };
|
||||
3A1A174726A483CB006EE907 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
3A1A174926A48489006EE907 /* IntrinsicSizeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntrinsicSizeTests.swift; sourceTree = "<group>"; };
|
||||
3A1A174B26A48489006EE907 /* CodeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodeTests.swift; sourceTree = "<group>"; };
|
||||
3A1A174D26A48489006EE907 /* InsetContentViewKeyboardTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InsetContentViewKeyboardTests.swift; sourceTree = "<group>"; };
|
||||
3A1A174E26A48489006EE907 /* IntrinsicSizeContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntrinsicSizeContentView.swift; sourceTree = "<group>"; };
|
||||
3A1A175026A48489006EE907 /* KeyboardTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyboardTests.swift; sourceTree = "<group>"; };
|
||||
3A1A175226A48489006EE907 /* ManagerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManagerTests.swift; sourceTree = "<group>"; };
|
||||
3A1A175426A48489006EE907 /* StoryboardTests.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = StoryboardTests.storyboard; sourceTree = "<group>"; };
|
||||
3A1A175526A48489006EE907 /* StoryboardTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoryboardTests.swift; sourceTree = "<group>"; };
|
||||
3A1A176A26A48701006EE907 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
3A5702CE21E2CBB600E4CC55 /* ScrollingContentViewController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ScrollingContentViewController.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
3A5702D121E2CBB600E4CC55 /* ScrollingContentViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ScrollingContentViewController.h; sourceTree = "<group>"; };
|
||||
3A5702D221E2CBB600E4CC55 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
3A5702D721E2CBB600E4CC55 /* ScrollingContentViewControllerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ScrollingContentViewControllerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
3A5702DC21E2CBB600E4CC55 /* StoryboardTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryboardTests.swift; sourceTree = "<group>"; };
|
||||
3A5702DE21E2CBB600E4CC55 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
3A5B3C98265D3D2100E26100 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
|
||||
3A61C80621EB9028001F76A8 /* SecondViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondViewController.swift; sourceTree = "<group>"; };
|
||||
3A61C80821EB9032001F76A8 /* ThirdViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThirdViewController.swift; sourceTree = "<group>"; };
|
||||
3A6273DF21E79757008EA567 /* ManagerExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ManagerExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
@@ -216,19 +223,19 @@
|
||||
3A7014BB21EBD723002C6740 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
3A83273721E700A000E8D95C /* SignUpController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpController.swift; sourceTree = "<group>"; };
|
||||
3A83273A21E703F600E8D95C /* SignUpControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpControllerDelegate.swift; sourceTree = "<group>"; };
|
||||
3A881DB72245257E00E21CA2 /* InsetContentViewKeyboardTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsetContentViewKeyboardTests.swift; sourceTree = "<group>"; };
|
||||
3A89319229D0D127009BD5DD /* ContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
||||
3A89319429D0D3AC009BD5DD /* Release-Steps.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "Release-Steps.md"; sourceTree = "<group>"; };
|
||||
3AAC048821E2D3FD00D94DA5 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
|
||||
3AAC048921E2D3FD00D94DA5 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
|
||||
3AAC048A21E2D3FD00D94DA5 /* ScrollingContentViewController.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; fileEncoding = 4; path = ScrollingContentViewController.podspec; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
|
||||
3AAC048A21E2D3FD00D94DA5 /* ScrollingContentViewController.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; fileEncoding = 4; path = ScrollingContentViewController.podspec; sourceTree = "<group>"; };
|
||||
3AAC048E21E2D4C500D94DA5 /* ScrollingContentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollingContentViewController.swift; sourceTree = "<group>"; };
|
||||
3AAC049021E2D4F100D94DA5 /* ScrollingContentViewManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollingContentViewManager.swift; sourceTree = "<group>"; };
|
||||
3AAC049321E2F01C00D94DA5 /* UIResponder+Current.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIResponder+Current.swift"; sourceTree = "<group>"; };
|
||||
3AAC049421E2F01C00D94DA5 /* KeyboardObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyboardObserver.swift; sourceTree = "<group>"; };
|
||||
3AAC049521E2F01C00D94DA5 /* ScrollViewBounceController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScrollViewBounceController.swift; sourceTree = "<group>"; };
|
||||
3AAC049621E2F01C00D94DA5 /* AdditionalSafeAreaInsetsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdditionalSafeAreaInsetsController.swift; sourceTree = "<group>"; };
|
||||
3AAC049D21E2F18E00D94DA5 /* AdditionalSafeAreaInsetsControlling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdditionalSafeAreaInsetsControlling.swift; sourceTree = "<group>"; };
|
||||
3AAC049F21E2F28A00D94DA5 /* ScrollViewBounceControlling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollViewBounceControlling.swift; sourceTree = "<group>"; };
|
||||
3AAC04A121E2F30700D94DA5 /* KeyboardObservering.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardObservering.swift; sourceTree = "<group>"; };
|
||||
3AAC04A121E2F30700D94DA5 /* KeyboardObserving.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardObserving.swift; sourceTree = "<group>"; };
|
||||
3AAC04A321E301C400D94DA5 /* ScrollViewFilterKeyboardDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollViewFilterKeyboardDelegate.swift; sourceTree = "<group>"; };
|
||||
3AAC04AA21E3A01900D94DA5 /* StoryboardExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StoryboardExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
3AAC04AC21E3A01900D94DA5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
@@ -246,12 +253,6 @@
|
||||
3AC88F4F21E5B7F500EED460 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
3AC88F5021E5B7F600EED460 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
3ACE0D7B220B34BE0093FE5A /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .swiftlint.yml; sourceTree = "<group>"; };
|
||||
3ACE0D7C220B34BE0093FE5A /* .travis.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .travis.yml; sourceTree = "<group>"; };
|
||||
3AD597C821F3964000F220A0 /* CodeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodeTests.swift; sourceTree = "<group>"; };
|
||||
3AD597CA21F3995A00F220A0 /* ManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagerTests.swift; sourceTree = "<group>"; };
|
||||
3AD597CC21F3AC2000F220A0 /* IntrinsicSizeContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntrinsicSizeContentView.swift; sourceTree = "<group>"; };
|
||||
3AD597CE21F3AD8000F220A0 /* IntrinsicSizeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntrinsicSizeTests.swift; sourceTree = "<group>"; };
|
||||
3AD597D021F3B70400F220A0 /* KeyboardTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardTests.swift; sourceTree = "<group>"; };
|
||||
3AD597D221F420ED00F220A0 /* KeyboardNotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardNotificationManager.swift; sourceTree = "<group>"; };
|
||||
3AD597D421F4221B00F220A0 /* KeyboardNotificationObserving.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardNotificationObserving.swift; sourceTree = "<group>"; };
|
||||
3ADD380921EBFC6200396B7A /* KeyboardFrameEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardFrameEvent.swift; sourceTree = "<group>"; };
|
||||
@@ -333,15 +334,66 @@
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
3A1A174826A48489006EE907 /* IntrinsicSizeTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3A1A174926A48489006EE907 /* IntrinsicSizeTests.swift */,
|
||||
3A1A174E26A48489006EE907 /* IntrinsicSizeContentView.swift */,
|
||||
);
|
||||
path = IntrinsicSizeTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A1A174A26A48489006EE907 /* CodeTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3A1A174B26A48489006EE907 /* CodeTests.swift */,
|
||||
);
|
||||
path = CodeTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A1A174C26A48489006EE907 /* InsetContentViewKeyboardTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3A1A174D26A48489006EE907 /* InsetContentViewKeyboardTests.swift */,
|
||||
);
|
||||
path = InsetContentViewKeyboardTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A1A174F26A48489006EE907 /* KeyboardTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3A1A175026A48489006EE907 /* KeyboardTests.swift */,
|
||||
);
|
||||
path = KeyboardTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A1A175126A48489006EE907 /* ManagerTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3A1A175226A48489006EE907 /* ManagerTests.swift */,
|
||||
);
|
||||
path = ManagerTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A1A175326A48489006EE907 /* StoryboardTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3A1A175426A48489006EE907 /* StoryboardTests.storyboard */,
|
||||
3A1A175526A48489006EE907 /* StoryboardTests.swift */,
|
||||
);
|
||||
path = StoryboardTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A5702C421E2CBB600E4CC55 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3AAC048921E2D3FD00D94DA5 /* LICENSE */,
|
||||
3AAC048821E2D3FD00D94DA5 /* README.md */,
|
||||
3A89319429D0D3AC009BD5DD /* Release-Steps.md */,
|
||||
3A5B3C98265D3D2100E26100 /* Package.swift */,
|
||||
3AAC048A21E2D3FD00D94DA5 /* ScrollingContentViewController.podspec */,
|
||||
3ACE0D7B220B34BE0093FE5A /* .swiftlint.yml */,
|
||||
3ACE0D7C220B34BE0093FE5A /* .travis.yml */,
|
||||
3A5702D021E2CBB600E4CC55 /* Source */,
|
||||
3A5702D021E2CBB600E4CC55 /* Sources */,
|
||||
3AAC04A521E39FBF00D94DA5 /* Examples */,
|
||||
3A5702DB21E2CBB600E4CC55 /* Tests */,
|
||||
3A5702CF21E2CBB600E4CC55 /* Products */,
|
||||
@@ -362,14 +414,38 @@
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A5702D021E2CBB600E4CC55 /* Source */ = {
|
||||
3A5702D021E2CBB600E4CC55 /* Sources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3A1A174726A483CB006EE907 /* Info.plist */,
|
||||
3A5B3CB9265D481400E26100 /* ScrollingContentViewController */,
|
||||
);
|
||||
path = Sources;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A5702DB21E2CBB600E4CC55 /* Tests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3A1A176A26A48701006EE907 /* Info.plist */,
|
||||
3A89319129D0D127009BD5DD /* Common */,
|
||||
3A1A174A26A48489006EE907 /* CodeTests */,
|
||||
3A1A174C26A48489006EE907 /* InsetContentViewKeyboardTests */,
|
||||
3A1A174826A48489006EE907 /* IntrinsicSizeTests */,
|
||||
3A1A174F26A48489006EE907 /* KeyboardTests */,
|
||||
3A1A175126A48489006EE907 /* ManagerTests */,
|
||||
3A1A175326A48489006EE907 /* StoryboardTests */,
|
||||
);
|
||||
path = Tests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A5B3CB9265D481400E26100 /* ScrollingContentViewController */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3AAC048E21E2D4C500D94DA5 /* ScrollingContentViewController.swift */,
|
||||
3AAC049021E2D4F100D94DA5 /* ScrollingContentViewManager.swift */,
|
||||
3ADD380B21EBFE8D00396B7A /* ScrollingContentScrollView.swift */,
|
||||
3AAC049421E2F01C00D94DA5 /* KeyboardObserver.swift */,
|
||||
3AAC04A121E2F30700D94DA5 /* KeyboardObservering.swift */,
|
||||
3AAC04A121E2F30700D94DA5 /* KeyboardObserving.swift */,
|
||||
3AD597D221F420ED00F220A0 /* KeyboardNotificationManager.swift */,
|
||||
3AD597D421F4221B00F220A0 /* KeyboardNotificationObserving.swift */,
|
||||
3AF3AA3621FACCAF008AF677 /* ScrollViewFilter.swift */,
|
||||
@@ -381,29 +457,11 @@
|
||||
3AAC049F21E2F28A00D94DA5 /* ScrollViewBounceControlling.swift */,
|
||||
3AAC049621E2F01C00D94DA5 /* AdditionalSafeAreaInsetsController.swift */,
|
||||
3AAC049D21E2F18E00D94DA5 /* AdditionalSafeAreaInsetsControlling.swift */,
|
||||
3AAC049321E2F01C00D94DA5 /* UIResponder+Current.swift */,
|
||||
3A1A174526A4839F006EE907 /* UIView+FirstResponder.swift */,
|
||||
3A06577B2200A552005BE8CC /* IsUnitTest.swift */,
|
||||
3A5702D121E2CBB600E4CC55 /* ScrollingContentViewController.h */,
|
||||
3A5702D221E2CBB600E4CC55 /* Info.plist */,
|
||||
);
|
||||
path = Source;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A5702DB21E2CBB600E4CC55 /* Tests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3A5702DC21E2CBB600E4CC55 /* StoryboardTests.swift */,
|
||||
3AD597C821F3964000F220A0 /* CodeTests.swift */,
|
||||
3AD597CA21F3995A00F220A0 /* ManagerTests.swift */,
|
||||
3AD597CE21F3AD8000F220A0 /* IntrinsicSizeTests.swift */,
|
||||
3AD597D021F3B70400F220A0 /* KeyboardTests.swift */,
|
||||
3A881DB72245257E00E21CA2 /* InsetContentViewKeyboardTests.swift */,
|
||||
3A3652F521F38E750010CE55 /* StoryboardTests.storyboard */,
|
||||
3A3652F721F390110010CE55 /* ContentView.swift */,
|
||||
3AD597CC21F3AC2000F220A0 /* IntrinsicSizeContentView.swift */,
|
||||
3A5702DE21E2CBB600E4CC55 /* Info.plist */,
|
||||
);
|
||||
path = Tests;
|
||||
path = ScrollingContentViewController;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A6273E021E79757008EA567 /* ManagerExample */ = {
|
||||
@@ -416,6 +474,14 @@
|
||||
path = ManagerExample;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A89319129D0D127009BD5DD /* Common */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3A89319229D0D127009BD5DD /* ContentView.swift */,
|
||||
);
|
||||
path = Common;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3AAC04A521E39FBF00D94DA5 /* Examples */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -646,7 +712,7 @@
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastSwiftUpdateCheck = 1010;
|
||||
LastUpgradeCheck = 1010;
|
||||
LastUpgradeCheck = 1250;
|
||||
ORGANIZATIONNAME = "Oath Inc.";
|
||||
TargetAttributes = {
|
||||
3A5702CD21E2CBB600E4CC55 = {
|
||||
@@ -715,7 +781,7 @@
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
3A3652F621F38E750010CE55 /* StoryboardTests.storyboard in Resources */,
|
||||
3A1A176226A485C3006EE907 /* StoryboardTests.storyboard in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -773,6 +839,7 @@
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
3ACE0D7A220B2D790093FE5A /* Run SwiftLint */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
@@ -787,7 +854,7 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "if which swiftlint >/dev/null; then\nswiftlint\nelse\necho \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n";
|
||||
shellScript = "# If we don't do this, then SwiftLint won't be found on M1 macs,\n# because it's installed in /opt/homebrew/bin instead of /usr/local/bin\n# on that platform \nif test -d \"/opt/homebrew/bin/\"; then\n PATH=\"/opt/homebrew/bin/:${PATH}\"\nfi\nexport PATH\n\nif which swiftlint >/dev/null; then\nswiftlint\nelse\necho \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n";
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
@@ -796,7 +863,6 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
3AAC049821E2F01C00D94DA5 /* UIResponder+Current.swift in Sources */,
|
||||
3ADD380A21EBFC6200396B7A /* KeyboardFrameEvent.swift in Sources */,
|
||||
3AF3AA3721FACCAF008AF677 /* ScrollViewFilter.swift in Sources */,
|
||||
3AAC04A421E301C400D94DA5 /* ScrollViewFilterKeyboardDelegate.swift in Sources */,
|
||||
@@ -805,10 +871,11 @@
|
||||
3AAC049921E2F01C00D94DA5 /* KeyboardObserver.swift in Sources */,
|
||||
3AF3AA3921FACCCC008AF677 /* ScrollViewFilterScrollDelegate.swift in Sources */,
|
||||
3AAC049B21E2F01C00D94DA5 /* AdditionalSafeAreaInsetsController.swift in Sources */,
|
||||
3A1A174626A4839F006EE907 /* UIView+FirstResponder.swift in Sources */,
|
||||
3AAC04A021E2F28A00D94DA5 /* ScrollViewBounceControlling.swift in Sources */,
|
||||
3AAC049E21E2F18E00D94DA5 /* AdditionalSafeAreaInsetsControlling.swift in Sources */,
|
||||
3AD597D521F4221B00F220A0 /* KeyboardNotificationObserving.swift in Sources */,
|
||||
3AAC04A221E2F30700D94DA5 /* KeyboardObservering.swift in Sources */,
|
||||
3AAC04A221E2F30700D94DA5 /* KeyboardObserving.swift in Sources */,
|
||||
3AD597D321F420ED00F220A0 /* KeyboardNotificationManager.swift in Sources */,
|
||||
3AF3AA3B21FCB76E008AF677 /* ScrollRectEvent.swift in Sources */,
|
||||
3A06577C2200A552005BE8CC /* IsUnitTest.swift in Sources */,
|
||||
@@ -821,14 +888,14 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
3A3652F821F390110010CE55 /* ContentView.swift in Sources */,
|
||||
3A5702DD21E2CBB600E4CC55 /* StoryboardTests.swift in Sources */,
|
||||
3AD597CF21F3AD8000F220A0 /* IntrinsicSizeTests.swift in Sources */,
|
||||
3A881DB9224525F500E21CA2 /* InsetContentViewKeyboardTests.swift in Sources */,
|
||||
3AD597D121F3B70400F220A0 /* KeyboardTests.swift in Sources */,
|
||||
3AD597C921F3964000F220A0 /* CodeTests.swift in Sources */,
|
||||
3AD597CD21F3AC2000F220A0 /* IntrinsicSizeContentView.swift in Sources */,
|
||||
3AD597CB21F3995A00F220A0 /* ManagerTests.swift in Sources */,
|
||||
3A1A176726A485C3006EE907 /* ManagerTests.swift in Sources */,
|
||||
3A1A176526A485C3006EE907 /* StoryboardTests.swift in Sources */,
|
||||
3A1A176826A485C3006EE907 /* InsetContentViewKeyboardTests.swift in Sources */,
|
||||
3A1A176626A485C3006EE907 /* KeyboardTests.swift in Sources */,
|
||||
3A89319329D0D127009BD5DD /* ContentView.swift in Sources */,
|
||||
3A1A176426A485C3006EE907 /* IntrinsicSizeContentView.swift in Sources */,
|
||||
3A1A176026A485BB006EE907 /* CodeTests.swift in Sources */,
|
||||
3A1A176326A485C3006EE907 /* IntrinsicSizeTests.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -1004,6 +1071,7 @@
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
@@ -1030,7 +1098,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
@@ -1068,6 +1136,7 @@
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
@@ -1088,7 +1157,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
@@ -1111,7 +1180,7 @@
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = "$(SRCROOT)/Source/Info.plist";
|
||||
INFOPLIST_FILE = "$(SRCROOT)/Sources/Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@@ -1138,7 +1207,7 @@
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = "$(SRCROOT)/Source/Info.plist";
|
||||
INFOPLIST_FILE = "$(SRCROOT)/Sources/Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
|
||||
+3
-7
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1010"
|
||||
LastUpgradeVersion = "1250"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -27,8 +27,6 @@
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
@@ -38,8 +36,8 @@
|
||||
ReferencedContainer = "container:ScrollingContentViewController.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
@@ -61,8 +59,6 @@
|
||||
ReferencedContainer = "container:ScrollingContentViewController.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
|
||||
+3
-7
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1010"
|
||||
LastUpgradeVersion = "1250"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -27,8 +27,6 @@
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
@@ -38,8 +36,8 @@
|
||||
ReferencedContainer = "container:ScrollingContentViewController.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
@@ -61,8 +59,6 @@
|
||||
ReferencedContainer = "container:ScrollingContentViewController.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1250"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "3AE989822206443B006254A4"
|
||||
BuildableName = "ReassignExample.app"
|
||||
BlueprintName = "ReassignExample"
|
||||
ReferencedContainer = "container:ScrollingContentViewController.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "3AE989822206443B006254A4"
|
||||
BuildableName = "ReassignExample.app"
|
||||
BlueprintName = "ReassignExample"
|
||||
ReferencedContainer = "container:ScrollingContentViewController.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "3AE989822206443B006254A4"
|
||||
BuildableName = "ReassignExample.app"
|
||||
BlueprintName = "ReassignExample"
|
||||
ReferencedContainer = "container:ScrollingContentViewController.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
+12
-16
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1010"
|
||||
LastUpgradeVersion = "1250"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -26,8 +26,17 @@
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
codeCoverageEnabled = "YES"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
codeCoverageEnabled = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "3A5702CD21E2CBB600E4CC55"
|
||||
BuildableName = "ScrollingContentViewController.framework"
|
||||
BlueprintName = "ScrollingContentViewController"
|
||||
ReferencedContainer = "container:ScrollingContentViewController.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
@@ -40,17 +49,6 @@
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "3A5702CD21E2CBB600E4CC55"
|
||||
BuildableName = "ScrollingContentViewController.framework"
|
||||
BlueprintName = "ScrollingContentViewController"
|
||||
ReferencedContainer = "container:ScrollingContentViewController.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
@@ -71,8 +69,6 @@
|
||||
ReferencedContainer = "container:ScrollingContentViewController.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1250"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "3A5702D621E2CBB600E4CC55"
|
||||
BuildableName = "ScrollingContentViewControllerTests.xctest"
|
||||
BlueprintName = "ScrollingContentViewControllerTests"
|
||||
ReferencedContainer = "container:ScrollingContentViewController.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
+3
-7
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1010"
|
||||
LastUpgradeVersion = "1250"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -27,8 +27,6 @@
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
@@ -38,8 +36,8 @@
|
||||
ReferencedContainer = "container:ScrollingContentViewController.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
@@ -61,8 +59,6 @@
|
||||
ReferencedContainer = "container:ScrollingContentViewController.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
|
||||
+3
-7
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1010"
|
||||
LastUpgradeVersion = "1250"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -27,8 +27,6 @@
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
@@ -38,8 +36,8 @@
|
||||
ReferencedContainer = "container:ScrollingContentViewController.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
@@ -61,8 +59,6 @@
|
||||
ReferencedContainer = "container:ScrollingContentViewController.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
//
|
||||
// UIResponder+Current.swift
|
||||
// ScrollingContentViewController
|
||||
//
|
||||
// Created by Drew Olbrich on 12/29/18.
|
||||
// Copyright 2019 Oath Inc.
|
||||
//
|
||||
// Licensed under the terms of the MIT License. See the file LICENSE for the full terms.
|
||||
//
|
||||
// Based on the Stack Overflow answer https://stackoverflow.com/a/52823735/2419404
|
||||
// by MarqueIV https://stackoverflow.com/users/168179/marqueiv
|
||||
// Licensed under the terms of the Attribution-ShareAlike 3.0 Unported license
|
||||
// https://creativecommons.org/licenses/by-sa/3.0/
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
private var foundFirstResponder: UIResponder?
|
||||
|
||||
internal extension UIResponder {
|
||||
|
||||
/// The current first responder.
|
||||
static var rf_current: UIResponder? {
|
||||
UIApplication.shared.sendAction(#selector(UIResponder.storeFirstResponder(_:)), to: nil, from: nil, for: nil)
|
||||
defer {
|
||||
foundFirstResponder = nil
|
||||
}
|
||||
return foundFirstResponder
|
||||
}
|
||||
|
||||
@objc private func storeFirstResponder(_ sender: AnyObject) {
|
||||
foundFirstResponder = self
|
||||
}
|
||||
|
||||
}
|
||||
@@ -15,7 +15,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.4.0</string>
|
||||
<string>1.6.6</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||
</dict>
|
||||
+1
-1
@@ -11,7 +11,7 @@
|
||||
import UIKit
|
||||
|
||||
/// Delegate for `AdditionalSafeAreaInsetsController`.
|
||||
internal protocol AdditionalSafeAreaInsetsControlling: class {
|
||||
internal protocol AdditionalSafeAreaInsetsControlling: AnyObject {
|
||||
|
||||
/// The view controller whose `additionalSafeAreaInsets` property is manipulated.
|
||||
var hostViewController: UIViewController? { get }
|
||||
+1
-1
@@ -8,7 +8,7 @@
|
||||
// Licensed under the terms of the MIT License. See the file LICENSE for the full terms.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
/// An event encapsulating both the keyboard's frame and the duration of the
|
||||
/// animation accompanying the change in the keyboard's frame, as reported by the
|
||||
+1
-1
@@ -12,7 +12,7 @@ import Foundation
|
||||
|
||||
/// A protocol for objects that should be notified by `KeyboardNotificationManager`
|
||||
/// when keyboard show or hide notifications are received.
|
||||
internal protocol KeyboardNotificationObserving: class {
|
||||
internal protocol KeyboardNotificationObserving: AnyObject {
|
||||
|
||||
/// Tells the observer that a keyboard notification has been received.
|
||||
func didReceiveKeyboardNotification(_ notification: Notification)
|
||||
+6
-7
@@ -20,10 +20,10 @@ internal class KeyboardObserver: NSObject {
|
||||
|
||||
// See https://developer.apple.com/library/archive/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html#//apple_ref/doc/uid/TP40009542-CH5-SW3
|
||||
|
||||
private weak var delegate: KeyboardObservering?
|
||||
|
||||
private weak var scrollViewFilter: ScrollViewFilter?
|
||||
|
||||
private weak var delegate: KeyboardObserving?
|
||||
|
||||
/// The duration of the animation of the change to the container view's bottom inset.
|
||||
private let bottomInsetAnimationDuration: TimeInterval = 0.5
|
||||
|
||||
@@ -31,7 +31,7 @@ internal class KeyboardObserver: NSObject {
|
||||
/// calls to `updateForCurrentKeyboardVisibility`.
|
||||
private var isAdjustingViewForKeyboardFrameEvent = false
|
||||
|
||||
init(scrollViewFilter: ScrollViewFilter, delegate: KeyboardObservering) {
|
||||
init(scrollViewFilter: ScrollViewFilter, delegate: KeyboardObserving) {
|
||||
super.init()
|
||||
|
||||
self.scrollViewFilter = scrollViewFilter
|
||||
@@ -183,7 +183,8 @@ internal class KeyboardObserver: NSObject {
|
||||
guard let userInfo = notification.userInfo,
|
||||
let keyboardFrameEndUserInfoValue = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue,
|
||||
let keyboardAnimationDurationNumber = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber,
|
||||
let window = UIApplication.shared.keyWindow
|
||||
let hostViewController = delegate?.hostViewController,
|
||||
let window = hostViewController.view.window
|
||||
else {
|
||||
return nil
|
||||
}
|
||||
@@ -276,9 +277,7 @@ extension KeyboardObserver: ScrollViewFilterKeyboardDelegate {
|
||||
guard let keyboardFrame = keyboardFrame,
|
||||
let hostViewController = delegate?.hostViewController,
|
||||
let rootView = hostViewController.view,
|
||||
// UIApplication.shared.keyWindow is nil when unit tests are executing, and
|
||||
// rootView is nil outside of unit tests in the case when a view is being pushed.
|
||||
let window = isUnitTest ? rootView.window : UIApplication.shared.keyWindow else {
|
||||
let window = rootView.window else {
|
||||
return nil
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// KeyboardObservering.swift
|
||||
// KeyboardObserving.swift
|
||||
// ScrollingContentViewController
|
||||
//
|
||||
// Created by Drew Olbrich on 1/6/19.
|
||||
@@ -11,7 +11,7 @@
|
||||
import UIKit
|
||||
|
||||
/// Delegate for `KeyboardObserver`.
|
||||
internal protocol KeyboardObservering: class {
|
||||
internal protocol KeyboardObserving: AnyObject {
|
||||
|
||||
/// View controller over top of which the keyboard is presented.
|
||||
var hostViewController: UIViewController? { get }
|
||||
+1
-1
@@ -8,7 +8,7 @@
|
||||
// Licensed under the terms of the MIT License. See the file LICENSE for the full terms.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
/// An event encapsulating a deferred call to `scrollRectToVisible(_:animated:)`.
|
||||
internal struct ScrollRectEvent {
|
||||
+1
-1
@@ -11,7 +11,7 @@
|
||||
import UIKit
|
||||
|
||||
/// Delegate for `ScrollViewBounceController`.
|
||||
internal protocol ScrollViewBounceControlling: class {
|
||||
internal protocol ScrollViewBounceControlling: AnyObject {
|
||||
|
||||
/// Scroll view whose `alwaysBounceVertical` property is manipulated.
|
||||
var scrollView: ScrollingContentScrollView { get }
|
||||
+1
-1
@@ -12,7 +12,7 @@ import UIKit
|
||||
|
||||
/// A protocol that an object implements to be notified by `ScrollViewFilter` about
|
||||
/// keyboard frame changes.
|
||||
internal protocol ScrollViewFilterKeyboardDelegate: class {
|
||||
internal protocol ScrollViewFilterKeyboardDelegate: AnyObject {
|
||||
|
||||
/// Adjusts the view to compensate for the portion of the keyboard that overlaps the
|
||||
/// scroll view.
|
||||
+1
-1
@@ -13,7 +13,7 @@ import UIKit
|
||||
/// A protocol that an object implements to be notified by `ScrollViewFilter` about
|
||||
/// requests to scroll a specific area of the content so that it is visible in the
|
||||
/// scroll view.
|
||||
internal protocol ScrollViewFilterScrollDelegate: class {
|
||||
internal protocol ScrollViewFilterScrollDelegate: AnyObject {
|
||||
|
||||
/// Scrolls a specific area of the content so that it is visible in the scroll view.
|
||||
func scrollViewFilter(_ scrollViewFilter: ScrollViewFilter, adjustViewForScrollRectEvent scrollRectEvent: ScrollRectEvent)
|
||||
+5
-5
@@ -87,7 +87,7 @@ public class ScrollingContentScrollView: UIScrollView {
|
||||
// between the time when self.scrollRectToVisible and super.scrollRectToVisible are
|
||||
// called.
|
||||
// Note: This does not handle the case where the rect is smaller than the
|
||||
// descendant view's bounds and the size of the descedant view changes.
|
||||
// descendant view's bounds and the size of the descendant view changes.
|
||||
let boundsRect = descendantView.convert(rect, from: self)
|
||||
let rect: CGRect? = boundsRect == descendantView.bounds ? nil : boundsRect
|
||||
scrollViewFilter?.submitScrollRectEvent(ScrollRectEvent(contentArea: .descendantViewRect(rect, descendantView: descendantView), animated: animated, margin: margin ?? visibilityScrollMargin))
|
||||
@@ -111,7 +111,7 @@ public class ScrollingContentScrollView: UIScrollView {
|
||||
/// - view: The view to make visible.
|
||||
/// - animated: If `true`, the scrolling is animated.
|
||||
/// - margin: An optional margin to apply to the view. If left unspecified,
|
||||
/// `scrollToVisibleMargin` is used.
|
||||
/// `visibilityScrollMargin` is used.
|
||||
public func scrollViewToVisible(_ view: UIView, animated: Bool, margin: CGFloat? = nil) {
|
||||
scrollViewFilter?.submitScrollRectEvent(ScrollRectEvent(contentArea: .descendantViewRect(view.bounds, descendantView: view), animated: animated, margin: margin ?? visibilityScrollMargin))
|
||||
|
||||
@@ -124,16 +124,16 @@ public class ScrollingContentScrollView: UIScrollView {
|
||||
/// - Parameters:
|
||||
/// - animated: If `true`, the scrolling is animated.
|
||||
/// - margin: An optional margin to apply to the first responder. If left
|
||||
/// unspecified, `scrollToVisibleMargin` is used.
|
||||
/// unspecified, `visibilityScrollMargin` is used.
|
||||
public func scrollFirstResponderToVisible(animated: Bool, margin: CGFloat? = nil) {
|
||||
guard let view = UIResponder.rf_current as? UIView else {
|
||||
guard let view = self.firstResponder as? UIView else {
|
||||
return
|
||||
}
|
||||
|
||||
scrollViewToVisible(view, animated: animated, margin: margin)
|
||||
}
|
||||
|
||||
/// Returns the descedant view with the greatest depth whose bounds contains the
|
||||
/// Returns the descendant view with the greatest depth whose bounds contains the
|
||||
/// specified rectangle.
|
||||
///
|
||||
/// - Parameters:
|
||||
+6
-6
@@ -58,12 +58,12 @@ open class ScrollingContentViewController: UIViewController {
|
||||
///
|
||||
/// The default value is `false`.
|
||||
@IBInspectable public var shouldResizeContentViewForKeyboard: Bool {
|
||||
set {
|
||||
scrollingContentViewManager.shouldResizeContentViewForKeyboard = newValue
|
||||
}
|
||||
get {
|
||||
return scrollingContentViewManager.shouldResizeContentViewForKeyboard
|
||||
}
|
||||
set {
|
||||
scrollingContentViewManager.shouldResizeContentViewForKeyboard = newValue
|
||||
}
|
||||
}
|
||||
|
||||
/// If `true`, the view controller's `additionalSafeAreaInsets` property is adjusted
|
||||
@@ -71,12 +71,12 @@ open class ScrollingContentViewController: UIViewController {
|
||||
///
|
||||
/// The default value is `true`.
|
||||
@IBInspectable public var shouldAdjustAdditionalSafeAreaInsetsForKeyboard: Bool {
|
||||
set {
|
||||
scrollingContentViewManager.shouldAdjustAdditionalSafeAreaInsetsForKeyboard = newValue
|
||||
}
|
||||
get {
|
||||
return scrollingContentViewManager.shouldAdjustAdditionalSafeAreaInsetsForKeyboard
|
||||
}
|
||||
set {
|
||||
scrollingContentViewManager.shouldAdjustAdditionalSafeAreaInsetsForKeyboard = newValue
|
||||
}
|
||||
}
|
||||
|
||||
/// An object that manages adding a content view to a scroll view.
|
||||
+3
-3
@@ -19,7 +19,7 @@ import UIKit
|
||||
/// `ScrollingContentViewManager` may be used instead.
|
||||
///
|
||||
/// See [https://github.com/drewolbrich/ScrollingContentViewController](https://github.com/drewolbrich/ScrollingContentViewController/blob/master/README.md) for full documentation.
|
||||
public class ScrollingContentViewManager: KeyboardObservering, ScrollViewBounceControlling, AdditionalSafeAreaInsetsControlling {
|
||||
public class ScrollingContentViewManager: KeyboardObserving, ScrollViewBounceControlling, AdditionalSafeAreaInsetsControlling {
|
||||
|
||||
/// The view controller that hosts the scroll view.
|
||||
public private(set) weak var hostViewController: UIViewController?
|
||||
@@ -455,7 +455,7 @@ public class ScrollingContentViewManager: KeyboardObservering, ScrollViewBounceC
|
||||
return
|
||||
}
|
||||
|
||||
// The relation greaterThanOrEqualTo is used for the minimumum width and height
|
||||
// The relation greaterThanOrEqualTo is used for the minimum width and height
|
||||
// constraints so the content view is free to stretch to fill the scroll view's
|
||||
// safe area.
|
||||
|
||||
@@ -482,7 +482,7 @@ public class ScrollingContentViewManager: KeyboardObservering, ScrollViewBounceC
|
||||
contentViewMinimumWidthConstraint,
|
||||
contentViewMinimumHeightConstraint,
|
||||
contentViewMinimumHeightForPresentedKeyboardConstraint
|
||||
]
|
||||
]
|
||||
|
||||
NSLayoutConstraint.activate(constraints)
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
//
|
||||
// UIView+FirstResponder.swift
|
||||
// ScrollingContentViewController
|
||||
//
|
||||
// Created by Drew Olbrich on 12/29/18.
|
||||
// Copyright 2019 Oath Inc.
|
||||
//
|
||||
// Licensed under the terms of the MIT License. See the file LICENSE for the full terms.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
internal extension UIView {
|
||||
|
||||
/// The first responder within a view hierarchy.
|
||||
var firstResponder: UIResponder? {
|
||||
let responder = self as UIResponder
|
||||
if responder.isFirstResponder {
|
||||
return responder
|
||||
}
|
||||
|
||||
for subview in subviews {
|
||||
if let firstResponder = subview.firstResponder {
|
||||
return firstResponder
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
}
|
||||
@@ -10,15 +10,15 @@
|
||||
|
||||
import UIKit
|
||||
|
||||
/// A view assigned `contentView` property in StoryboardTests.storyboard.
|
||||
class ContentView: UIView {
|
||||
/// A content view used by `StoryboardTests`, `CodeTests`, and `ManagerTests`.
|
||||
public class ContentView: UIView {
|
||||
|
||||
/// A constraint that determines the view's width.
|
||||
var widthConstraint: NSLayoutConstraint!
|
||||
public var widthConstraint: NSLayoutConstraint!
|
||||
|
||||
/// A constraint that determine the view's height. This constraint's constant is
|
||||
/// manipulated externally to test the behavior of views of varying heights.
|
||||
var heightConstraint: NSLayoutConstraint!
|
||||
public var heightConstraint: NSLayoutConstraint!
|
||||
|
||||
override init(frame: CGRect) {
|
||||
super.init(frame: frame)
|
||||
+2
-1
@@ -118,10 +118,11 @@ class InsetContentViewKeyboardTests: XCTestCase {
|
||||
scrollingContentViewManager.shouldResizeContentViewForKeyboard = true
|
||||
|
||||
let initialContentViewSize = scrollView.safeAreaLayoutGuide.layoutFrame.size
|
||||
let initialBottomSafeAreaInset = rootView.safeAreaInsets.bottom - tabBarHeight
|
||||
|
||||
presentKeyboard()
|
||||
|
||||
let expectedContentViewSize = CGSize(width: initialContentViewSize.width, height: initialContentViewSize.height - (keyboardHeight - tabBarHeight))
|
||||
let expectedContentViewSize = CGSize(width: initialContentViewSize.width, height: initialContentViewSize.height - (keyboardHeight - tabBarHeight) + initialBottomSafeAreaInset)
|
||||
|
||||
XCTAssertEqual(contentView.frame.size, expectedContentViewSize)
|
||||
}
|
||||
@@ -105,12 +105,13 @@ class KeyboardTests: XCTestCase {
|
||||
scrollingContentViewManager.shouldResizeContentViewForKeyboard = true
|
||||
|
||||
let initialContentViewSize = rootView.bounds.inset(by: rootView.safeAreaInsets).size
|
||||
let initialBottomSafeAreaInset = rootView.safeAreaInsets.bottom - tabBarHeight
|
||||
|
||||
presentKeyboard()
|
||||
|
||||
// The size of the expected safe area of the view controller's root view after the
|
||||
// keyboard is presented.
|
||||
let expectedContentViewSize = CGSize(width: initialContentViewSize.width, height: initialContentViewSize.height - (keyboardHeight - tabBarHeight))
|
||||
let expectedContentViewSize = CGSize(width: initialContentViewSize.width, height: initialContentViewSize.height - (keyboardHeight - tabBarHeight) + initialBottomSafeAreaInset)
|
||||
|
||||
XCTAssertEqual(contentView.frame.size, expectedContentViewSize)
|
||||
}
|
||||
Reference in New Issue
Block a user