28 Commits

Author SHA1 Message Date
Tosin Afolabi 1defbf2a47 Update PanModal.podspec 2019-03-20 14:09:32 -07:00
Tosin Afolabi b58552279e Update PanModal.podspec 2019-03-20 14:09:01 -07:00
Stephen Sowole ef7f00dab7 Replace isPanScrollEnabled with shouldRespond(to .. (#10)
* Replace `isPanScrollEnabled` with `shouldRespond(to ..`

* Update PanModalPresentable+Defaults.swift
2019-03-20 13:58:17 -07:00
Stephen Sowole d70dce231f Documentation nits. 2019-03-19 18:56:55 -07:00
Abdurahim Jauzee 5baac6732e [Trivial] Exclude Info.plist from Compile Sources (#8) 2019-03-18 09:47:12 -07:00
Tosin Afolabi 1d8b218056 minor nits. 2019-03-14 13:56:25 -07:00
Tosin Afolabi ae78bd6f64 Minor nits. 2019-03-14 13:56:15 -07:00
Tosin Afolabi 2b3029333e Fix Tests Scheme. 2019-03-14 13:48:38 -07:00
Tosin Afolabi f71fa70302 Merge pull request #5 from Marcocanc/intrinsic-height
Add Intrinsic Height to PanModalHeight
2019-03-14 13:44:47 -07:00
Tosin Afolabi 6438b952cc Merge pull request #6 from Marcocanc/corner-radius
Add configurable cornerRadius
2019-03-14 13:43:55 -07:00
Marco Cancellieri a7d7033ef0 nit 2019-03-14 21:40:13 +01:00
Marco Cancellieri 3f3124ae37 pr comment 2019-03-14 21:38:02 +01:00
Marco Cancellieri 0da0a44c4a pr comments 2019-03-14 21:35:20 +01:00
Tosin Afolabi 88dc3324f6 Merge pull request #4 from Marcocanc/status-bar-appearance
Add support for changing status bar appearance
2019-03-14 13:30:26 -07:00
Marco Cancellieri d0b094292f Add configurable cornerRadius 2019-03-14 19:23:45 +01:00
Tosin Afolabi 15f39a1929 Update CONTRIBUTING.md 2019-03-14 11:04:31 -07:00
Tosin Afolabi f5379a1051 Merge pull request #2 from Marcocanc/carthage-deployment-target
Set Deployment Target to 10.0 for Carthage
2019-03-14 10:36:52 -07:00
Marco Cancellieri 21bcb6f268 Add Intrinsic Height 2019-03-14 18:17:29 +01:00
Marco Cancellieri f7cb63caaa Add support for changing status bar appearance 2019-03-14 16:17:49 +01:00
Marco Cancellieri c83516694f Set Deployment Target to 10.0 2019-03-14 13:41:55 +01:00
Tosin Afolabi d9f37de98c Update Scheme. 2019-03-13 16:00:53 -07:00
Tosin Afolabi b1c2d82029 Progress on Carthage Support. 2019-03-13 15:54:44 -07:00
Tosin Afolabi 68e21c3988 Add Project Scheme. 2019-03-13 15:25:13 -07:00
Tosin Afolabi a8408ebb80 Update podspec. 2019-03-13 15:02:48 -07:00
Tosin Afolabi 714d1bf03f Update version number. 2019-03-13 15:02:17 -07:00
Tosin Afolabi 444b342748 Update swift version in Podspec. 2019-03-13 14:55:40 -07:00
Tosin Afolabi 7b3c3d210c Update Podspec version 2019-03-13 14:46:42 -07:00
Tosin Afolabi f58cda2863 update podspec. 2019-03-13 14:42:09 -07:00
21 changed files with 533 additions and 78 deletions
+1 -1
View File
@@ -35,7 +35,7 @@ Issues labelled `good first contribution`.
For your contribution to be accepted:
- [x] You must have signed the [Contributor License Agreement (CLA)](https://cla-assistant.io/PanModal).
- [x] You must have signed the [Contributor License Agreement (CLA)](https://cla-assistant.io/slackHQ/PanModal).
- [x] The test suite must be complete and pass.
- [x] The changes must be approved by code review.
- [x] Commits should be atomic and messages must be descriptive. Related issues should be mentioned by Issue number.
+5 -9
View File
@@ -8,7 +8,7 @@
Pod::Spec.new do |s|
s.name = 'PanModal'
s.version = '1.0'
s.version = '1.2'
s.summary = 'PanModal is an elegant and highly customizable presentation API for constructing bottom sheet modals on iOS.'
# This description is used to generate tags and improve search results.
@@ -17,17 +17,13 @@ Pod::Spec.new do |s|
# * Write the description between the DESC delimiters below.
# * Finally, don't worry about the indent, CocoaPods strips it!
s.description = <<-DESC
PanModal is an elegant and highly customizable presentation API for constructing bottom sheet modals on iOS.
DESC
s.description = 'PanModal is an elegant and highly customizable presentation API for constructing bottom sheet modals on iOS.'
s.homepage = 'https://github.com/slackhq/PanModal'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'slack' => 'opensource@slack.com' }
s.source = { :git => 'https://github.com/slackhq/PanModal.git', :tag => s.version.to_s }
s.social_media_url = 'https://twitter.com/slackhq
s.social_media_url = 'https://twitter.com/slackhq'
s.ios.deployment_target = '10.0'
s.source_files = 'PanModal/**/*'
s.swift_version = '4.2'
s.source_files = 'PanModal/**/*.{swift,h,m}'
end
@@ -36,7 +36,6 @@ public class PanModalPresentationController: UIPresentationController {
Constants
*/
struct Constants {
static let cornerRadius = CGFloat(8.0)
static let indicatorYOffset = CGFloat(8.0)
static let snapMovementSensitivity = CGFloat(0.7)
static let dragIndicatorSize = CGSize(width: 36.0, height: 5.0)
@@ -186,6 +185,7 @@ public class PanModalPresentationController: UIPresentationController {
coordinator.animate(alongsideTransition: { [weak self] _ in
self?.backgroundView.dimState = .max
self?.presentedViewController.setNeedsStatusBarAppearanceUpdate()
})
}
@@ -203,6 +203,7 @@ public class PanModalPresentationController: UIPresentationController {
coordinator.animate(alongsideTransition: { [weak self] _ in
self?.dragIndicatorView.alpha = 0.0
self?.backgroundView.dimState = .off
self?.presentingViewController.setNeedsStatusBarAppearanceUpdate()
})
}
@@ -413,7 +414,6 @@ private extension PanModalPresentationController {
to avoid visual bugs
*/
scrollView.showsVerticalScrollIndicator = false
scrollView.isScrollEnabled = presentable?.isPanScrollEnabled ?? true
scrollView.scrollIndicatorInsets = presentable?.scrollIndicatorInsets ?? .zero
/**
@@ -443,8 +443,7 @@ private extension PanModalPresentationController {
@objc func didPanOnPresentedView(_ recognizer: UIPanGestureRecognizer) {
guard
presentable?.isPanScrollEnabled == true,
!shouldFail(panGestureRecognizer: recognizer),
shouldRespond(to: panGestureRecognizer),
let containerView = containerView
else {
recognizer.setTranslation(.zero, in: recognizer.view)
@@ -514,6 +513,26 @@ private extension PanModalPresentationController {
}
}
/**
Determine if the pan modal should respond to the gesture recognizer.
If the pan modal is already being dragged & the delegate returns false, ignore until
the recognizer is back to it's original state (.began)
This is the only time we should be cancelling the pan modal gesture recognizer
*/
func shouldRespond(to panGestureRecognizer: UIPanGestureRecognizer) -> Bool {
guard
presentable?.shouldRespond(to: panGestureRecognizer) == true ||
!(panGestureRecognizer.state == .began || panGestureRecognizer.state == .cancelled)
else {
panGestureRecognizer.isEnabled = false
panGestureRecognizer.isEnabled = true
return false
}
return !shouldFail(panGestureRecognizer: panGestureRecognizer)
}
/**
Communicate intentions to presentable and adjust subviews in containerView
*/
@@ -549,7 +568,7 @@ private extension PanModalPresentationController {
Allow api consumers to override the internal conditions &
decide if the pan gesture recognizer should be prioritized.
This is the only time we should be cancelling a recognizer,
This is the only time we should be cancelling the panScrollable recognizer,
for the purpose of ensuring we're no longer tracking the scrollView
*/
guard !shouldPrioritize(panGestureRecognizer: panGestureRecognizer) else {
@@ -576,7 +595,7 @@ private extension PanModalPresentationController {
*/
func shouldPrioritize(panGestureRecognizer: UIPanGestureRecognizer) -> Bool {
return panGestureRecognizer.state == .began &&
presentable?.shouldPrioritize(panModalGestureRecognizer: panGestureRecognizer) ?? false
presentable?.shouldPrioritize(panModalGestureRecognizer: panGestureRecognizer) == true
}
/**
@@ -797,37 +816,23 @@ private extension PanModalPresentationController {
because we render the dragIndicator outside of view bounds
*/
func addRoundedCorners(to view: UIView) {
let radius = presentable?.cornerRadius ?? 0
let path = UIBezierPath(roundedRect: view.bounds,
byRoundingCorners: [.topLeft, .topRight],
cornerRadii: CGSize(width: radius, height: radius))
let path = UIBezierPath()
path.move(to: CGPoint(x: 0, y: Constants.cornerRadius))
// 1. Draw left rounded corner
path.addArc(withCenter: CGPoint(x: path.currentPoint.x + Constants.cornerRadius, y: path.currentPoint.y),
radius: Constants.cornerRadius, startAngle: .pi, endAngle: 3.0 * .pi/2.0, clockwise: true)
// 2. Draw around the drag indicator view, if displayed
// Draw around the drag indicator view, if displayed
if presentable?.showDragIndicator == true {
let indicatorLeftEdgeXPos = view.bounds.width/2.0 - Constants.dragIndicatorSize.width/2.0
drawAroundDragIndicator(currentPath: path, indicatorLeftEdgeXPos: indicatorLeftEdgeXPos)
}
// 3. Draw line to right side of presented view, leaving space to draw rounded corner
path.addLine(to: CGPoint(x: view.bounds.width - Constants.cornerRadius, y: path.currentPoint.y))
// 4. Draw right rounded corner
path.addArc(withCenter: CGPoint(x: path.currentPoint.x, y: path.currentPoint.y + Constants.cornerRadius),
radius: Constants.cornerRadius, startAngle: 3.0 * .pi/2.0, endAngle: 0, clockwise: true)
// 5. Draw around final edges of view
path.addLine(to: CGPoint(x: path.currentPoint.x, y: view.bounds.height))
path.addLine(to: CGPoint(x: 0, y: path.currentPoint.y))
// 6. Set path as a mask to display optional drag indicator view & rounded corners
// Set path as a mask to display optional drag indicator view & rounded corners
let mask = CAShapeLayer()
mask.path = path.cgPath
view.layer.mask = mask
// 7. Improve performance by rasterizing the layer
// Improve performance by rasterizing the layer
view.layer.shouldRasterize = true
view.layer.rasterizationScale = UIScreen.main.scale
}
+22
View File
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
</dict>
</plist>
+19
View File
@@ -0,0 +1,19 @@
//
// PanModal.h
// PanModal
//
// Created by Tosin A on 3/13/19.
// Copyright © 2019 Detail. All rights reserved.
//
#import <UIKit/UIKit.h>
//! Project version number for PanModal.
FOUNDATION_EXPORT double PanModalVersionNumber;
//! Project version string for PanModal.
FOUNDATION_EXPORT const unsigned char PanModalVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <PanModal/PublicHeader.h>
+5 -1
View File
@@ -1,6 +1,6 @@
//
// PanModalHeight.swift
// SlackUI
// PanModal
//
// Copyright © 2019 Tiny Speck, Inc. All rights reserved.
//
@@ -35,4 +35,8 @@ public enum PanModalHeight: Equatable {
*/
case contentHeightIgnoringSafeArea(CGFloat)
/**
Sets the height to be the intrinsic content height
*/
case intrinsicHeight
}
@@ -2,7 +2,6 @@
// PanModalPresentable+Defaults.swift
// PanModal
//
// Created by Stephen Sowole on 11/5/18.
// Copyright © 2018 Tiny Speck, Inc. All rights reserved.
//
@@ -31,6 +30,10 @@ public extension PanModalPresentable where Self: UIViewController {
return .contentHeight(scrollView.contentSize.height)
}
var cornerRadius: CGFloat {
return 8.0
}
var springDamping: CGFloat {
return 0.8
}
@@ -40,7 +43,7 @@ public extension PanModalPresentable where Self: UIViewController {
}
var scrollIndicatorInsets: UIEdgeInsets {
let top = shouldRoundTopCorners ? PanModalPresentationController.Constants.cornerRadius : 0
let top = shouldRoundTopCorners ? cornerRadius : 0
return UIEdgeInsets(top: CGFloat(top), left: 0, bottom: bottomLayoutOffset, right: 0)
}
@@ -61,10 +64,6 @@ public extension PanModalPresentable where Self: UIViewController {
return true
}
var isPanScrollEnabled: Bool {
return true
}
var isUserInteractionEnabled: Bool {
return true
}
@@ -81,7 +80,11 @@ public extension PanModalPresentable where Self: UIViewController {
return shouldRoundTopCorners
}
func willRespond(to panGestureRecognizer: UIPanGestureRecognizer) {
func shouldRespond(to panModalGestureRecognizer: UIPanGestureRecognizer) -> Bool {
return true
}
func willRespond(to panModalGestureRecognizer: UIPanGestureRecognizer) {
}
@@ -90,6 +90,12 @@ extension PanModalPresentable where Self: UIViewController {
return bottomYPos - (height + bottomLayoutOffset)
case .contentHeightIgnoringSafeArea(let height):
return bottomYPos - height
case .intrinsicHeight:
view.layoutIfNeeded()
let targetSize = CGSize(width: (presentedVC?.containerView?.bounds ?? UIScreen.main.bounds).width,
height: UIView.layoutFittingCompressedSize.height)
let intrinsicHeight = view.systemLayoutSizeFitting(targetSize).height
return bottomYPos - (intrinsicHeight + bottomLayoutOffset)
}
}
+22 -16
View File
@@ -13,7 +13,7 @@ import UIKit
Usage:
```
extension UIViewController: PanModalPresentable {
extension YourViewController: PanModalPresentable {
func shouldRoundTopCorners: Bool { return false }
}
```
@@ -54,6 +54,13 @@ public protocol PanModalPresentable {
*/
var longFormHeight: PanModalHeight { get }
/**
The corner radius used when `shouldRoundTopCorners` is enabled.
Default Value is 8.0.
*/
var cornerRadius: CGFloat { get }
/**
The springDamping value used to determine the amount of 'bounce'
seen when transitioning to short/long form.
@@ -91,29 +98,19 @@ public protocol PanModalPresentable {
A flag to determine if scrolling should seamlessly transition from the pan modal container view to
the embedded scroll view once the scroll limit has been reached.
Default value is false.
Unless a scrollView is provided and the content exceeds the longForm height
Default value is false. Unless a scrollView is provided and the content height exceeds the longForm height.
*/
var allowsExtendedPanScrolling: Bool { get }
/**
A flag to determine if dismissal should be initiated when swiping down on the presented view.
Return false to fallback to the short form state instead of dismissing.
Default value is true.
*/
var allowsDragToDismiss: Bool { get }
/**
A flag to determine if scrolling should be enabled on the entire view.
- Note: Returning false will disable scrolling on the embedded scrollview as well as on the
pan modal container view.
Default value is true.
*/
var isPanScrollEnabled: Bool { get }
/**
A flag to toggle user interactions on the container view.
@@ -145,6 +142,15 @@ public protocol PanModalPresentable {
*/
var showDragIndicator: Bool { get }
/**
Asks the delegate if the pan modal should respond to the pan modal gesture recognizer.
Return false to disable movement on the pan modal but maintain gestures on the presented view.
Default value is true.
*/
func shouldRespond(to panModalGestureRecognizer: UIPanGestureRecognizer) -> Bool
/**
Notifies the delegate when the pan modal gesture recognizer state is either
`began` or `changed`. This method gives the delegate a chance to prepare
@@ -154,7 +160,7 @@ public protocol PanModalPresentable {
Default value is an empty implementation.
*/
func willRespond(to panGestureRecognizer: UIPanGestureRecognizer)
func willRespond(to panModalGestureRecognizer: UIPanGestureRecognizer)
/**
Asks the delegate if the pan modal gesture recognizer should be prioritized.
@@ -162,8 +168,8 @@ public protocol PanModalPresentable {
For example, you can use this to define a region
where you would like to restrict where the pan gesture can start.
If false, then we rely on the internal conditions of when a pan gesture
should succeed or fail, such as, if we're actively scrolling on the scrollView
If false, then we rely solely on the internal conditions of when a pan gesture
should succeed or fail, such as, if we're actively scrolling on the scrollView.
Default return value is false.
*/
+1 -1
View File
@@ -1,6 +1,6 @@
//
// PanModalPresenter.swift
// SlackUI
// PanModal
//
// Copyright © 2019 Tiny Speck, Inc. All rights reserved.
//
@@ -1,6 +1,6 @@
//
// UIViewController+PanModalPresenterProtocol.swift
// SlackUI
// PanModal
//
// Copyright © 2019 Tiny Speck, Inc. All rights reserved.
//
@@ -50,6 +50,7 @@ extension UIViewController: PanModalPresenter {
viewControllerToPresent.popoverPresentationController?.delegate = PanModalPresentationDelegate.default
} else {
viewControllerToPresent.modalPresentationStyle = .custom
viewControllerToPresent.modalPresentationCapturesStatusBarAppearance = true
viewControllerToPresent.transitioningDelegate = PanModalPresentationDelegate.default
}
@@ -7,6 +7,22 @@
objects = {
/* Begin PBXBuildFile section */
0F2A2C552239C119003BDB2F /* PanModal.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F2A2C532239C119003BDB2F /* PanModal.h */; settings = {ATTRIBUTES = (Public, ); }; };
0F2A2C582239C119003BDB2F /* PanModal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F2A2C512239C119003BDB2F /* PanModal.framework */; };
0F2A2C592239C119003BDB2F /* PanModal.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0F2A2C512239C119003BDB2F /* PanModal.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
0F2A2C5E2239C137003BDB2F /* PanModalAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74C072A2220BA6E500124CE1 /* PanModalAnimator.swift */; };
0F2A2C5F2239C139003BDB2F /* PanModalPresentationAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC139066216D9458007A3E64 /* PanModalPresentationAnimator.swift */; };
0F2A2C602239C13C003BDB2F /* PanModalPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC13906C216D9458007A3E64 /* PanModalPresentationController.swift */; };
0F2A2C612239C140003BDB2F /* PanModalPresentationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94795C9A21F0335D008045A0 /* PanModalPresentationDelegate.swift */; };
0F2A2C622239C148003BDB2F /* PanModalHeight.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74C072A4220BA76D00124CE1 /* PanModalHeight.swift */; };
0F2A2C632239C14B003BDB2F /* PanModalPresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC139068216D9458007A3E64 /* PanModalPresentable.swift */; };
0F2A2C642239C14E003BDB2F /* PanModalPresentable+Defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCC0EE7B21917F2500208DBC /* PanModalPresentable+Defaults.swift */; };
0F2A2C652239C151003BDB2F /* PanModalPresentable+UIViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC139069216D9458007A3E64 /* PanModalPresentable+UIViewController.swift */; };
0F2A2C662239C153003BDB2F /* PanModalPresentable+LayoutHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74C072A6220BA78800124CE1 /* PanModalPresentable+LayoutHelpers.swift */; };
0F2A2C672239C157003BDB2F /* PanModalPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC13906A216D9458007A3E64 /* PanModalPresenter.swift */; };
0F2A2C682239C15D003BDB2F /* UIViewController+PanModalPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74C072A9220BA82A00124CE1 /* UIViewController+PanModalPresenter.swift */; };
0F2A2C692239C162003BDB2F /* DimmedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC13906E216D9458007A3E64 /* DimmedView.swift */; };
0F2A2C6A2239C165003BDB2F /* PanContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94795C9C21F03368008045A0 /* PanContainerView.swift */; };
743CABB02225FC9F00634A5A /* UserGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 743CABAF2225FC9F00634A5A /* UserGroupViewController.swift */; };
743CABB22225FD1100634A5A /* UserGroupHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 743CABB12225FD1100634A5A /* UserGroupHeaderView.swift */; };
743CABB42225FE7700634A5A /* UserGroupMemberPresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 743CABB32225FE7700634A5A /* UserGroupMemberPresentable.swift */; };
@@ -42,6 +58,13 @@
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
0F2A2C562239C119003BDB2F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = DCA741A2216D90410021F2F2 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 0F2A2C502239C119003BDB2F;
remoteInfo = PanModal;
};
743CABC92226171500634A5A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = DCA741A2216D90410021F2F2 /* Project object */;
@@ -51,7 +74,24 @@
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
0F2A2C5D2239C119003BDB2F /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
0F2A2C592239C119003BDB2F /* PanModal.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
0F2A2C512239C119003BDB2F /* PanModal.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PanModal.framework; sourceTree = BUILT_PRODUCTS_DIR; };
0F2A2C532239C119003BDB2F /* PanModal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PanModal.h; sourceTree = "<group>"; };
0F2A2C542239C119003BDB2F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
743CABAF2225FC9F00634A5A /* UserGroupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserGroupViewController.swift; sourceTree = "<group>"; };
743CABB12225FD1100634A5A /* UserGroupHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserGroupHeaderView.swift; sourceTree = "<group>"; };
743CABB32225FE7700634A5A /* UserGroupMemberPresentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserGroupMemberPresentable.swift; sourceTree = "<group>"; };
@@ -84,13 +124,20 @@
DC13906E216D9458007A3E64 /* DimmedView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DimmedView.swift; sourceTree = "<group>"; };
DC3B2EB9222A560A000C8A4A /* TransientAlertViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransientAlertViewController.swift; sourceTree = "<group>"; };
DC3B2EBD222A58C9000C8A4A /* AlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertView.swift; sourceTree = "<group>"; };
DCA741AA216D90410021F2F2 /* PanModal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PanModal.app; sourceTree = BUILT_PRODUCTS_DIR; };
DCA741AA216D90410021F2F2 /* PanModalDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PanModalDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
DCA741AD216D90410021F2F2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
DCA741B9216D90420021F2F2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
DCC0EE7B21917F2500208DBC /* PanModalPresentable+Defaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PanModalPresentable+Defaults.swift"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
0F2A2C4E2239C119003BDB2F /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
743CABC12226171500634A5A /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@@ -102,12 +149,22 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
0F2A2C582239C119003BDB2F /* PanModal.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
0F2A2C522239C119003BDB2F /* PanModal */ = {
isa = PBXGroup;
children = (
0F2A2C532239C119003BDB2F /* PanModal.h */,
0F2A2C542239C119003BDB2F /* Info.plist */,
);
path = PanModal;
sourceTree = "<group>";
};
743CABAE2225FC4A00634A5A /* User Groups */ = {
isa = PBXGroup;
children = (
@@ -286,6 +343,7 @@
DCA741AC216D90410021F2F2 /* Sample */,
DC139062216D9431007A3E64 /* PanModal */,
743CABC52226171500634A5A /* Tests */,
0F2A2C522239C119003BDB2F /* PanModal */,
DCA741AB216D90410021F2F2 /* Products */,
);
sourceTree = "<group>";
@@ -293,8 +351,9 @@
DCA741AB216D90410021F2F2 /* Products */ = {
isa = PBXGroup;
children = (
DCA741AA216D90410021F2F2 /* PanModal.app */,
DCA741AA216D90410021F2F2 /* PanModalDemo.app */,
743CABC42226171500634A5A /* PanModalTests.xctest */,
0F2A2C512239C119003BDB2F /* PanModal.framework */,
);
name = Products;
sourceTree = "<group>";
@@ -312,7 +371,36 @@
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
0F2A2C4C2239C119003BDB2F /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
0F2A2C552239C119003BDB2F /* PanModal.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
0F2A2C502239C119003BDB2F /* PanModal */ = {
isa = PBXNativeTarget;
buildConfigurationList = 0F2A2C5A2239C119003BDB2F /* Build configuration list for PBXNativeTarget "PanModal" */;
buildPhases = (
0F2A2C4C2239C119003BDB2F /* Headers */,
0F2A2C4D2239C119003BDB2F /* Sources */,
0F2A2C4E2239C119003BDB2F /* Frameworks */,
0F2A2C4F2239C119003BDB2F /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = PanModal;
productName = PanModal;
productReference = 0F2A2C512239C119003BDB2F /* PanModal.framework */;
productType = "com.apple.product-type.framework";
};
743CABC32226171500634A5A /* PanModalTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 743CABCB2226171500634A5A /* Build configuration list for PBXNativeTarget "PanModalTests" */;
@@ -331,21 +419,23 @@
productReference = 743CABC42226171500634A5A /* PanModalTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
DCA741A9216D90410021F2F2 /* PanModal */ = {
DCA741A9216D90410021F2F2 /* PanModalDemo */ = {
isa = PBXNativeTarget;
buildConfigurationList = DCA741BC216D90420021F2F2 /* Build configuration list for PBXNativeTarget "PanModal" */;
buildConfigurationList = DCA741BC216D90420021F2F2 /* Build configuration list for PBXNativeTarget "PanModalDemo" */;
buildPhases = (
DCA741A6216D90410021F2F2 /* Sources */,
DCA741A7216D90410021F2F2 /* Frameworks */,
DCA741A8216D90410021F2F2 /* Resources */,
0F2A2C5D2239C119003BDB2F /* Embed Frameworks */,
);
buildRules = (
);
dependencies = (
0F2A2C572239C119003BDB2F /* PBXTargetDependency */,
);
name = PanModal;
name = PanModalDemo;
productName = PanModal;
productReference = DCA741AA216D90410021F2F2 /* PanModal.app */;
productReference = DCA741AA216D90410021F2F2 /* PanModalDemo.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
@@ -358,6 +448,9 @@
LastUpgradeCheck = 1000;
ORGANIZATIONNAME = Detail;
TargetAttributes = {
0F2A2C502239C119003BDB2F = {
CreatedOnToolsVersion = 10.1;
};
743CABC32226171500634A5A = {
CreatedOnToolsVersion = 10.1;
TestTargetID = DCA741A9216D90410021F2F2;
@@ -367,7 +460,7 @@
};
};
};
buildConfigurationList = DCA741A5216D90410021F2F2 /* Build configuration list for PBXProject "PanModal" */;
buildConfigurationList = DCA741A5216D90410021F2F2 /* Build configuration list for PBXProject "PanModalDemo" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
@@ -380,13 +473,21 @@
projectDirPath = "";
projectRoot = "";
targets = (
DCA741A9216D90410021F2F2 /* PanModal */,
DCA741A9216D90410021F2F2 /* PanModalDemo */,
743CABC32226171500634A5A /* PanModalTests */,
0F2A2C502239C119003BDB2F /* PanModal */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
0F2A2C4F2239C119003BDB2F /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
743CABC22226171500634A5A /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@@ -407,6 +508,26 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
0F2A2C4D2239C119003BDB2F /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
0F2A2C5E2239C137003BDB2F /* PanModalAnimator.swift in Sources */,
0F2A2C5F2239C139003BDB2F /* PanModalPresentationAnimator.swift in Sources */,
0F2A2C602239C13C003BDB2F /* PanModalPresentationController.swift in Sources */,
0F2A2C612239C140003BDB2F /* PanModalPresentationDelegate.swift in Sources */,
0F2A2C622239C148003BDB2F /* PanModalHeight.swift in Sources */,
0F2A2C632239C14B003BDB2F /* PanModalPresentable.swift in Sources */,
0F2A2C642239C14E003BDB2F /* PanModalPresentable+Defaults.swift in Sources */,
0F2A2C652239C151003BDB2F /* PanModalPresentable+UIViewController.swift in Sources */,
0F2A2C662239C153003BDB2F /* PanModalPresentable+LayoutHelpers.swift in Sources */,
0F2A2C672239C157003BDB2F /* PanModalPresenter.swift in Sources */,
0F2A2C682239C15D003BDB2F /* UIViewController+PanModalPresenter.swift in Sources */,
0F2A2C692239C162003BDB2F /* DimmedView.swift in Sources */,
0F2A2C6A2239C165003BDB2F /* PanContainerView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
743CABC02226171500634A5A /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -453,14 +574,77 @@
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
0F2A2C572239C119003BDB2F /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 0F2A2C502239C119003BDB2F /* PanModal */;
targetProxy = 0F2A2C562239C119003BDB2F /* PBXContainerItemProxy */;
};
743CABCA2226171500634A5A /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = DCA741A9216D90410021F2F2 /* PanModal */;
target = DCA741A9216D90410021F2F2 /* PanModalDemo */;
targetProxy = 743CABC92226171500634A5A /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
0F2A2C5B2239C119003BDB2F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 6UF7FN999R;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = PanModal/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.slack.PanModal;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_VERSION = 4.2;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
0F2A2C5C2239C119003BDB2F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 6UF7FN999R;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = PanModal/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.slack.PanModal;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_VERSION = 4.2;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
743CABCC2226171500634A5A /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -477,7 +661,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 4.2;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PanModal.app/PanModal";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PanModalDemo.app/PanModalDemo";
};
name = Debug;
};
@@ -497,7 +681,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 4.2;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PanModal.app/PanModal";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PanModalDemo.app/PanModalDemo";
};
name = Release;
};
@@ -620,6 +804,7 @@
DCA741BD216D90420021F2F2 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CODE_SIGN_STYLE = Automatic;
@@ -640,6 +825,7 @@
DCA741BE216D90420021F2F2 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CODE_SIGN_STYLE = Automatic;
@@ -660,6 +846,15 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
0F2A2C5A2239C119003BDB2F /* Build configuration list for PBXNativeTarget "PanModal" */ = {
isa = XCConfigurationList;
buildConfigurations = (
0F2A2C5B2239C119003BDB2F /* Debug */,
0F2A2C5C2239C119003BDB2F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
743CABCB2226171500634A5A /* Build configuration list for PBXNativeTarget "PanModalTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
@@ -669,7 +864,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
DCA741A5216D90410021F2F2 /* Build configuration list for PBXProject "PanModal" */ = {
DCA741A5216D90410021F2F2 /* Build configuration list for PBXProject "PanModalDemo" */ = {
isa = XCConfigurationList;
buildConfigurations = (
DCA741BA216D90420021F2F2 /* Debug */,
@@ -678,7 +873,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
DCA741BC216D90420021F2F2 /* Build configuration list for PBXNativeTarget "PanModal" */ = {
DCA741BC216D90420021F2F2 /* Build configuration list for PBXNativeTarget "PanModalDemo" */ = {
isa = XCConfigurationList;
buildConfigurations = (
DCA741BD216D90420021F2F2 /* Debug */,
@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1010"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "0F2A2C502239C119003BDB2F"
BuildableName = "PanModal.framework"
BlueprintName = "PanModal"
ReferencedContainer = "container:PanModalDemo.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</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">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "0F2A2C502239C119003BDB2F"
BuildableName = "PanModal.framework"
BlueprintName = "PanModal"
ReferencedContainer = "container:PanModalDemo.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "0F2A2C502239C119003BDB2F"
BuildableName = "PanModal.framework"
BlueprintName = "PanModal"
ReferencedContainer = "container:PanModalDemo.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1010"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DCA741A9216D90410021F2F2"
BuildableName = "PanModalDemo.app"
BlueprintName = "PanModalDemo"
ReferencedContainer = "container:PanModalDemo.xcodeproj">
</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 = "743CABC32226171500634A5A"
BuildableName = "PanModalTests.xctest"
BlueprintName = "PanModalTests"
ReferencedContainer = "container:PanModalDemo.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DCA741A9216D90410021F2F2"
BuildableName = "PanModalDemo.app"
BlueprintName = "PanModalDemo"
ReferencedContainer = "container:PanModalDemo.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</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 = "DCA741A9216D90410021F2F2"
BuildableName = "PanModalDemo.app"
BlueprintName = "PanModalDemo"
ReferencedContainer = "container:PanModalDemo.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DCA741A9216D90410021F2F2"
BuildableName = "PanModalDemo.app"
BlueprintName = "PanModalDemo"
ReferencedContainer = "container:PanModalDemo.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -18,6 +18,10 @@ class BasicViewController: UIViewController {
extension BasicViewController: PanModalPresentable {
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
var panScrollable: UIScrollView? {
return nil
}
@@ -12,6 +12,10 @@ class NavigationController: UINavigationController, PanModalPresentable {
private let navGroups = NavUserGroups()
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override func viewDidLoad() {
super.viewDidLoad()
pushViewController(navGroups, animated: false)
@@ -14,6 +14,10 @@ class StackedProfileViewController: UIViewController, PanModalPresentable {
let presentable: UserGroupMemberPresentable
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
// MARK: - Views
let avatarView: UIView = {
@@ -85,6 +89,7 @@ class StackedProfileViewController: UIViewController, PanModalPresentable {
roleLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
roleLabel.topAnchor.constraint(equalTo: nameLabel.bottomAnchor, constant: 4.0).isActive = true
bottomLayoutGuide.topAnchor.constraint(greaterThanOrEqualTo: roleLabel.bottomAnchor).isActive = true
}
// MARK: - Pan Modal Presentable
@@ -94,7 +99,7 @@ class StackedProfileViewController: UIViewController, PanModalPresentable {
}
var longFormHeight: PanModalHeight {
return .contentHeight(300)
return .intrinsicHeight
}
var anchorModalToLongForm: Bool {
@@ -34,6 +34,10 @@ class UserGroupViewController: UITableViewController, PanModalPresentable, UIGes
var isShortFormEnabled = true
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
let headerView = UserGroupHeaderView()
let headerPresentable = UserGroupHeaderPresentable.init(handle: "ios-engs", description: "iOS Engineers", memberCount: 10)
+1 -1
View File
@@ -53,12 +53,12 @@ class PanModalTests: XCTestCase {
XCTAssertEqual(vc.anchorModalToLongForm, true)
XCTAssertEqual(vc.allowsExtendedPanScrolling, false)
XCTAssertEqual(vc.allowsDragToDismiss, true)
XCTAssertEqual(vc.isPanScrollEnabled, true)
XCTAssertEqual(vc.isUserInteractionEnabled, true)
XCTAssertEqual(vc.isHapticFeedbackEnabled, true)
XCTAssertEqual(vc.shouldRoundTopCorners, false)
XCTAssertEqual(vc.showDragIndicator, false)
XCTAssertEqual(vc.shouldRoundTopCorners, false)
XCTAssertEqual(vc.cornerRadius, 8.0)
}
func testPresentableYValues() {