Skip to content

Commit

Permalink
Merge branch 'develop' into update-docs-github-action
Browse files Browse the repository at this point in the history
  • Loading branch information
mohammedDehairy authored Nov 10, 2021
2 parents c2c283a + f10d44e commit a2a78c0
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 31 deletions.
2 changes: 1 addition & 1 deletion AdyenDropIn/Presentation/ModalViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ internal final class ModalViewController: UIViewController {
guard innerController.isViewLoaded else { return .zero }
let innerSize = innerController.preferredContentSize
return CGSize(width: innerSize.width,
height: navigationBarHeight + innerSize.height)
height: navigationBarHeight + innerSize.height + (1.0 / UIScreen.main.scale))
}

// swiftlint:disable:next unused_setter_value
Expand Down
72 changes: 42 additions & 30 deletions AdyenDropIn/Presentation/WrapperViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,35 +9,31 @@ import UIKit

internal final class WrapperViewController: UIViewController {

// MARK: - Properties

private var topConstraint: NSLayoutConstraint?
private var bottomConstraint: NSLayoutConstraint?
private var rightConstraint: NSLayoutConstraint?
private var leftConstraint: NSLayoutConstraint?

internal lazy var requiresKeyboardInput: Bool = heirarchyRequiresKeyboardInput(viewController: child)
internal lazy var requiresKeyboardInput: Bool = hierarchyRequiresKeyboardInput(viewController: child)

internal let child: ModalViewController

// MARK: - Initializers

internal init(child: ModalViewController) {
self.child = child
super.init(nibName: nil, bundle: nil)

positionContent(child)
setupChildViewController()
}

@available(*, unavailable)
internal required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

private func heirarchyRequiresKeyboardInput(viewController: UIViewController?) -> Bool {
if let viewController = viewController as? FormViewController {
return viewController.requiresKeyboardInput
}

return viewController?.children.contains(where: { heirarchyRequiresKeyboardInput(viewController: $0) }) ?? false
}

internal func updateFrame(keyboardRect: CGRect, animated: Bool = true) {
guard let view = child.viewIfLoaded else { return }
let finalFrame = child.finalPresentationFrame(with: keyboardRect)
Expand All @@ -52,36 +48,51 @@ internal final class WrapperViewController: UIViewController {
self?.update(finalFrame: finalFrame)
}))
}

private func update(finalFrame: CGRect) {
guard let view = child.viewIfLoaded else { return }
leftConstraint?.constant = finalFrame.origin.x
rightConstraint?.constant = -finalFrame.origin.x
topConstraint?.constant = finalFrame.origin.y
view.layoutIfNeeded()
}

fileprivate func positionContent(_ child: ModalViewController) {
// MARK: - Private

private func setupChildViewController() {
addChild(child)
view.addSubview(child.view)
child.didMove(toParent: self)
child.view.translatesAutoresizingMaskIntoConstraints = false
let topConstraint = child.view.topAnchor.constraint(equalTo: view.topAnchor, constant: 0)
let bottomConstraint = child.view.bottomAnchor.constraint(equalTo: view.bottomAnchor)
let leftConstraint = child.view.leadingAnchor.constraint(equalTo: view.leadingAnchor)
let rightConstraint = child.view.trailingAnchor.constraint(equalTo: view.trailingAnchor)
NSLayoutConstraint.activate([
leftConstraint,
rightConstraint,
bottomConstraint,
topConstraint
])
setupChildLayout()
}

private func setupChildLayout() {
let childView: UIView = child.view
childView.translatesAutoresizingMaskIntoConstraints = false

let topConstraint = childView.topAnchor.constraint(equalTo: view.topAnchor)
let bottomConstraint = childView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
let leftConstraint = childView.leadingAnchor.constraint(equalTo: view.leadingAnchor)
let rightConstraint = childView.trailingAnchor.constraint(equalTo: view.trailingAnchor)

NSLayoutConstraint.activate([leftConstraint,
rightConstraint,
bottomConstraint,
topConstraint])

self.topConstraint = topConstraint
self.bottomConstraint = bottomConstraint
self.leftConstraint = leftConstraint
self.rightConstraint = rightConstraint
}

private func hierarchyRequiresKeyboardInput(viewController: UIViewController?) -> Bool {
if let viewController = viewController as? FormViewController {
return viewController.requiresKeyboardInput
}

return viewController?.children.contains(where: { hierarchyRequiresKeyboardInput(viewController: $0) }) ?? false
}

private func update(finalFrame: CGRect) {
guard let view = child.viewIfLoaded else { return }
leftConstraint?.constant = finalFrame.origin.x
rightConstraint?.constant = -finalFrame.origin.x
topConstraint?.constant = finalFrame.origin.y
view.layoutIfNeeded()
}
}

extension ModalViewController {
Expand All @@ -90,6 +101,7 @@ extension ModalViewController {
/// e.g `viewController.adyen.finalPresentationFrame(in:keyboardRect:)`.
/// :nodoc:
internal func finalPresentationFrame(with keyboardRect: CGRect = .zero) -> CGRect {
view.layer.layoutIfNeeded()
let expectedWidth = Dimensions.greatestPresentableWidth
var frame = UIScreen.main.bounds
frame.origin.x = (frame.width - expectedWidth) / 2
Expand Down

0 comments on commit a2a78c0

Please sign in to comment.