Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7b151fd268 | |||
| 7bdf702703 | |||
| 0d1381d941 | |||
| 39c30a030d | |||
| 9e4f6e086f | |||
| 5bc31cdc57 | |||
| 7d53ed31e6 | |||
| 80806de694 | |||
| 8d8458cc34 | |||
| 6e09df910e | |||
| 253f60cfa9 | |||
| 81ed7b01cd | |||
| d0f120d49c | |||
| bc3555e715 | |||
| 432a1206cf | |||
| 488b19fc46 | |||
| edc2b6ea41 | |||
| 79d64599d0 | |||
| 854ab2aef2 | |||
| 04c4929e7d | |||
| 6e4e9713c3 | |||
| e37c43c8f3 | |||
| 001536c835 | |||
| 5a7d01e1e4 |
File diff suppressed because it is too large
Load Diff
BIN
Binary file not shown.
@@ -21,7 +21,7 @@ class Controller: UIViewController {
|
||||
self.presentTableControllerButton.addTarget(self, action: #selector(self.presentModalTableViewController), for: .touchUpInside)
|
||||
self.presentTableControllerButton.sizeToFit()
|
||||
self.presentTableControllerButton.center.x = self.view.frame.width / 2
|
||||
self.presentTableControllerButton.frame.origin.y = self.presentControllerButton.frame.bottomYPosition + 10
|
||||
self.presentTableControllerButton.frame.origin.y = self.presentControllerButton.frame.bottomY + 10
|
||||
self.view.addSubview(self.presentTableControllerButton)
|
||||
}
|
||||
|
||||
|
||||
Regular → Executable
+15
@@ -28,13 +28,28 @@ public struct SPStorkController {
|
||||
if let presentationController = controller.presentationController as? SPStorkPresentationController {
|
||||
let translation = -(scrollView.contentOffset.y + scrollView.contentInset.top)
|
||||
if translation >= 0 {
|
||||
|
||||
if controller.isBeingPresented { return }
|
||||
|
||||
scrollView.subviews.forEach {
|
||||
$0.transform = CGAffineTransform(translationX: 0, y: -translation)
|
||||
}
|
||||
|
||||
presentationController.setIndicator(style: scrollView.isDragging ? .line : .arrow)
|
||||
|
||||
if translation >= presentationController.translateForDismiss * 0.65 {
|
||||
if !scrollView.isDragging {
|
||||
presentationController.presentedViewController.dismiss(animated: true, completion: nil)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if presentationController.pan?.state != UIGestureRecognizer.State.changed {
|
||||
presentationController.scrollViewDidScroll(translation)
|
||||
}
|
||||
|
||||
} else {
|
||||
presentationController.setIndicator(style: .arrow)
|
||||
presentationController.scrollViewDidScroll(0)
|
||||
}
|
||||
}
|
||||
|
||||
Regular → Executable
Regular → Executable
Regular → Executable
+23
-13
@@ -23,11 +23,13 @@ import UIKit
|
||||
|
||||
class SPStorkPresentationController: UIPresentationController, UIGestureRecognizerDelegate {
|
||||
|
||||
var isSwipeToDismissEnabled: Bool = true
|
||||
var isTapAroundToDismissEnabled: Bool = true
|
||||
var swipeToDismissEnabled: Bool = true
|
||||
var tapAroundToDismissEnabled: Bool = true
|
||||
var showIndicator: Bool = true
|
||||
var indicatorColor: UIColor = UIColor.init(red: 202/255, green: 201/255, blue: 207/255, alpha: 1)
|
||||
var customHeight: CGFloat? = nil
|
||||
var translateForDismiss: CGFloat = 240
|
||||
|
||||
var transitioningDelegate: SPStorkTransitioningDelegate?
|
||||
|
||||
var pan: UIPanGestureRecognizer?
|
||||
@@ -84,7 +86,7 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
|
||||
|
||||
if self.showIndicator {
|
||||
self.indicatorView.color = self.indicatorColor
|
||||
let tap = UITapGestureRecognizer.init(target: self, action: #selector(self.handleTap))
|
||||
let tap = UITapGestureRecognizer.init(target: self, action: #selector(self.dismissAction))
|
||||
tap.cancelsTouchesInView = false
|
||||
self.indicatorView.addGestureRecognizer(tap)
|
||||
presentedView.addSubview(self.indicatorView)
|
||||
@@ -133,8 +135,9 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
|
||||
containerView.insertSubview(snapshotView, aboveSubview: self.backgroundView)
|
||||
snapshotView.frame = initialFrame
|
||||
snapshotView.transform = transformForSnapshotView
|
||||
snapshotView.alpha = self.alpha
|
||||
snapshotView.alpha = 1 - self.alpha
|
||||
snapshotView.layer.cornerRadius = self.cornerRadius
|
||||
snapshotView.contentMode = .top
|
||||
snapshotView.layer.masksToBounds = true
|
||||
rootSnapshotView = snapshotView
|
||||
|
||||
@@ -169,13 +172,13 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
|
||||
self.snapshotViewContainer.centerXAnchor.constraint(equalTo: containerView.centerXAnchor).isActive = true
|
||||
self.updateSnapshotAspectRatio()
|
||||
|
||||
if self.isTapAroundToDismissEnabled {
|
||||
self.tap = UITapGestureRecognizer.init(target: self, action: #selector(self.handleTap))
|
||||
if self.tapAroundToDismissEnabled {
|
||||
self.tap = UITapGestureRecognizer.init(target: self, action: #selector(self.dismissAction))
|
||||
self.tap?.cancelsTouchesInView = false
|
||||
self.snapshotViewContainer.addGestureRecognizer(self.tap!)
|
||||
}
|
||||
|
||||
if self.isSwipeToDismissEnabled {
|
||||
if self.swipeToDismissEnabled {
|
||||
self.pan = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan))
|
||||
self.pan!.delegate = self
|
||||
self.pan!.maximumNumberOfTouches = 1
|
||||
@@ -184,7 +187,9 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
|
||||
}
|
||||
}
|
||||
|
||||
@objc func handleTap() {
|
||||
@objc func dismissAction() {
|
||||
self.presentingViewController.view.endEditing(true)
|
||||
self.presentedViewController.view.endEditing(true)
|
||||
self.presentedViewController.dismiss(animated: true, completion: nil)
|
||||
}
|
||||
|
||||
@@ -223,6 +228,7 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
|
||||
containerView.insertSubview(snapshotView, aboveSubview: backgroundView)
|
||||
snapshotView.frame = initialFrame
|
||||
snapshotView.transform = initialTransform
|
||||
snapshotView.contentMode = .top
|
||||
rootSnapshotView = snapshotView
|
||||
snapshotView.layer.cornerRadius = self.cornerRadius
|
||||
snapshotView.layer.masksToBounds = true
|
||||
@@ -230,7 +236,7 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
|
||||
let snapshotRoundedView = UIView()
|
||||
snapshotRoundedView.layer.cornerRadius = self.cornerRadius
|
||||
snapshotRoundedView.layer.masksToBounds = true
|
||||
snapshotRoundedView.backgroundColor = UIColor.black.withAlphaComponent(1 - self.alpha)
|
||||
snapshotRoundedView.backgroundColor = UIColor.black.withAlphaComponent(self.alpha)
|
||||
containerView.insertSubview(snapshotRoundedView, aboveSubview: snapshotView)
|
||||
snapshotRoundedView.frame = initialFrame
|
||||
snapshotRoundedView.transform = initialTransform
|
||||
@@ -266,7 +272,7 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
|
||||
extension SPStorkPresentationController {
|
||||
|
||||
@objc func handlePan(gestureRecognizer: UIPanGestureRecognizer) {
|
||||
guard gestureRecognizer.isEqual(pan), self.isSwipeToDismissEnabled else { return }
|
||||
guard gestureRecognizer.isEqual(self.pan), self.swipeToDismissEnabled else { return }
|
||||
|
||||
switch gestureRecognizer.state {
|
||||
case .began:
|
||||
@@ -278,7 +284,7 @@ extension SPStorkPresentationController {
|
||||
gestureRecognizer.setTranslation(CGPoint(x: 0, y: 0), in: containerView)
|
||||
case .changed:
|
||||
self.workGester = true
|
||||
if self.isSwipeToDismissEnabled {
|
||||
if self.swipeToDismissEnabled {
|
||||
let translation = gestureRecognizer.translation(in: presentedView)
|
||||
self.updatePresentedViewForTranslation(inVerticalDirection: translation.y)
|
||||
} else {
|
||||
@@ -287,8 +293,8 @@ extension SPStorkPresentationController {
|
||||
case .ended:
|
||||
self.workGester = false
|
||||
let translation = gestureRecognizer.translation(in: presentedView).y
|
||||
if translation >= 240 {
|
||||
presentedViewController.dismiss(animated: true, completion: nil)
|
||||
if translation >= self.translateForDismiss {
|
||||
self.presentedViewController.dismiss(animated: true, completion: nil)
|
||||
} else {
|
||||
self.indicatorView.style = .arrow
|
||||
UIView.animate(
|
||||
@@ -319,6 +325,10 @@ extension SPStorkPresentationController {
|
||||
self.updateSnapshot()
|
||||
}
|
||||
|
||||
func setIndicator(style: SPStorkIndicatorView.Style) {
|
||||
self.indicatorView.style = style
|
||||
}
|
||||
|
||||
private func updatePresentedViewForTranslation(inVerticalDirection translation: CGFloat) {
|
||||
if self.startDismissing { return }
|
||||
|
||||
|
||||
Regular → Executable
+4
-5
@@ -25,15 +25,14 @@ final class SPStorkPresentingAnimationController: NSObject, UIViewControllerAnim
|
||||
|
||||
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
|
||||
|
||||
guard let presentedViewController = transitionContext.viewController(forKey: .to) else {
|
||||
return
|
||||
}
|
||||
guard let presentedViewController = transitionContext.viewController(forKey: .to) else { return }
|
||||
|
||||
let containerView = transitionContext.containerView
|
||||
containerView.addSubview(presentedViewController.view)
|
||||
presentedViewController.view.frame = CGRect(x: 0, y: containerView.bounds.height, width: containerView.bounds.width, height: containerView.bounds.height)
|
||||
|
||||
|
||||
let finalFrameForPresentedView = transitionContext.finalFrame(for: presentedViewController)
|
||||
presentedViewController.view.frame = finalFrameForPresentedView
|
||||
presentedViewController.view.frame.origin.y = containerView.bounds.height
|
||||
|
||||
UIView.animate(
|
||||
withDuration: transitionDuration(using: transitionContext),
|
||||
|
||||
Regular → Executable
+6
-4
@@ -23,19 +23,21 @@ import UIKit
|
||||
|
||||
public final class SPStorkTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate {
|
||||
|
||||
public var isSwipeToDismissEnabled: Bool = true
|
||||
public var isTapAroundToDismissEnabled: Bool = true
|
||||
public var swipeToDismissEnabled: Bool = true
|
||||
public var tapAroundToDismissEnabled: Bool = true
|
||||
public var showIndicator: Bool = true
|
||||
public var indicatorColor: UIColor = UIColor.init(red: 202/255, green: 201/255, blue: 207/255, alpha: 1)
|
||||
public var customHeight: CGFloat? = nil
|
||||
public var translateForDismiss: CGFloat = 240
|
||||
|
||||
public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
|
||||
let controller = SPStorkPresentationController(presentedViewController: presented, presenting: presenting)
|
||||
controller.isSwipeToDismissEnabled = self.isSwipeToDismissEnabled
|
||||
controller.isTapAroundToDismissEnabled = self.isTapAroundToDismissEnabled
|
||||
controller.swipeToDismissEnabled = self.swipeToDismissEnabled
|
||||
controller.tapAroundToDismissEnabled = self.tapAroundToDismissEnabled
|
||||
controller.showIndicator = self.showIndicator
|
||||
controller.indicatorColor = self.indicatorColor
|
||||
controller.customHeight = self.customHeight
|
||||
controller.translateForDismiss = self.translateForDismiss
|
||||
controller.transitioningDelegate = self
|
||||
return controller
|
||||
}
|
||||
|
||||
Regular → Executable
+3
-1
@@ -29,10 +29,12 @@ extension UIViewController {
|
||||
&& presentingViewController != nil
|
||||
}
|
||||
|
||||
public func presentAsStork(_ controller: UIViewController, complection: (() -> Void)? = nil) {
|
||||
public func presentAsStork(_ controller: UIViewController, height: CGFloat? = nil, complection: (() -> Void)? = nil) {
|
||||
let transitionDelegate = SPStorkTransitioningDelegate()
|
||||
transitionDelegate.customHeight = height
|
||||
controller.transitioningDelegate = transitionDelegate
|
||||
controller.modalPresentationStyle = .custom
|
||||
controller.modalPresentationCapturesStatusBarAppearance = true
|
||||
self.present(controller, animated: true, completion: complection)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ public class SPAnimation {
|
||||
withComplection completion: (() -> Void)! = {}) {
|
||||
|
||||
var optionsWithRepeatition = options
|
||||
optionsWithRepeatition.insert([.autoreverse, .repeat])
|
||||
optionsWithRepeatition.insert([.autoreverse, .repeat, .allowUserInteraction])
|
||||
|
||||
self.animate(
|
||||
duration,
|
||||
|
||||
@@ -36,6 +36,14 @@ struct SPApp {
|
||||
return UIApplication.shared.keyWindow?.rootViewController
|
||||
}
|
||||
|
||||
public static var safeArea: UIEdgeInsets {
|
||||
if #available(iOS 11.0, *) {
|
||||
return UIApplication.shared.keyWindow?.safeArea ?? UIEdgeInsets.zero
|
||||
} else {
|
||||
return UIEdgeInsets.zero
|
||||
}
|
||||
}
|
||||
|
||||
public static func set(rootController: UIViewController, animatable: Bool = true) {
|
||||
|
||||
rootController.view.frame = UIScreen.main.bounds
|
||||
|
||||
@@ -28,8 +28,8 @@ struct SPAppStore {
|
||||
return "https://itunes.apple.com/by/app/id" + appID
|
||||
}
|
||||
|
||||
public static func open(appID: String) {
|
||||
if let url = URL(string: "itms-apps://itunes.apple.com/app/id\(appID)"),
|
||||
public static func open(app id: String) {
|
||||
if let url = URL(string: "itms-apps://itunes.apple.com/app/id\(id)"),
|
||||
UIApplication.shared.canOpenURL(url) {
|
||||
if #available(iOS 10.0, *) {
|
||||
UIApplication.shared.open(url, options: convertToUIApplicationOpenExternalURLOptionsKeyDictionary([:]), completionHandler: nil)
|
||||
|
||||
@@ -29,7 +29,7 @@ public struct SPAudio {
|
||||
try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category(rawValue: convertFromAVAudioSessionCategory(AVAudioSession.Category.ambient)), mode: AVAudioSession.Mode.default)
|
||||
try AVAudioSession.sharedInstance().setActive(true)
|
||||
} catch {
|
||||
|
||||
print("SPAudio - notStopBackgroundMusic, error")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -23,17 +23,29 @@ import UIKit
|
||||
|
||||
extension CGRect {
|
||||
|
||||
public var bottomXPosition: CGFloat {
|
||||
public var bottomX: CGFloat {
|
||||
get { return self.origin.x + self.width }
|
||||
set { self.origin.x = newValue - self.width }
|
||||
}
|
||||
|
||||
public var bottomYPosition: CGFloat {
|
||||
public var bottomY: CGFloat {
|
||||
get { return self.origin.y + self.height }
|
||||
set { self.origin.y = newValue - self.height }
|
||||
}
|
||||
|
||||
public var minSideSize: CGFloat {
|
||||
public var minSide: CGFloat {
|
||||
return min(self.width, self.height)
|
||||
}
|
||||
|
||||
public mutating func set(width: CGFloat) {
|
||||
self = CGRect.init(x: self.origin.x, y: self.origin.y, width: width, height: self.height)
|
||||
}
|
||||
|
||||
public mutating func set(height: CGFloat) {
|
||||
self = CGRect.init(x: self.origin.x, y: self.origin.y, width: self.width, height: height)
|
||||
}
|
||||
|
||||
public mutating func set(width: CGFloat, height: CGFloat) {
|
||||
self = CGRect.init(x: self.origin.x, y: self.origin.y, width: width, height: height)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,6 +70,14 @@ extension String {
|
||||
return false
|
||||
}
|
||||
|
||||
public var isEmpty: Bool {
|
||||
return (self.removeAllSpaces() == "")
|
||||
}
|
||||
|
||||
public var words: [String] {
|
||||
return components(separatedBy: .punctuationCharacters).joined().components(separatedBy: .whitespaces)
|
||||
}
|
||||
|
||||
public mutating func replace(_ replacingString: String, with newString: String) {
|
||||
self = self.replacingOccurrences(of: replacingString, with: newString)
|
||||
}
|
||||
|
||||
+9
-13
@@ -39,13 +39,12 @@ extension UIAlertController {
|
||||
preferredStyle: .alert
|
||||
)
|
||||
|
||||
if cancelButtonTitle != nil {
|
||||
ac.addAction(UIAlertAction.init(
|
||||
title: cancelButtonTitle!,
|
||||
style: UIAlertAction.Style.cancel,
|
||||
handler: nil)
|
||||
)
|
||||
}
|
||||
guard cancelButtonTitle != nil else { return }
|
||||
ac.addAction(UIAlertAction.init(
|
||||
title: cancelButtonTitle!,
|
||||
style: UIAlertAction.Style.cancel,
|
||||
handler: nil)
|
||||
)
|
||||
|
||||
ac.addAction(UIAlertAction.init(
|
||||
title: buttonTitle,
|
||||
@@ -64,10 +63,8 @@ extension UIAlertController {
|
||||
preferredStyle: .actionSheet
|
||||
)
|
||||
|
||||
var style = UIAlertAction.Style.default
|
||||
if isDestructive {
|
||||
style = .destructive
|
||||
}
|
||||
let style = isDestructive ? .destructive : UIAlertAction.Style.default
|
||||
|
||||
ac.addAction(UIAlertAction.init(
|
||||
title: buttonTitle,
|
||||
style: style,
|
||||
@@ -76,11 +73,10 @@ extension UIAlertController {
|
||||
}))
|
||||
ac.addAction(UIAlertAction.init(
|
||||
title: cancelButtonTitle,
|
||||
style: UIAlertAction.Style.default,
|
||||
style: UIAlertAction.Style.cancel,
|
||||
handler: { (action) in
|
||||
complection(false)
|
||||
}))
|
||||
|
||||
viewController.present(ac, animated: true, completion: nil)
|
||||
}
|
||||
}
|
||||
|
||||
+11
-3
@@ -60,8 +60,11 @@ extension UIButton {
|
||||
|
||||
extension UIButton {
|
||||
|
||||
public func setTitle(_ title: String) {
|
||||
public func setTitle(_ title: String, color: UIColor? = nil) {
|
||||
self.setTitle(title, for: .normal)
|
||||
if let color = color {
|
||||
self.setTitleColor(color)
|
||||
}
|
||||
}
|
||||
|
||||
public func setTitleColor(_ color: UIColor) {
|
||||
@@ -69,6 +72,11 @@ extension UIButton {
|
||||
self.setTitleColor(color.withAlphaComponent(0.7), for: .highlighted)
|
||||
}
|
||||
|
||||
public func setImage(_ image: UIImage) {
|
||||
self.setImage(image, for: .normal)
|
||||
self.imageView?.contentMode = .scaleAspectFit
|
||||
}
|
||||
|
||||
public func removeAllTargets() {
|
||||
self.removeTarget(nil, action: nil, for: .allEvents)
|
||||
}
|
||||
@@ -111,7 +119,7 @@ extension UIButton {
|
||||
}
|
||||
|
||||
public func hideContent(completion: (() -> Void)! = {}) {
|
||||
SPAnimation.animate(0.2, animations: {
|
||||
SPAnimation.animate(0.25, animations: {
|
||||
self.titleLabel?.alpha = 0
|
||||
}, withComplection: {
|
||||
completion()
|
||||
@@ -119,7 +127,7 @@ extension UIButton {
|
||||
}
|
||||
|
||||
public func showContent(completion: (() -> Void)! = {}) {
|
||||
SPAnimation.animate(0.2, animations: {
|
||||
SPAnimation.animate(0.25, animations: {
|
||||
self.titleLabel?.alpha = 1
|
||||
}, withComplection: {
|
||||
completion()
|
||||
|
||||
@@ -23,40 +23,39 @@ import UIKit
|
||||
|
||||
public extension UIFont {
|
||||
|
||||
public static func system(type: BoldType, size: CGFloat) -> UIFont {
|
||||
return UIFont.systemFont(ofSize: size, weight: self.getBoldTypeBy(boldType: type))
|
||||
public static func system(weight: FontWeight, size: CGFloat) -> UIFont {
|
||||
return UIFont.systemFont(ofSize: size, weight: self.weight(for: weight))
|
||||
}
|
||||
|
||||
@available(iOS 8.2, *)
|
||||
private static func getBoldTypeBy(boldType: BoldType) -> UIFont.Weight {
|
||||
switch boldType {
|
||||
case .UltraLight:
|
||||
private static func weight(for weight: FontWeight) -> UIFont.Weight {
|
||||
switch weight {
|
||||
case .ultraLight:
|
||||
return UIFont.Weight.ultraLight
|
||||
case .Light:
|
||||
case .light:
|
||||
return UIFont.Weight.light
|
||||
case .Medium:
|
||||
case .medium:
|
||||
return UIFont.Weight.medium
|
||||
case .Regular:
|
||||
case .regular:
|
||||
return UIFont.Weight.regular
|
||||
case .Bold:
|
||||
case .bold:
|
||||
return UIFont.Weight.bold
|
||||
case .DemiBold:
|
||||
case .demiBold:
|
||||
return UIFont.Weight.semibold
|
||||
case .Heavy:
|
||||
case .heavy:
|
||||
return UIFont.Weight.heavy
|
||||
default:
|
||||
return UIFont.Weight.regular
|
||||
}
|
||||
}
|
||||
|
||||
public enum BoldType {
|
||||
case Regular
|
||||
case Medium
|
||||
case Light
|
||||
case UltraLight
|
||||
case Heavy
|
||||
case Bold
|
||||
case DemiBold
|
||||
case None
|
||||
public enum FontWeight {
|
||||
case regular
|
||||
case medium
|
||||
case light
|
||||
case ultraLight
|
||||
case heavy
|
||||
case bold
|
||||
case demiBold
|
||||
case none
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,4 +32,12 @@ public extension UIImage {
|
||||
UIGraphicsEndImageContext()
|
||||
return newImage!
|
||||
}
|
||||
|
||||
var alwaysOriginal: UIImage {
|
||||
return self.withRenderingMode(.alwaysOriginal)
|
||||
}
|
||||
|
||||
var alwaysTemplate: UIImage {
|
||||
return self.withRenderingMode(.alwaysTemplate)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ public extension UILabel {
|
||||
self.setShadowOffsetForLetters(blurRadius: 0, widthOffset: 0, heightOffset: 0, opacity: 0)
|
||||
}
|
||||
|
||||
public func setCenteringAlignment() {
|
||||
public func setCenterAlignment() {
|
||||
self.textAlignment = .center
|
||||
self.baselineAdjustment = .alignCenters
|
||||
}
|
||||
@@ -54,7 +54,7 @@ public extension UILabel {
|
||||
}
|
||||
}
|
||||
|
||||
public func setLineSpacing(lineSpacing: CGFloat = 0.0, lineHeightMultiple: CGFloat = 0.0) {
|
||||
public func setLineSpacing(_ lineSpacing: CGFloat = 0.0, lineHeightMultiple: CGFloat = 0.0) {
|
||||
|
||||
guard let labelText = self.text else { return }
|
||||
|
||||
@@ -71,7 +71,6 @@ public extension UILabel {
|
||||
|
||||
attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
|
||||
|
||||
|
||||
self.attributedText = attributedString
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,24 +42,11 @@ public extension UIView {
|
||||
}
|
||||
}
|
||||
|
||||
public func set(width: CGFloat, height: CGFloat) {
|
||||
self.setHeight(height)
|
||||
self.setWidth(width)
|
||||
public func setBounds(_ view: UIView, withWidthFactor widthFactor: CGFloat = 1, maxWidth: CGFloat? = nil, withHeightFactor heightFactor: CGFloat = 1, maxHeight: CGFloat? = nil, withCentering: Bool = false) {
|
||||
self.setBounds(view.bounds, withWidthFactor: widthFactor, maxWidth: maxWidth, withHeightFactor: heightFactor, maxHeight: maxHeight, withCentering: withCentering)
|
||||
}
|
||||
|
||||
public func setHeight(_ height: CGFloat) {
|
||||
self.frame = CGRect.init(x: self.frame.origin.x, y: self.frame.origin.y, width: self.frame.width, height: height)
|
||||
}
|
||||
|
||||
public func setWidth(_ width: CGFloat) {
|
||||
self.frame = CGRect.init(x: self.frame.origin.x, y: self.frame.origin.y, width: width, height: self.frame.height)
|
||||
}
|
||||
|
||||
public func setEqualsFrameFromBounds(_ view: UIView, withWidthFactor widthFactor: CGFloat = 1, maxWidth: CGFloat? = nil, withHeightFactor heightFactor: CGFloat = 1, maxHeight: CGFloat? = nil, withCentering: Bool = false) {
|
||||
self.setEqualsFrameFromBounds(view.bounds, withWidthFactor: widthFactor, maxWidth: maxWidth, withHeightFactor: heightFactor, maxHeight: maxHeight, withCentering: withCentering)
|
||||
}
|
||||
|
||||
public func setEqualsFrameFromBounds(_ bounds: CGRect, withWidthFactor widthFactor: CGFloat = 1, maxWidth: CGFloat? = nil, withHeightFactor heightFactor: CGFloat = 1, maxHeight: CGFloat? = nil, withCentering: Bool = false) {
|
||||
public func setBounds(_ bounds: CGRect, withWidthFactor widthFactor: CGFloat = 1, maxWidth: CGFloat? = nil, withHeightFactor heightFactor: CGFloat = 1, maxHeight: CGFloat? = nil, withCentering: Bool = false) {
|
||||
|
||||
var width = bounds.width * widthFactor
|
||||
if maxWidth != nil { width.setIfMore(when: maxWidth!) }
|
||||
@@ -75,7 +62,7 @@ public extension UIView {
|
||||
}
|
||||
}
|
||||
|
||||
public func setEqualsBoundsFromSuperview(customWidth: CGFloat? = nil, customHeight: CGFloat? = nil) {
|
||||
public func setSuperviewBounds(customWidth: CGFloat? = nil, customHeight: CGFloat? = nil) {
|
||||
if self.superview == nil { return }
|
||||
self.frame = CGRect.init(origin: CGPoint.zero, size: self.superview!.frame.size)
|
||||
if customWidth != nil {
|
||||
@@ -108,15 +95,15 @@ public extension UIView {
|
||||
)
|
||||
}
|
||||
|
||||
public func setYCenteringFromSuperview() {
|
||||
public func setYCenter() {
|
||||
self.center.y = (self.superview?.frame.height ?? 0) / 2
|
||||
}
|
||||
|
||||
public func setXCenteringFromSuperview() {
|
||||
public func setXCenter() {
|
||||
self.center.x = (self.superview?.frame.width ?? 0) / 2
|
||||
}
|
||||
|
||||
public func setToCenterInSuperview() {
|
||||
public func setToCenter() {
|
||||
self.center = CGPoint.init(x: ((self.superview?.frame.width) ?? 0) / 2, y: ((self.superview?.frame.height) ?? 0) / 2)
|
||||
}
|
||||
}
|
||||
@@ -124,7 +111,7 @@ public extension UIView {
|
||||
public extension UIView {
|
||||
|
||||
public func setParalax(amountFactor: CGFloat) {
|
||||
let amount = self.frame.minSideSize * amountFactor
|
||||
let amount = self.frame.minSide * amountFactor
|
||||
self.setParalax(amount: amount)
|
||||
}
|
||||
|
||||
@@ -174,14 +161,14 @@ extension UIView {
|
||||
let xTranslation = (self.frame.width - shadowWidth) / 2 + (self.frame.width * xTranslationFactor)
|
||||
let yTranslation = (self.frame.height - shadowHeight) / 2 + (self.frame.height * yTranslationFactor)
|
||||
|
||||
let cornerRadius = self.frame.minSideSize * cornerRadiusFactor
|
||||
let cornerRadius = self.frame.minSide * cornerRadiusFactor
|
||||
|
||||
let shadowPath = UIBezierPath.init(
|
||||
roundedRect: CGRect.init(x: xTranslation, y: yTranslation, width: shadowWidth, height: shadowHeight),
|
||||
cornerRadius: cornerRadius
|
||||
)
|
||||
|
||||
let blurRadius = self.frame.minSideSize * blurRadiusFactor
|
||||
let blurRadius = self.frame.minSide * blurRadiusFactor
|
||||
|
||||
self.layer.shadowColor = UIColor.black.cgColor
|
||||
self.layer.shadowOffset = CGSize.zero
|
||||
@@ -277,6 +264,6 @@ extension UIView {
|
||||
}
|
||||
|
||||
public func round() {
|
||||
self.layer.cornerRadius = self.frame.minSideSize / 2
|
||||
self.layer.cornerRadius = self.frame.minSide / 2
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ extension SPShadow {
|
||||
yTranslation = view.frame.height + maxBottomSpace - shadowHeight
|
||||
}
|
||||
|
||||
var blurRadius = view.frame.minSideSize * blurRadiusFactor
|
||||
var blurRadius = view.frame.minSide * blurRadiusFactor
|
||||
blurRadius.setIfMore(when: 10)
|
||||
blurRadius.setIfFewer(when: 7)
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ public enum SPStatusBar {
|
||||
case light
|
||||
}
|
||||
|
||||
public enum SPSystemIconType {
|
||||
public enum SPSystemIcon {
|
||||
case share
|
||||
case close
|
||||
case favorite
|
||||
|
||||
+4
-4
@@ -32,28 +32,28 @@ public class SPAppStoreActionButton: SPDownloadingButton {
|
||||
switch self.style {
|
||||
case .base:
|
||||
self.backgroundColor = self.secondColor
|
||||
self.titleLabel?.font = UIFont.system(type: .Bold, size: 14)
|
||||
self.titleLabel?.font = UIFont.system(weight: .bold, size: 14)
|
||||
self.contentEdgeInsets = UIEdgeInsets.init(top: 6, left: 15, bottom: 6, right: 15)
|
||||
break
|
||||
case .main:
|
||||
self.backgroundColor = self.baseColor
|
||||
self.layer.borderWidth = 0
|
||||
self.setTitleColor(UIColor.white)
|
||||
self.titleLabel?.font = UIFont.system(type: .Bold, size: 14)
|
||||
self.titleLabel?.font = UIFont.system(weight: .bold, size: 14)
|
||||
self.contentEdgeInsets = UIEdgeInsets.init(top: 6, left: 15, bottom: 6, right: 15)
|
||||
break
|
||||
case .buyInStore:
|
||||
self.backgroundColor = self.baseColor
|
||||
self.layer.borderWidth = 0
|
||||
self.setTitleColor(UIColor.white)
|
||||
self.titleLabel?.font = UIFont.system(type: .Bold, size: 14)
|
||||
self.titleLabel?.font = UIFont.system(weight: .bold, size: 14)
|
||||
self.contentEdgeInsets = UIEdgeInsets.init(top: 8, left: 15, bottom: 8, right: 15)
|
||||
break
|
||||
case .line:
|
||||
self.backgroundColor = UIColor.clear
|
||||
self.layer.borderWidth = 1
|
||||
self.layer.borderColor = self.baseColor.cgColor
|
||||
self.titleLabel?.font = UIFont.system(type: .Medium, size: 14)
|
||||
self.titleLabel?.font = UIFont.system(weight: .medium, size: 14)
|
||||
self.contentEdgeInsets = UIEdgeInsets.init(top: 6, left: 15, bottom: 6, right: 15)
|
||||
break
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ public class SPAppleMusicButton: SPButton {
|
||||
override func commonInit() {
|
||||
super.commonInit()
|
||||
self.layer.cornerRadius = 8
|
||||
self.titleLabel?.font = UIFont.system(type: .DemiBold, size: 15)
|
||||
self.titleLabel?.font = UIFont.system(weight: .demiBold, size: 15)
|
||||
self.contentEdgeInsets = UIEdgeInsets.init(top: 12, left: 27, bottom: 12, right: 27)
|
||||
self.type = .unselect
|
||||
}
|
||||
|
||||
+7
-7
@@ -64,7 +64,7 @@ public class SPAppleMusicSectionButtonsView: SPView {
|
||||
|
||||
func layout(origin: CGPoint, width: CGFloat) {
|
||||
self.frame.origin = origin
|
||||
self.set(width: width, height: sectionHeight)
|
||||
self.frame.set(width: width, height: sectionHeight)
|
||||
self.layoutSubviews()
|
||||
}
|
||||
|
||||
@@ -72,22 +72,22 @@ public class SPAppleMusicSectionButtonsView: SPView {
|
||||
super.layoutSubviews()
|
||||
|
||||
self.topSeparatorView.frame.origin = .zero
|
||||
self.topSeparatorView.setWidth(self.frame.width)
|
||||
self.topSeparatorView.frame.set(width: self.frame.width)
|
||||
|
||||
self.bottomSeparatorView.frame.origin.x = 0
|
||||
self.bottomSeparatorView.frame.bottomYPosition = self.frame.height
|
||||
self.bottomSeparatorView.setWidth(self.frame.width)
|
||||
self.bottomSeparatorView.frame.bottomY = self.frame.height
|
||||
self.bottomSeparatorView.frame.set(width: self.frame.width)
|
||||
|
||||
let buttonWidth = (self.frame.width - self.buttonsSpace) / 2
|
||||
|
||||
self.leftButton.sizeToFit()
|
||||
self.leftButton.setWidth(buttonWidth)
|
||||
self.leftButton.frame.set(width: buttonWidth)
|
||||
self.leftButton.frame.origin.x = 0
|
||||
self.leftButton.center.y = self.frame.height / 2
|
||||
|
||||
self.rightButton.sizeToFit()
|
||||
self.rightButton.setWidth(buttonWidth)
|
||||
self.rightButton.frame.bottomXPosition = self.frame.width
|
||||
self.rightButton.frame.set(width: buttonWidth)
|
||||
self.rightButton.frame.bottomX = self.frame.width
|
||||
self.rightButton.center.y = self.frame.height / 2
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,28 @@ import UIKit
|
||||
|
||||
public class SPButton: UIButton {
|
||||
|
||||
var gradientView: SPGradientView? {
|
||||
override public func imageRect(forContentRect contentRect: CGRect) -> CGRect {
|
||||
if self.title(for: .normal) != nil {
|
||||
let inset: CGFloat = 6
|
||||
let sideSize = self.frame.height - inset * 2
|
||||
let titleFrame = self.titleRect(forContentRect: contentRect)
|
||||
return CGRect.init(x: titleFrame.origin.x - sideSize - 6, y: 0, width: sideSize, height: self.frame.height)
|
||||
} else {
|
||||
return super.imageRect(forContentRect: contentRect)
|
||||
}
|
||||
}
|
||||
|
||||
override public var isHighlighted: Bool{
|
||||
didSet {
|
||||
if self.isHighlighted {
|
||||
self.imageView?.alpha = 0.7
|
||||
} else {
|
||||
self.imageView?.alpha = 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public var gradientView: SPGradientView? {
|
||||
didSet {
|
||||
self.gradientView?.isUserInteractionEnabled = false
|
||||
if self.gradientView?.superview == nil {
|
||||
@@ -34,7 +55,7 @@ public class SPButton: UIButton {
|
||||
}
|
||||
}
|
||||
|
||||
var round: Bool = false {
|
||||
public var rounded: Bool = false {
|
||||
didSet {
|
||||
self.layoutSubviews()
|
||||
}
|
||||
@@ -50,13 +71,26 @@ public class SPButton: UIButton {
|
||||
self.commonInit()
|
||||
}
|
||||
|
||||
internal func commonInit() {}
|
||||
internal func commonInit() {
|
||||
self.adjustsImageWhenHighlighted = false
|
||||
}
|
||||
|
||||
override public func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
self.gradientView?.setEqualsBoundsFromSuperview()
|
||||
if self.round {
|
||||
self.gradientView?.setSuperviewBounds()
|
||||
if self.rounded {
|
||||
self.round()
|
||||
}
|
||||
}
|
||||
|
||||
public func set(enable: Bool, animatable: Bool) {
|
||||
self.isEnabled = enable
|
||||
if animatable {
|
||||
SPAnimation.animate(0.3, animations: {
|
||||
self.alpha = enable ? 1 : 0.6
|
||||
})
|
||||
} else {
|
||||
self.alpha = enable ? 1 : 0.6
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,8 +71,8 @@ public class SPDotButton: SPButton {
|
||||
|
||||
override public func sizeToFit() {
|
||||
super.sizeToFit()
|
||||
self.setWidth(self.customSideSize)
|
||||
self.setHeight(self.customSideSize)
|
||||
self.frame.set(width: self.customSideSize)
|
||||
self.frame.set(height: self.customSideSize)
|
||||
self.layoutSubviews()
|
||||
}
|
||||
|
||||
@@ -87,9 +87,9 @@ public class SPDotButton: SPButton {
|
||||
var currentXPosition: CGFloat = insest
|
||||
|
||||
for dotView in self.dotsView {
|
||||
dotView.setWidth(sideSize)
|
||||
dotView.setHeight(sideSize)
|
||||
dotView.setYCenteringFromSuperview()
|
||||
dotView.frame.set(width: sideSize)
|
||||
dotView.frame.set(height: sideSize)
|
||||
dotView.setYCenter()
|
||||
dotView.frame.origin.x = currentXPosition
|
||||
dotView.round()
|
||||
currentXPosition += (sideSize + space)
|
||||
|
||||
@@ -44,7 +44,7 @@ public class SPNativeLargeButton: SPDownloadingButton {
|
||||
|
||||
override public func commonInit() {
|
||||
super.commonInit()
|
||||
self.titleLabel?.font = UIFont.system(type: UIFont.BoldType.DemiBold, size: 16)
|
||||
self.titleLabel?.font = UIFont.system(weight: UIFont.FontWeight.demiBold, size: 16)
|
||||
self.setTitleColor(UIColor.white)
|
||||
self.backgroundColor = SPNativeColors.blue
|
||||
self.layer.masksToBounds = true
|
||||
@@ -58,13 +58,13 @@ public class SPNativeLargeButton: SPDownloadingButton {
|
||||
let sideSpace: CGFloat = superview.frame.width * 0.112
|
||||
var width = superview.frame.width - sideSpace * 2
|
||||
width.setIfMore(when: 335)
|
||||
self.setWidth(width)
|
||||
self.frame.set(width: width)
|
||||
}
|
||||
}
|
||||
|
||||
override public func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
self.gradientView?.setEqualsBoundsFromSuperview()
|
||||
self.gradientView?.setSuperviewBounds()
|
||||
self.gradientView?.layer.cornerRadius = self.layer.cornerRadius
|
||||
self.gradientView?.gradientLayer.cornerRadius = self.layer.cornerRadius
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ public class SPPlayCircleButton: UIButton {
|
||||
|
||||
override public func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
self.iconView.setEqualsFrameFromBounds(self, withWidthFactor: 0.45, withHeightFactor: 0.45, withCentering: true)
|
||||
self.iconView.setBounds(self, withWidthFactor: 0.45, withHeightFactor: 0.45, withCentering: true)
|
||||
self.round()
|
||||
}
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ public class SPSocialButton: UIButton {
|
||||
|
||||
override public func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
self.iconView.setEqualsFrameFromBounds(self, withWidthFactor: self.widthIconFactor, withHeightFactor: self.heightIconFactor, withCentering: true)
|
||||
self.iconView.setBounds(self, withWidthFactor: self.widthIconFactor, withHeightFactor: self.heightIconFactor, withCentering: true)
|
||||
self.round()
|
||||
}
|
||||
}
|
||||
|
||||
+15
-13
@@ -21,15 +21,16 @@
|
||||
|
||||
import UIKit
|
||||
|
||||
public class SPSystemIconButton: UIButton {
|
||||
public class SPSystemIconButton: SPButton {
|
||||
|
||||
let iconView = SPSystemIconView.init()
|
||||
|
||||
var widthIconFactor: CGFloat = 1
|
||||
var heightIconFactor: CGFloat = 1
|
||||
|
||||
var type: SPSystemIconType {
|
||||
var icon: SPSystemIcon {
|
||||
didSet {
|
||||
self.iconView.type = self.type
|
||||
self.iconView.icon = self.icon
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,17 +50,17 @@ public class SPSystemIconButton: UIButton {
|
||||
}
|
||||
}
|
||||
|
||||
init() {
|
||||
self.type = .share
|
||||
super.init(frame: CGRect.zero)
|
||||
override init() {
|
||||
self.icon = .share
|
||||
super.init()
|
||||
self.commonInit()
|
||||
}
|
||||
|
||||
init(type: SPSystemIconType) {
|
||||
self.type = type
|
||||
super.init(frame: CGRect.zero)
|
||||
self.iconView.type = self.type
|
||||
self.type = type
|
||||
init(type: SPSystemIcon) {
|
||||
self.icon = type
|
||||
super.init()
|
||||
self.iconView.icon = self.icon
|
||||
self.icon = type
|
||||
self.commonInit()
|
||||
}
|
||||
|
||||
@@ -67,13 +68,14 @@ public class SPSystemIconButton: UIButton {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
fileprivate func commonInit() {
|
||||
override func commonInit() {
|
||||
super.commonInit()
|
||||
self.iconView.isUserInteractionEnabled = false
|
||||
self.addSubview(self.iconView)
|
||||
}
|
||||
|
||||
override public func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
self.iconView.setEqualsFrameFromBounds(self, withWidthFactor: self.widthIconFactor, withHeightFactor: self.heightIconFactor, withCentering: true)
|
||||
self.iconView.setBounds(self, withWidthFactor: self.widthIconFactor, withHeightFactor: self.heightIconFactor, withCentering: true)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ import UIKit
|
||||
|
||||
class SPSystemIconView: UIView {
|
||||
|
||||
var type: SPSystemIconType {
|
||||
var icon: SPSystemIcon {
|
||||
didSet {
|
||||
self.setNeedsDisplay()
|
||||
}
|
||||
@@ -36,13 +36,13 @@ class SPSystemIconView: UIView {
|
||||
}
|
||||
|
||||
init() {
|
||||
self.type = .share
|
||||
self.icon = .share
|
||||
super.init(frame: CGRect.zero)
|
||||
self.commonInit()
|
||||
}
|
||||
|
||||
init(type: SPSystemIconType) {
|
||||
self.type = type
|
||||
init(type: SPSystemIcon) {
|
||||
self.icon = type
|
||||
super.init(frame: CGRect.zero)
|
||||
self.commonInit()
|
||||
}
|
||||
@@ -57,7 +57,7 @@ class SPSystemIconView: UIView {
|
||||
|
||||
override func draw(_ rect: CGRect) {
|
||||
super.draw(rect)
|
||||
switch type {
|
||||
switch icon {
|
||||
case .share:
|
||||
SPCodeDraw.SystemIconPack.drawShare(frame: rect, resizing: .aspectFit, color: self.color)
|
||||
break
|
||||
|
||||
+2
-2
@@ -125,7 +125,7 @@ public class SPMengTransformCollectionViewCell: SPCollectionViewCell {
|
||||
self.titleLabel.text = ""
|
||||
self.titleLabel.setDeepShadowForLetters()
|
||||
self.titleLabel.translatesAutoresizingMaskIntoConstraints = false
|
||||
self.titleLabel.font = UIFont.system(type: .DemiBold, size: 32)
|
||||
self.titleLabel.font = UIFont.system(weight: .demiBold, size: 32)
|
||||
self.titleLabel.textColor = UIColor.white
|
||||
self.titleLabel.numberOfLines = 0
|
||||
contentView.addSubview(self.titleLabel)
|
||||
@@ -140,7 +140,7 @@ public class SPMengTransformCollectionViewCell: SPCollectionViewCell {
|
||||
self.subtitleLabel.text = ""
|
||||
self.subtitleLabel.setDeepShadowForLetters()
|
||||
self.subtitleLabel.translatesAutoresizingMaskIntoConstraints = false
|
||||
self.subtitleLabel.font = UIFont.system(type: .Regular, size: 17)
|
||||
self.subtitleLabel.font = UIFont.system(weight: .regular, size: 17)
|
||||
self.subtitleLabel.textColor = UIColor.white
|
||||
self.subtitleLabel.numberOfLines = 0
|
||||
contentView.addSubview(self.subtitleLabel)
|
||||
+4
@@ -53,6 +53,10 @@ public class SPCollectionView: UICollectionView {
|
||||
func height(rows: Int) -> CGFloat {
|
||||
return self.layout.itemSize.height * CGFloat(rows) + self.layout.minimumLineSpacing * CGFloat(rows - 1)
|
||||
}
|
||||
|
||||
func width(columns: Int) -> CGFloat {
|
||||
return self.layout.itemSize.width * CGFloat(columns) + self.layout.minimumInteritemSpacing * CGFloat(columns - 1)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Cache
|
||||
@@ -23,12 +23,16 @@ import UIKit
|
||||
|
||||
public class SPController: SPStatusBarManagerController {
|
||||
|
||||
let emptyTitlesView = SPEmptyTitlesView(title: "No Data", subtitle: "No data or information")
|
||||
let emptyTitlesView = SPEmptyLabelsView(title: "No Data", subtitle: "No data or information")
|
||||
|
||||
override public func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
self.emptyTitlesView.isHidden = true
|
||||
self.view.addSubview(self.emptyTitlesView)
|
||||
}
|
||||
|
||||
public override func viewWillLayoutSubviews() {
|
||||
super.viewWillLayoutSubviews()
|
||||
self.updateLayout(with: self.view.frame.size)
|
||||
}
|
||||
|
||||
@@ -39,12 +43,6 @@ public class SPController: SPStatusBarManagerController {
|
||||
}, completion: nil)
|
||||
}
|
||||
|
||||
@available(iOS 11.0, *)
|
||||
override public func viewLayoutMarginsDidChange() {
|
||||
super.viewLayoutMarginsDidChange()
|
||||
self.updateLayout(with: self.view.frame.size)
|
||||
}
|
||||
|
||||
func updateLayout(with size: CGSize) {
|
||||
self.emptyTitlesView.layout(centerY: size.height / 2)
|
||||
}
|
||||
|
||||
-2
@@ -77,8 +77,6 @@ public class SPNativeTableController: SPTableController {
|
||||
self.activityIndicatorView.stopAnimating()
|
||||
self.activityIndicatorView.color = SPNativeColors.gray
|
||||
self.view.addSubview(self.activityIndicatorView)
|
||||
|
||||
self.updateLayout(with: self.view.frame.size)
|
||||
}
|
||||
|
||||
override public func numberOfSections(in tableView: UITableView) -> Int {
|
||||
|
||||
+43
-32
@@ -31,6 +31,10 @@ public class SPProposeController: SPController {
|
||||
return 0.5
|
||||
}
|
||||
|
||||
private var gradeFactor: CGFloat {
|
||||
return 0.6
|
||||
}
|
||||
|
||||
private var space: CGFloat {
|
||||
return 6
|
||||
}
|
||||
@@ -75,8 +79,6 @@ public class SPProposeController: SPController {
|
||||
if let image = self.data.image {
|
||||
self.areaView.imageView.setImage(image: image, animatable: false)
|
||||
}
|
||||
|
||||
self.updateLayout(with: self.view.frame.size)
|
||||
}
|
||||
|
||||
override public func viewDidAppear(_ animated: Bool) {
|
||||
@@ -92,7 +94,7 @@ public class SPProposeController: SPController {
|
||||
self.areaView.frame.origin.y = self.view.frame.size.height
|
||||
self.areaView.isHidden = false
|
||||
SPAnimationSpring.animate(self.animationDuration, animations: {
|
||||
self.view.backgroundColor = UIColor.black.withAlphaComponent(0.6)
|
||||
self.view.backgroundColor = UIColor.black.withAlphaComponent(self.gradeFactor)
|
||||
self.areaView.frame.origin.y = self.view.frame.size.height - self.areaView.frame.height - (self.bottomSafeArea / 2) - self.space
|
||||
}, spring: 1,
|
||||
velocity: 1,
|
||||
@@ -100,7 +102,6 @@ public class SPProposeController: SPController {
|
||||
}
|
||||
|
||||
override public func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
|
||||
|
||||
let hide = {
|
||||
self.view.backgroundColor = UIColor.black.withAlphaComponent(0)
|
||||
self.areaView.frame.origin.y = self.view.frame.size.height
|
||||
@@ -128,10 +129,8 @@ public class SPProposeController: SPController {
|
||||
}
|
||||
|
||||
override func updateLayout(with size: CGSize) {
|
||||
self.areaView.setWidth(size.width - (self.space * 2))
|
||||
self.areaView.layoutSubviews()
|
||||
self.areaView.sizeToFit()
|
||||
self.areaView.frame.origin.x = self.space
|
||||
super.updateLayout(with: size)
|
||||
self.areaView.layout(origin: CGPoint.init(x: self.space, y: 0), width: size.width - (self.space * 2))
|
||||
self.areaView.frame.origin.y = self.view.frame.size.height - self.areaView.frame.height - (self.bottomSafeArea / 2) - self.space
|
||||
|
||||
}
|
||||
@@ -140,6 +139,7 @@ public class SPProposeController: SPController {
|
||||
let returnAreaViewToPoint = {
|
||||
SPAnimationSpring.animate(self.animationDuration, animations: {
|
||||
self.areaView.frame.origin.y = self.view.frame.size.height - self.areaView.frame.height - (self.bottomSafeArea / 2) - self.space
|
||||
self.view.backgroundColor = UIColor.black.withAlphaComponent(self.gradeFactor)
|
||||
}, spring: 1,
|
||||
velocity: 1,
|
||||
options: .transitionCurlDown,
|
||||
@@ -156,6 +156,13 @@ public class SPProposeController: SPController {
|
||||
let translation = sender.translation(in: self.view)
|
||||
self.areaView.center = CGPoint(x: areaView.center.x + 0, y: areaView.center.y + translation.y / 4)
|
||||
sender.setTranslation(CGPoint.zero, in: self.view)
|
||||
|
||||
let baseY = self.view.frame.size.height - self.areaView.frame.height - (self.bottomSafeArea / 2) - self.space
|
||||
let dem = -(baseY - self.areaView.frame.origin.y) / 6
|
||||
var newGrade = self.gradeFactor - (dem / 100)
|
||||
newGrade.setIfFewer(when: 0.2)
|
||||
newGrade.setIfMore(when: self.gradeFactor + 0.05)
|
||||
self.view.backgroundColor = UIColor.black.withAlphaComponent(newGrade)
|
||||
case .ended:
|
||||
returnAreaViewToPoint()
|
||||
default:
|
||||
@@ -179,10 +186,9 @@ public class SPProposeController: SPController {
|
||||
let subtitleLabel = UILabel()
|
||||
let imageView = SPDownloadingImageView()
|
||||
let button = SPNativeLargeButton()
|
||||
let closeButton = SPSystemIconButton(type: SPSystemIconType.close)
|
||||
let closeButton = SPSystemIconButton(type: SPSystemIcon.close)
|
||||
|
||||
var imageSideSize: CGFloat = 160
|
||||
|
||||
private let space: CGFloat = 36
|
||||
|
||||
init() {
|
||||
@@ -191,18 +197,18 @@ public class SPProposeController: SPController {
|
||||
self.layer.masksToBounds = true
|
||||
self.layer.cornerRadius = 34
|
||||
|
||||
self.titleLabel.font = UIFont.system(type: .Regular, size: 28)
|
||||
self.titleLabel.font = UIFont.system(weight: .regular, size: 28)
|
||||
self.titleLabel.textColor = UIColor.init(hex: "939393")
|
||||
self.titleLabel.numberOfLines = 1
|
||||
self.titleLabel.adjustsFontSizeToFitWidth = true
|
||||
self.titleLabel.minimumScaleFactor = 0.5
|
||||
self.titleLabel.setCenteringAlignment()
|
||||
self.titleLabel.setCenterAlignment()
|
||||
self.addSubview(self.titleLabel)
|
||||
|
||||
self.subtitleLabel.font = UIFont.system(type: .Regular, size: 16)
|
||||
self.subtitleLabel.font = UIFont.system(weight: .regular, size: 16)
|
||||
self.subtitleLabel.textColor = SPNativeColors.black
|
||||
self.subtitleLabel.numberOfLines = 0
|
||||
self.subtitleLabel.setCenteringAlignment()
|
||||
self.subtitleLabel.setCenterAlignment()
|
||||
self.addSubview(self.subtitleLabel)
|
||||
|
||||
self.imageView.gradeView.backgroundColor = UIColor.white
|
||||
@@ -210,15 +216,16 @@ public class SPProposeController: SPController {
|
||||
self.imageView.layer.masksToBounds = true
|
||||
self.addSubview(self.imageView)
|
||||
|
||||
self.button.titleLabel?.font = UIFont.system(type: UIFont.BoldType.Medium, size: 15)
|
||||
self.button.titleLabel?.font = UIFont.system(weight: UIFont.FontWeight.medium, size: 15)
|
||||
self.button.setTitleColor(SPNativeColors.black)
|
||||
self.button.backgroundColor = UIColor.init(hex: "D4D3DB")
|
||||
self.button.layer.cornerRadius = 13
|
||||
self.button.backgroundColor = SPNativeColors.lightGray
|
||||
self.addSubview(self.button)
|
||||
|
||||
self.closeButton.widthIconFactor = 0.4
|
||||
self.closeButton.heightIconFactor = 0.4
|
||||
self.closeButton.backgroundColor = UIColor.init(hex: "EFEFF4")
|
||||
self.closeButton.color = UIColor.init(hex: "979797")
|
||||
self.closeButton.backgroundColor = SPNativeColors.lightGray.withAlphaComponent(0.6)
|
||||
self.closeButton.color = UIColor.init(hex: "979797")
|
||||
self.addSubview(self.closeButton)
|
||||
}
|
||||
|
||||
@@ -230,36 +237,40 @@ public class SPProposeController: SPController {
|
||||
super.layoutSubviews()
|
||||
|
||||
self.titleLabel.sizeToFit()
|
||||
self.titleLabel.frame.origin.y = self.space * 0.8
|
||||
self.titleLabel.setWidth(self.frame.width - self.space * 3)
|
||||
self.titleLabel.setXCenteringFromSuperview()
|
||||
self.titleLabel.frame.origin.y = self.space * 0.9
|
||||
self.titleLabel.frame.set(width: self.frame.width - self.space * 3)
|
||||
self.titleLabel.setXCenter()
|
||||
|
||||
self.subtitleLabel.sizeToFit()
|
||||
self.subtitleLabel.frame.origin.y = self.titleLabel.frame.bottomYPosition + 8
|
||||
self.subtitleLabel.setWidth(self.frame.width - self.space * 2)
|
||||
self.subtitleLabel.setXCenteringFromSuperview()
|
||||
self.subtitleLabel.frame.origin.y = self.titleLabel.frame.bottomY + 8
|
||||
self.subtitleLabel.frame.set(width: self.frame.width - self.space * 2)
|
||||
self.subtitleLabel.setXCenter()
|
||||
|
||||
self.imageView.frame = CGRect.init(
|
||||
x: 0, y: self.subtitleLabel.frame.bottomYPosition + self.space / 2,
|
||||
x: 0, y: self.subtitleLabel.frame.bottomY + self.space / 2,
|
||||
width: self.imageSideSize,
|
||||
height: self.imageSideSize
|
||||
)
|
||||
self.imageView.setXCenteringFromSuperview()
|
||||
self.imageView.setXCenter()
|
||||
|
||||
self.button.sizeToFit()
|
||||
self.button.setWidth(self.frame.width - self.space * 2)
|
||||
self.button.frame.origin.y = self.imageView.frame.bottomYPosition + self.space / 2
|
||||
self.button.setXCenteringFromSuperview()
|
||||
self.button.frame.set(height: 52)
|
||||
self.button.frame.set(width: self.frame.width - self.space * 2)
|
||||
self.button.frame.origin.y = self.imageView.frame.bottomY + self.space / 1.8
|
||||
self.button.setXCenter()
|
||||
|
||||
self.closeButton.frame = CGRect.init(x: 0, y: 0, width: 24, height: 24)
|
||||
self.closeButton.frame.origin.x = self.frame.width - self.closeButton.frame.width - 20
|
||||
self.closeButton.frame.origin.y = 20
|
||||
self.closeButton.round()
|
||||
|
||||
self.frame.set(height: self.button.frame.bottomY + self.space)
|
||||
}
|
||||
|
||||
override func sizeToFit() {
|
||||
super.sizeToFit()
|
||||
self.setHeight(self.button.frame.bottomYPosition + self.space)
|
||||
func layout(origin: CGPoint, width: CGFloat) {
|
||||
self.frame.origin = origin
|
||||
self.frame.set(width: width)
|
||||
self.layoutSubviews()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-7
@@ -31,7 +31,10 @@ public class SPTableController: SPStatusBarManagerTableController {
|
||||
self.activityIndicatorView.stopAnimating()
|
||||
self.activityIndicatorView.color = SPNativeColors.gray
|
||||
self.view.addSubview(self.activityIndicatorView)
|
||||
|
||||
}
|
||||
|
||||
public override func viewWillLayoutSubviews() {
|
||||
super.viewWillLayoutSubviews()
|
||||
self.updateLayout(with: self.view.frame.size)
|
||||
}
|
||||
|
||||
@@ -42,12 +45,6 @@ public class SPTableController: SPStatusBarManagerTableController {
|
||||
}, completion: nil)
|
||||
}
|
||||
|
||||
@available(iOS 11.0, *)
|
||||
override public func viewLayoutMarginsDidChange() {
|
||||
super.viewLayoutMarginsDidChange()
|
||||
self.updateLayout(with: self.view.frame.size)
|
||||
}
|
||||
|
||||
func updateLayout(with size: CGSize) {
|
||||
self.activityIndicatorView.center = CGPoint.init(
|
||||
x: size.width / 2,
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
// The MIT License (MIT)
|
||||
// Copyright © 2017 Ivan Vorobei (hello@ivanvorobei.by)
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
import UIKit
|
||||
|
||||
public class SPCenterLabelsView: SPView {
|
||||
|
||||
let titleLabel = SPLabel()
|
||||
let subtitleLabel = SPLabel()
|
||||
|
||||
override func commonInit() {
|
||||
super.commonInit()
|
||||
|
||||
self.titleLabel.font = UIFont.system(weight: .bold, size: 33)
|
||||
self.titleLabel.textAlignment = .center
|
||||
self.titleLabel.textColor = UIColor.black
|
||||
self.titleLabel.numberOfLines = 0
|
||||
self.addSubview(self.titleLabel)
|
||||
|
||||
self.subtitleLabel.font = UIFont.system(weight: .regular, size: 17)
|
||||
self.subtitleLabel.textAlignment = .center
|
||||
self.subtitleLabel.textColor = UIColor.black
|
||||
self.subtitleLabel.numberOfLines = 0
|
||||
self.addSubview(self.subtitleLabel)
|
||||
}
|
||||
|
||||
func layout(x: CGFloat, y: CGFloat, width: CGFloat) {
|
||||
self.frame.origin = CGPoint.init(x: x, y: y)
|
||||
self.frame.set(width: width)
|
||||
self.layoutSubviews()
|
||||
}
|
||||
|
||||
override public func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
|
||||
self.titleLabel.frame.set(width: self.frame.width)
|
||||
self.titleLabel.sizeToFit()
|
||||
self.titleLabel.frame.set(width: self.frame.width)
|
||||
self.titleLabel.frame.origin = CGPoint.zero
|
||||
|
||||
self.subtitleLabel.frame.set(width: self.frame.width)
|
||||
self.subtitleLabel.sizeToFit()
|
||||
self.subtitleLabel.frame.set(width: self.frame.width)
|
||||
self.subtitleLabel.frame.origin.x = 0
|
||||
self.subtitleLabel.frame.origin.y = self.titleLabel.frame.bottomY + 7
|
||||
|
||||
self.frame.set(height: self.subtitleLabel.frame.bottomY)
|
||||
}
|
||||
}
|
||||
+10
-10
@@ -21,7 +21,7 @@
|
||||
|
||||
import UIKit
|
||||
|
||||
class SPEmptyTitlesView: SPView {
|
||||
class SPEmptyLabelsView: SPView {
|
||||
|
||||
let titleLabel = UILabel()
|
||||
let subtitleLabel = UILabel()
|
||||
@@ -39,22 +39,22 @@ class SPEmptyTitlesView: SPView {
|
||||
override func commonInit() {
|
||||
super.commonInit()
|
||||
|
||||
self.titleLabel.font = UIFont.system(type: .Bold, size: 29)
|
||||
self.titleLabel.font = UIFont.system(weight: .bold, size: 29)
|
||||
self.titleLabel.textColor = SPNativeColors.gray
|
||||
self.titleLabel.setCenteringAlignment()
|
||||
self.titleLabel.setCenterAlignment()
|
||||
self.titleLabel.numberOfLines = 0
|
||||
self.addSubview(self.titleLabel)
|
||||
|
||||
self.subtitleLabel.font = UIFont.system(type: .Regular, size: 17)
|
||||
self.subtitleLabel.font = UIFont.system(weight: .regular, size: 17)
|
||||
self.subtitleLabel.textColor = SPNativeColors.gray
|
||||
self.subtitleLabel.setCenteringAlignment()
|
||||
self.subtitleLabel.setCenterAlignment()
|
||||
self.subtitleLabel.numberOfLines = 0
|
||||
self.addSubview(self.subtitleLabel)
|
||||
}
|
||||
|
||||
func layout(centerY: CGFloat) {
|
||||
if let superview = self.superview {
|
||||
self.setWidth(superview.frame.width * 0.7)
|
||||
self.frame.set(width: superview.frame.width * 0.7)
|
||||
self.layoutSubviews()
|
||||
self.center = CGPoint.init(x: superview.frame.width / 2, y: centerY)
|
||||
}
|
||||
@@ -65,12 +65,12 @@ class SPEmptyTitlesView: SPView {
|
||||
|
||||
self.titleLabel.frame.origin = .zero
|
||||
self.titleLabel.sizeToFit()
|
||||
self.titleLabel.setWidth(self.frame.width)
|
||||
self.titleLabel.frame.set(width: self.frame.width)
|
||||
|
||||
self.subtitleLabel.frame.origin = CGPoint.init(x: 0, y: self.titleLabel.frame.bottomYPosition + 5)
|
||||
self.subtitleLabel.frame.origin = CGPoint.init(x: 0, y: self.titleLabel.frame.bottomY + 5)
|
||||
self.subtitleLabel.sizeToFit()
|
||||
self.subtitleLabel.setWidth(self.frame.width)
|
||||
self.subtitleLabel.frame.set(width: self.frame.width)
|
||||
|
||||
self.setHeight(self.subtitleLabel.frame.bottomYPosition)
|
||||
self.frame.set(height: self.subtitleLabel.frame.bottomY)
|
||||
}
|
||||
}
|
||||
+13
-12
@@ -30,48 +30,49 @@ public class SPSectionLabelsView: SPView {
|
||||
override func commonInit() {
|
||||
super.commonInit()
|
||||
|
||||
self.titleLabel.font = UIFont.system(type: .Bold, size: 23)
|
||||
self.titleLabel.font = UIFont.system(weight: .bold, size: 23)
|
||||
self.titleLabel.textAlignment = .left
|
||||
self.titleLabel.textColor = UIColor.black
|
||||
self.titleLabel.numberOfLines = 0
|
||||
self.addSubview(self.titleLabel)
|
||||
|
||||
self.subtitleLabel.font = UIFont.system(type: .Regular, size: 17)
|
||||
self.subtitleLabel.font = UIFont.system(weight: .regular, size: 17)
|
||||
self.subtitleLabel.textAlignment = .left
|
||||
self.subtitleLabel.textColor = UIColor.black.withAlphaComponent(0.7)
|
||||
self.subtitleLabel.numberOfLines = 0
|
||||
self.addSubview(self.subtitleLabel)
|
||||
|
||||
self.button.titleLabel?.font = UIFont.system(type: .Regular, size: 17)
|
||||
self.button.titleLabel?.font = UIFont.system(weight: .regular, size: 17)
|
||||
self.button.setTitleColor(SPNativeColors.blue, for: UIControl.State.normal)
|
||||
self.addSubview(self.button)
|
||||
}
|
||||
|
||||
func layout(origin: CGPoint, width: CGFloat) {
|
||||
self.frame.origin = origin
|
||||
self.setWidth(width)
|
||||
self.frame.set(width: width)
|
||||
self.layoutSubviews()
|
||||
}
|
||||
|
||||
func layout(x: CGFloat, y: CGFloat, width: CGFloat) {
|
||||
self.layout(origin: CGPoint.init(x: x, y: y), width: width)
|
||||
}
|
||||
|
||||
override public func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
|
||||
self.titleLabel.sizeToFit()
|
||||
self.titleLabel.setWidth(self.frame.width)
|
||||
self.titleLabel.frame.set(width: self.frame.width)
|
||||
self.titleLabel.frame.origin = CGPoint.zero
|
||||
//self.titleLabel.backgroundColor = UIColor.lightGray
|
||||
|
||||
self.subtitleLabel.sizeToFit()
|
||||
self.subtitleLabel.setWidth(self.frame.width)
|
||||
self.subtitleLabel.frame.set(width: self.frame.width)
|
||||
self.subtitleLabel.frame.origin.x = 0
|
||||
self.subtitleLabel.frame.origin.y = self.titleLabel.frame.bottomYPosition + 3
|
||||
//self.subtitleLabel.backgroundColor = UIColor.darkGray
|
||||
self.subtitleLabel.frame.origin.y = self.titleLabel.frame.bottomY + 3
|
||||
|
||||
self.button.sizeToFit()
|
||||
self.button.frame.bottomXPosition = self.frame.width
|
||||
self.button.frame.bottomX = self.frame.width
|
||||
self.button.center.y = self.titleLabel.center.y
|
||||
//self.button.backgroundColor = UIColor.darkGray
|
||||
|
||||
self.setHeight(self.subtitleLabel.frame.bottomYPosition)
|
||||
self.frame.set(height: self.subtitleLabel.frame.bottomY)
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -33,7 +33,7 @@ public class SPDownloadingImageView: SPImageView {
|
||||
self.addSubview(self.gradeView)
|
||||
self.gradeView.backgroundColor = UIColor.init(hex: "F0F1F6")
|
||||
self.activityIndiactorView.color = UIColor.darkGray
|
||||
self.addSubview(self.activityIndiactorView)
|
||||
//self.addSubview(self.activityIndiactorView)
|
||||
self.activityIndiactorView.startAnimating()
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ public class SPDownloadingImageView: SPImageView {
|
||||
|
||||
override public func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
self.gradeView.setEqualsBoundsFromSuperview()
|
||||
self.gradeView.setSuperviewBounds()
|
||||
self.activityIndiactorView.center = CGPoint.init(x: self.bounds.midX, y: self.bounds.midY)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ import UIKit
|
||||
|
||||
public class SPFakeBarView: UIView {
|
||||
|
||||
public var style: SPNavigationTitleStyle = . small {
|
||||
public var style: SPNavigationTitleStyle = .small {
|
||||
didSet {
|
||||
self.updateStyle()
|
||||
}
|
||||
@@ -54,15 +54,15 @@ public class SPFakeBarView: UIView {
|
||||
}
|
||||
}
|
||||
|
||||
public var closeButton: closeButtonPlace = .none {
|
||||
public var closeButtonPossition: CloseButtonPosition = .none {
|
||||
didSet {
|
||||
self.leftButton.titleLabel?.font = UIFont.system(type: .Regular, size: 17)
|
||||
self.rightButton.titleLabel?.font = UIFont.system(type: .Regular, size: 17)
|
||||
switch self.closeButton {
|
||||
self.leftButton.titleLabel?.font = UIFont.system(weight: .regular, size: 17)
|
||||
self.rightButton.titleLabel?.font = UIFont.system(weight: .regular, size: 17)
|
||||
switch self.closeButtonPossition {
|
||||
case .left:
|
||||
self.leftButton.titleLabel?.font = UIFont.system(type: .DemiBold, size: 17)
|
||||
self.leftButton.titleLabel?.font = UIFont.system(weight: .demiBold, size: 17)
|
||||
case .right:
|
||||
self.rightButton.titleLabel?.font = UIFont.system(type: .DemiBold, size: 17)
|
||||
self.rightButton.titleLabel?.font = UIFont.system(weight: .demiBold, size: 17)
|
||||
case .none:
|
||||
break
|
||||
}
|
||||
@@ -121,7 +121,7 @@ public class SPFakeBarView: UIView {
|
||||
|
||||
self.addSubview(self.subtitleLabel)
|
||||
self.subtitleLabel.textColor = UIColor.init(hex: "8E8E92")
|
||||
self.subtitleLabel.font = UIFont.system(type: .DemiBold, size: 13)
|
||||
self.subtitleLabel.font = UIFont.system(weight: .demiBold, size: 13)
|
||||
self.subtitleLabel.translatesAutoresizingMaskIntoConstraints = false
|
||||
self.subtitleLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 16).isActive = true
|
||||
self.subtitleLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -16).isActive = true
|
||||
@@ -129,7 +129,7 @@ public class SPFakeBarView: UIView {
|
||||
|
||||
self.leftButton.setTitleColor(self.elementsColor)
|
||||
self.leftButton.titleLabel?.textAlignment = .left
|
||||
self.leftButton.titleLabel?.font = UIFont.system(type: .DemiBold, size: 16)
|
||||
self.leftButton.titleLabel?.font = UIFont.system(weight: .demiBold, size: 16)
|
||||
self.leftButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 17, bottom: 0, right: 0)
|
||||
self.addSubview(self.leftButton)
|
||||
self.leftButton.translatesAutoresizingMaskIntoConstraints = false
|
||||
@@ -138,14 +138,14 @@ public class SPFakeBarView: UIView {
|
||||
|
||||
self.rightButton.setTitleColor(self.elementsColor)
|
||||
self.rightButton.titleLabel?.textAlignment = .right
|
||||
self.rightButton.titleLabel?.font = UIFont.system(type: .DemiBold, size: 17)
|
||||
self.rightButton.titleLabel?.font = UIFont.system(weight: .demiBold, size: 17)
|
||||
self.rightButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 16)
|
||||
self.addSubview(self.rightButton)
|
||||
self.rightButton.translatesAutoresizingMaskIntoConstraints = false
|
||||
self.rightButton.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
|
||||
self.rightButton.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -12).isActive = true
|
||||
|
||||
self.closeButton = .none
|
||||
self.closeButtonPossition = .none
|
||||
|
||||
self.setContraints()
|
||||
self.updateStyle()
|
||||
@@ -185,14 +185,14 @@ public class SPFakeBarView: UIView {
|
||||
self.titleBottomConstraint?.constant = -12
|
||||
}
|
||||
self.addStatusBarHeight = true
|
||||
self.titleLabel.font = UIFont.system(type: .DemiBold, size: 17)
|
||||
self.titleLabel.setCenteringAlignment()
|
||||
self.titleLabel.font = UIFont.system(weight: .demiBold, size: 17)
|
||||
self.titleLabel.setCenterAlignment()
|
||||
case .stork:
|
||||
self.height = 66
|
||||
self.titleBottomConstraint?.constant = -12
|
||||
self.addStatusBarHeight = false
|
||||
self.titleLabel.font = UIFont.system(type: .DemiBold, size: 17)
|
||||
self.titleLabel.setCenteringAlignment()
|
||||
self.titleLabel.font = UIFont.system(weight: .demiBold, size: 17)
|
||||
self.titleLabel.setCenterAlignment()
|
||||
case .large:
|
||||
if UIViewController.statusBarHeight == 44 {
|
||||
self.height = 140 - 44
|
||||
@@ -202,7 +202,7 @@ public class SPFakeBarView: UIView {
|
||||
self.titleBottomConstraint?.constant = -4
|
||||
}
|
||||
self.addStatusBarHeight = true
|
||||
self.titleLabel.font = UIFont.system(type: .Bold, size: 34)
|
||||
self.titleLabel.font = UIFont.system(weight: .bold, size: 34)
|
||||
self.titleLabel.textAlignment = .left
|
||||
break
|
||||
}
|
||||
@@ -215,7 +215,7 @@ public class SPFakeBarView: UIView {
|
||||
self.updateConstraints()
|
||||
}
|
||||
|
||||
public enum closeButtonPlace {
|
||||
public enum CloseButtonPosition {
|
||||
case left
|
||||
case right
|
||||
case none
|
||||
|
||||
@@ -36,8 +36,7 @@ public class SPFooterActionsView: SPView {
|
||||
|
||||
func addButton(title: String, titleColor: UIColor, target: @escaping ()->()) {
|
||||
let button = SPFooterActionButton()
|
||||
button.setTitle(title)
|
||||
button.setTitleColor(titleColor)
|
||||
button.setTitle(title, color: titleColor)
|
||||
button.target { target() }
|
||||
self.buttons.append(button)
|
||||
self.addSubview(button)
|
||||
@@ -56,7 +55,7 @@ public class SPFooterActionsView: SPView {
|
||||
|
||||
func layout(origin: CGPoint, width: CGFloat) {
|
||||
self.frame.origin = origin
|
||||
self.setWidth(width)
|
||||
self.frame.set(width: width)
|
||||
self.layoutSubviews()
|
||||
}
|
||||
|
||||
@@ -66,7 +65,7 @@ public class SPFooterActionsView: SPView {
|
||||
self.sectionLabels.layout(origin: CGPoint.zero, width: self.frame.width)
|
||||
|
||||
let buttonHeight: CGFloat = 50
|
||||
var yPositionButton: CGFloat = self.sectionLabels.frame.bottomYPosition + 12
|
||||
var yPositionButton: CGFloat = self.sectionLabels.frame.bottomY + 12
|
||||
|
||||
if !self.buttons.isEmpty {
|
||||
for i in 0...(buttons.count - 1) {
|
||||
@@ -75,14 +74,14 @@ public class SPFooterActionsView: SPView {
|
||||
|
||||
separator.frame.origin.x = 0
|
||||
separator.frame.origin.y = yPositionButton
|
||||
separator.setWidth(self.frame.width)
|
||||
separator.frame.set(width: self.frame.width)
|
||||
|
||||
button.frame = CGRect.init(x: 0, y: yPositionButton, width: self.frame.width, height: buttonHeight)
|
||||
|
||||
yPositionButton += buttonHeight
|
||||
}
|
||||
|
||||
self.setHeight(yPositionButton)
|
||||
self.frame.set(height: yPositionButton)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -104,7 +103,7 @@ class SPFooterActionButton: SPButton {
|
||||
override func commonInit() {
|
||||
super.commonInit()
|
||||
self.setTitleColor(SPNativeColors.blue)
|
||||
self.titleLabel?.font = UIFont.system(type: .Regular, size: 21)
|
||||
self.titleLabel?.font = UIFont.system(weight: .regular, size: 21)
|
||||
self.contentHorizontalAlignment = .left
|
||||
}
|
||||
|
||||
@@ -113,6 +112,6 @@ class SPFooterActionButton: SPButton {
|
||||
let sideSize: CGFloat = self.frame.height * 0.36
|
||||
self.rightIconView?.frame = CGRect.init(x: 0, y: 0, width: sideSize, height: sideSize)
|
||||
self.rightIconView?.center.y = self.frame.height / 2
|
||||
self.rightIconView?.frame.bottomXPosition = self.frame.width - sideSize / 3
|
||||
self.rightIconView?.frame.bottomX = self.frame.width - sideSize / 3
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,6 @@ public class SPScrollView: UIScrollView {
|
||||
&& !(view is UISwitch) {
|
||||
return true
|
||||
}
|
||||
|
||||
return super.touchesShouldCancel(in: view)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,16 +31,17 @@ class SPSeparatorView: SPView {
|
||||
super.commonInit()
|
||||
self.backgroundColor = UIColor.init(hex: "515B66").withAlphaComponent(0.25)
|
||||
self.round = true
|
||||
self.setHeight(self.height)
|
||||
self.frame.set(height: self.height)
|
||||
}
|
||||
|
||||
func layout(origin: CGPoint, width: CGFloat) {
|
||||
self.frame.origin = CGPoint.init(x: floor(origin.x), y: floor(origin.y))
|
||||
self.set(width: floor(width), height: self.height)
|
||||
self.frame.set(width: floor(width))
|
||||
self.frame.set(height: self.height)
|
||||
}
|
||||
|
||||
override func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
self.setHeight(self.height)
|
||||
self.frame.set(height: self.height)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,6 +52,6 @@ class SPVideoPlayerView: UIView {
|
||||
|
||||
override func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
self.playerController.view.setEqualsBoundsFromSuperview()
|
||||
self.playerController.view.setSuperviewBounds()
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -46,7 +46,7 @@ public class SPFormButtonTableViewCell: UITableViewCell {
|
||||
self.button.setTitle("Button", for: .normal)
|
||||
self.button.backgroundColor = UIColor.clear
|
||||
self.button.setTitleColor(SPNativeColors.blue)
|
||||
self.button.titleLabel?.font = UIFont.system(type: .Medium, size: 17)
|
||||
self.button.titleLabel?.font = UIFont.system(weight: .medium, size: 17)
|
||||
self.selectionStyle = .none
|
||||
self.contentView.addSubview(self.button)
|
||||
}
|
||||
@@ -60,7 +60,7 @@ public class SPFormButtonTableViewCell: UITableViewCell {
|
||||
|
||||
override public func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
self.button.setEqualsBoundsFromSuperview()
|
||||
self.button.setSuperviewBounds()
|
||||
|
||||
switch self.separatorInsetStyle {
|
||||
case .all:
|
||||
+4
-4
@@ -30,10 +30,10 @@ public class SPFormFeaturedTitleTableViewCell: UITableViewCell {
|
||||
didSet {
|
||||
switch type {
|
||||
case .large:
|
||||
self.titleLabel.font = UIFont.system(type: .Bold, size: 22)
|
||||
self.titleLabel.font = UIFont.system(weight: .bold, size: 22)
|
||||
self.titleLabel.textColor = UIColor.black
|
||||
case .smallColorful:
|
||||
self.titleLabel.font = UIFont.system(type: .DemiBold, size: 11)
|
||||
self.titleLabel.font = UIFont.system(weight: .demiBold, size: 11)
|
||||
self.titleLabel.textColor = SPNativeColors.blue
|
||||
self.titleLabel.text = self.titleLabel.text?.uppercased()
|
||||
}
|
||||
@@ -69,7 +69,7 @@ public class SPFormFeaturedTitleTableViewCell: UITableViewCell {
|
||||
contentView.addSubview(self.titleLabel)
|
||||
self.titleLabel.numberOfLines = 0
|
||||
self.titleLabel.text = "Title"
|
||||
self.titleLabel.font = UIFont.system(type: .Bold, size: 21)
|
||||
self.titleLabel.font = UIFont.system(weight: .bold, size: 21)
|
||||
self.titleLabel.translatesAutoresizingMaskIntoConstraints = false
|
||||
self.titleLabel.setLettersSpacing(-0.24)
|
||||
|
||||
@@ -83,7 +83,7 @@ public class SPFormFeaturedTitleTableViewCell: UITableViewCell {
|
||||
self.withButton = false
|
||||
self.button.setTitle("Button Title", for: UIControl.State.normal)
|
||||
self.button.setTitleColor(SPNativeColors.blue)
|
||||
self.button.titleLabel?.font = UIFont.system(type: .Medium, size: 17)
|
||||
self.button.titleLabel?.font = UIFont.system(weight: .medium, size: 17)
|
||||
self.button.translatesAutoresizingMaskIntoConstraints = false
|
||||
self.button.titleLabel?.textAlignment = .right
|
||||
contentView.addSubview(self.button)
|
||||
+6
-6
@@ -58,13 +58,13 @@ public class SPFormLabelTableViewCell: SPTableViewCell {
|
||||
self.label.textAlignment = .left
|
||||
self.label.text = "Title"
|
||||
self.label.numberOfLines = 1
|
||||
self.label.font = UIFont.system(type: .Regular, size: 17)
|
||||
self.label.font = UIFont.system(weight: .regular, size: 17)
|
||||
self.contentView.addSubview(self.label)
|
||||
|
||||
self.descriptionLabel.textAlignment = .right
|
||||
self.descriptionLabel.text = "Description"
|
||||
self.descriptionLabel.numberOfLines = 1
|
||||
self.descriptionLabel.font = UIFont.system(type: .Regular, size: 17)
|
||||
self.descriptionLabel.font = UIFont.system(weight: .regular, size: 17)
|
||||
self.descriptionLabel.textColor = SPNativeColors.gray
|
||||
self.contentView.addSubview(self.descriptionLabel)
|
||||
|
||||
@@ -87,7 +87,7 @@ public class SPFormLabelTableViewCell: SPTableViewCell {
|
||||
override public func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
|
||||
let xPosition: CGFloat = (self.imageView?.frame.bottomXPosition ?? 0) + self.layoutMargins.left
|
||||
let xPosition: CGFloat = (self.imageView?.frame.bottomX ?? 0) + self.layoutMargins.left
|
||||
|
||||
var labelWidth: CGFloat = self.contentView.frame.width * 0.45
|
||||
if let width = self.fixWidthLabel {
|
||||
@@ -101,9 +101,9 @@ public class SPFormLabelTableViewCell: SPTableViewCell {
|
||||
|
||||
let space: CGFloat = 15
|
||||
self.descriptionLabel.frame = CGRect.init(
|
||||
x: self.label.frame.bottomXPosition + space,
|
||||
x: self.label.frame.bottomX + space,
|
||||
y: 0,
|
||||
width: self.contentView.frame.width - self.label.frame.bottomXPosition -
|
||||
width: self.contentView.frame.width - self.label.frame.bottomX -
|
||||
self.contentView.layoutMargins.right - space,
|
||||
height: self.contentView.frame.height)
|
||||
|
||||
@@ -119,7 +119,7 @@ public class SPFormLabelTableViewCell: SPTableViewCell {
|
||||
self.separatorInset.left = 0
|
||||
case .beforeImage:
|
||||
if let imageView = self.imageView {
|
||||
self.separatorInset.left = imageView.frame.bottomYPosition + self.layoutMargins.left
|
||||
self.separatorInset.left = imageView.frame.bottomY + self.layoutMargins.left
|
||||
} else {
|
||||
self.separatorInset.left = 0
|
||||
}
|
||||
+3
-3
@@ -60,10 +60,10 @@ public class SPFormTextFiledTableViewCell: UITableViewCell {
|
||||
self.backgroundColor = UIColor.white
|
||||
|
||||
self.label.text = "Label"
|
||||
self.label.font = UIFont.system(type: .Regular, size: 17)
|
||||
self.label.font = UIFont.system(weight: .regular, size: 17)
|
||||
self.contentView.addSubview(self.label)
|
||||
|
||||
self.textField.font = UIFont.system(type: .Regular, size: 17)
|
||||
self.textField.font = UIFont.system(weight: .regular, size: 17)
|
||||
self.textField.placeholder = "Placeholder"
|
||||
self.contentView.addSubview(self.textField)
|
||||
|
||||
@@ -79,7 +79,7 @@ public class SPFormTextFiledTableViewCell: UITableViewCell {
|
||||
}
|
||||
self.label.frame = CGRect.init(x: self.layoutMargins.left, y: 0, width: labelWidth, height: self.contentView.frame.height)
|
||||
let space: CGFloat = 15
|
||||
self.textField.frame = CGRect.init(x: self.label.frame.bottomXPosition + space, y: 0, width: self.contentView.frame.width - self.label.frame.bottomXPosition - self.layoutMargins.right - space, height: self.contentView.frame.height)
|
||||
self.textField.frame = CGRect.init(x: self.label.frame.bottomX + space, y: 0, width: self.contentView.frame.width - self.label.frame.bottomX - self.layoutMargins.right - space, height: self.contentView.frame.height)
|
||||
|
||||
switch self.separatorInsetStyle {
|
||||
case .all:
|
||||
+3
-3
@@ -61,7 +61,7 @@ public class SPFormTextInputTableViewCell: SPTableViewCell {
|
||||
self.backgroundColor = UIColor.white
|
||||
self.textInputView.textAlignment = .left
|
||||
self.textInputView.text = ""
|
||||
self.textInputView.font = UIFont.system(type: .Regular, size: 17)
|
||||
self.textInputView.font = UIFont.system(weight: .regular, size: 17)
|
||||
self.textInputView.translatesAutoresizingMaskIntoConstraints = false
|
||||
self.textInputView.showsVerticalScrollIndicator = false
|
||||
self.contentView.addSubview(self.textInputView)
|
||||
@@ -90,7 +90,7 @@ public class SPFormTextInputTableViewCell: SPTableViewCell {
|
||||
override public func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
|
||||
let xPosition: CGFloat = (self.imageView?.frame.bottomXPosition ?? 0) + self.layoutMargins.left
|
||||
let xPosition: CGFloat = (self.imageView?.frame.bottomX ?? 0) + self.layoutMargins.left
|
||||
|
||||
self.textInputView.frame = CGRect.init(
|
||||
x: xPosition, y: 0,
|
||||
@@ -103,7 +103,7 @@ public class SPFormTextInputTableViewCell: SPTableViewCell {
|
||||
self.separatorInset.left = 0
|
||||
case .beforeImage:
|
||||
if let imageView = self.imageView {
|
||||
self.separatorInset.left = imageView.frame.bottomYPosition + self.layoutMargins.left
|
||||
self.separatorInset.left = imageView.frame.bottomY + self.layoutMargins.left
|
||||
} else {
|
||||
self.separatorInset.left = 0
|
||||
}
|
||||
+6
-6
@@ -214,7 +214,7 @@ public class SPBaseContentTableViewCell: SPTableViewCell {
|
||||
|
||||
//titleLabel
|
||||
self.titleLabel.numberOfLines = 0
|
||||
self.titleLabel.font = UIFont.system(type: UIFont.BoldType.Medium, size: 17)
|
||||
self.titleLabel.font = UIFont.system(weight: UIFont.FontWeight.medium, size: 17)
|
||||
self.titleLabel.textAlignment = .left
|
||||
self.titleLabel.textColor = UIColor.black
|
||||
self.contentView.addSubview(self.titleLabel)
|
||||
@@ -234,7 +234,7 @@ public class SPBaseContentTableViewCell: SPTableViewCell {
|
||||
|
||||
//subtitleLabel
|
||||
self.subtitleLabel.numberOfLines = 0
|
||||
self.subtitleLabel.font = UIFont.system(type: UIFont.BoldType.Regular, size: 15)
|
||||
self.subtitleLabel.font = UIFont.system(weight: UIFont.FontWeight.regular, size: 15)
|
||||
self.subtitleLabel.textAlignment = .left
|
||||
self.subtitleLabel.textColor = UIColor.black
|
||||
self.contentView.addSubview(self.subtitleLabel)
|
||||
@@ -248,7 +248,7 @@ public class SPBaseContentTableViewCell: SPTableViewCell {
|
||||
|
||||
//descriptionLabel
|
||||
self.descriptionLabel.numberOfLines = 0
|
||||
self.descriptionLabel.font = UIFont.system(type: UIFont.BoldType.Regular, size: 15)
|
||||
self.descriptionLabel.font = UIFont.system(weight: UIFont.FontWeight.regular, size: 15)
|
||||
self.descriptionLabel.textAlignment = .left
|
||||
self.descriptionLabel.textColor = SPNativeColors.gray
|
||||
self.contentView.addSubview(self.descriptionLabel)
|
||||
@@ -295,15 +295,15 @@ public class SPBaseContentTableViewCell: SPTableViewCell {
|
||||
self.iconImageView.setNative()
|
||||
|
||||
self.titleLabel.text = "Title"
|
||||
self.titleLabel.font = UIFont.system(type: UIFont.BoldType.Medium, size: 17)
|
||||
self.titleLabel.font = UIFont.system(weight: UIFont.FontWeight.medium, size: 17)
|
||||
self.titleLabel.textAlignment = .left
|
||||
self.titleLabel.textColor = UIColor.black
|
||||
self.subtitleLabel.text = "Subtitle"
|
||||
self.subtitleLabel.font = UIFont.system(type: UIFont.BoldType.Regular, size: 15)
|
||||
self.subtitleLabel.font = UIFont.system(weight: UIFont.FontWeight.regular, size: 15)
|
||||
self.subtitleLabel.textAlignment = .left
|
||||
self.subtitleLabel.textColor = UIColor.black
|
||||
self.descriptionLabel.text = "Description"
|
||||
self.descriptionLabel.font = UIFont.system(type: UIFont.BoldType.Regular, size: 15)
|
||||
self.descriptionLabel.font = UIFont.system(weight: UIFont.FontWeight.regular, size: 15)
|
||||
self.descriptionLabel.textAlignment = .left
|
||||
self.descriptionLabel.textColor = SPNativeColors.gray
|
||||
self.button.setTitle("Button")
|
||||
+3
-3
@@ -63,7 +63,7 @@ public class SPImageTableViewCell: SPTableViewCell {
|
||||
let marginGuide = contentView.layoutMarginsGuide
|
||||
|
||||
self.titleLabel.numberOfLines = 0
|
||||
self.titleLabel.font = UIFont.system(type: UIFont.BoldType.Medium, size: 21)
|
||||
self.titleLabel.font = UIFont.system(weight: UIFont.FontWeight.medium, size: 21)
|
||||
self.titleLabel.textAlignment = .left
|
||||
self.titleLabel.textColor = UIColor.black
|
||||
self.contentView.addSubview(self.titleLabel)
|
||||
@@ -77,7 +77,7 @@ public class SPImageTableViewCell: SPTableViewCell {
|
||||
self.titleLabelTopConstraint.isActive = true
|
||||
|
||||
self.subtitleLabel.numberOfLines = 3
|
||||
self.subtitleLabel.font = UIFont.system(type: UIFont.BoldType.Regular, size: 15)
|
||||
self.subtitleLabel.font = UIFont.system(weight: UIFont.FontWeight.regular, size: 15)
|
||||
self.subtitleLabel.textAlignment = .left
|
||||
self.subtitleLabel.textColor = SPNativeColors.gray
|
||||
self.contentView.addSubview(self.subtitleLabel)
|
||||
@@ -115,7 +115,7 @@ public class SPImageTableViewCell: SPTableViewCell {
|
||||
|
||||
override public func layoutSubviews() {
|
||||
super.layoutSubviews()
|
||||
self.accessoryView?.center.y = self.titleLabel.frame.bottomYPosition + self.subtitleLabel.frame.height / 2
|
||||
self.accessoryView?.center.y = self.titleLabel.frame.bottomY + self.subtitleLabel.frame.height / 2
|
||||
if self.accessoryView?.frame.origin.y ?? 0 < 5 {
|
||||
self.accessoryView?.center.y = self.frame.height / 2
|
||||
}
|
||||
+4
-4
@@ -49,10 +49,10 @@ public class SPPromoTableViewCell: SPBaseContentTableViewCell {
|
||||
self.spaceAfterDescribtion = 16
|
||||
self.bottomSpace = 22
|
||||
|
||||
self.titleLabel.font = UIFont.system(type: .DemiBold, size: 16)
|
||||
self.titleLabel.setCenteringAlignment()
|
||||
self.descriptionLabel.font = UIFont.system(type: .Regular, size: 13)
|
||||
self.descriptionLabel.setCenteringAlignment()
|
||||
self.titleLabel.font = UIFont.system(weight: .demiBold, size: 16)
|
||||
self.titleLabel.setCenterAlignment()
|
||||
self.descriptionLabel.font = UIFont.system(weight: .regular, size: 13)
|
||||
self.descriptionLabel.setCenterAlignment()
|
||||
self.subtitleLabel.textColor = UIColor.lightGray
|
||||
self.button.style = .main
|
||||
}
|
||||
+3
-3
@@ -35,7 +35,7 @@ public class SPProposeTableViewCell: UITableViewCell {
|
||||
self.addSubview(self.button)
|
||||
self.button.setTitle("Action", for: .normal)
|
||||
|
||||
self.button.titleLabel?.font = UIFont.system(type: .DemiBold, size: 14)
|
||||
self.button.titleLabel?.font = UIFont.system(weight: .demiBold, size: 14)
|
||||
self.button.titleLabel?.numberOfLines = 0
|
||||
self.button.secondColor = SPNativeColors.blue
|
||||
self.button.baseColor = UIColor.white
|
||||
@@ -48,9 +48,9 @@ public class SPProposeTableViewCell: UITableViewCell {
|
||||
|
||||
self.addSubview(self.titleLabel)
|
||||
self.titleLabel.numberOfLines = 0
|
||||
self.titleLabel.setCenteringAlignment()
|
||||
self.titleLabel.setCenterAlignment()
|
||||
self.titleLabel.textAlignment = .left
|
||||
self.titleLabel.font = UIFont.system(type: .Regular, size: 16)
|
||||
self.titleLabel.font = UIFont.system(weight: .regular, size: 16)
|
||||
self.titleLabel.translatesAutoresizingMaskIntoConstraints = false
|
||||
self.titleLabel.leadingAnchor.constraint(equalTo: marginGuide.leadingAnchor).isActive = true
|
||||
self.titleLabel.topAnchor.constraint(equalTo: marginGuide.topAnchor, constant: 0).isActive = true
|
||||
@@ -21,9 +21,7 @@
|
||||
|
||||
import UIKit
|
||||
|
||||
public struct SPVibration { private init() {} }
|
||||
|
||||
extension SPVibration {
|
||||
public struct SPVibration {
|
||||
|
||||
public static func impact(_ style: Style) {
|
||||
|
||||
@@ -57,4 +55,6 @@ extension SPVibration {
|
||||
case success
|
||||
case warning
|
||||
}
|
||||
|
||||
private init() {}
|
||||
}
|
||||
|
||||
@@ -18,8 +18,6 @@ class ModalTableViewController: UIViewController {
|
||||
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
|
||||
self.tableView.contentInset.top = self.navBar.height
|
||||
self.tableView.scrollIndicatorInsets.top = self.navBar.height
|
||||
self.tableView.contentInset.bottom = self.safeArea.bottom
|
||||
self.tableView.scrollIndicatorInsets.bottom = self.safeArea.bottom
|
||||
self.view.addSubview(self.tableView)
|
||||
|
||||
self.navBar.titleLabel.text = "Table"
|
||||
@@ -30,21 +28,13 @@ class ModalTableViewController: UIViewController {
|
||||
self.updateLayout(with: self.view.frame.size)
|
||||
}
|
||||
|
||||
override public func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
|
||||
super.viewWillTransition(to: size, with: coordinator)
|
||||
coordinator.animate(alongsideTransition: { (contex) in
|
||||
self.updateLayout(with: size)
|
||||
}, completion: nil)
|
||||
}
|
||||
|
||||
@available(iOS 11.0, *)
|
||||
override public func viewLayoutMarginsDidChange() {
|
||||
super.viewLayoutMarginsDidChange()
|
||||
override func viewWillLayoutSubviews() {
|
||||
super.viewWillLayoutSubviews()
|
||||
self.updateLayout(with: self.view.frame.size)
|
||||
}
|
||||
|
||||
func updateLayout(with size: CGSize) {
|
||||
self.tableView.frame = CGRect.init(origin: CGPoint.zero, size: size)
|
||||
self.tableView.frame = CGRect.init(x: 0, y: 0, width: size.width, height: size.height)
|
||||
}
|
||||
|
||||
@objc func dismissAction() {
|
||||
|
||||
@@ -51,6 +51,7 @@ let controller = UIViewController()
|
||||
let transitionDelegate = SPStorkTransitioningDelegate()
|
||||
controller.transitioningDelegate = transitionDelegate
|
||||
controller.modalPresentationStyle = .custom
|
||||
controller.modalPresentationCapturesStatusBarAppearance = true
|
||||
self.present(controller, animated: true, completion: nil)
|
||||
```
|
||||
|
||||
@@ -82,26 +83,31 @@ class ModalViewController: UIViewController {
|
||||
override var preferredStatusBarStyle: UIStatusBarStyle {
|
||||
return .lightContent
|
||||
}
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
self.modalPresentationCapturesStatusBarAppearance = true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Parameters
|
||||
|
||||
- Parameter `isSwipeToDismissEnabled` enables dismissal by swipe gesture. Default is `true`:
|
||||
|
||||
- Parameter `customHeight` sets custom height for modal controller. Default is `nil`:
|
||||
```swift
|
||||
transitionDelegate.isSwipeToDismissEnabled = true
|
||||
transitionDelegate.customHeight = 350
|
||||
```
|
||||
|
||||
- Parameter `isTapAroundToDismissEnabled` enables dismissal by tapping parent controller. Default is `true`:
|
||||
- Parameter `swipeToDismissEnabled` enables dismissal by swipe gesture. Default is `true`:
|
||||
|
||||
```swift
|
||||
transitionDelegate.isTapAroundToDismissEnabled = true
|
||||
transitionDelegate.swipeToDismissEnabled = true
|
||||
```
|
||||
|
||||
- Parameter `translateForDismiss` sets how much need to swipe down to close the controller. Work only if `swipeToDismissEnabled` is true. Default is `240`:
|
||||
```swift
|
||||
transitionDelegate.translateForDismiss = 100
|
||||
```
|
||||
|
||||
- Parameter `tapAroundToDismissEnabled` enables dismissal by tapping parent controller. Default is `true`:
|
||||
|
||||
```swift
|
||||
transitionDelegate.tapAroundToDismissEnabled = true
|
||||
```
|
||||
|
||||
- Parameter `showIndicator` shows or hides top arrow indicator. Default is `true`:
|
||||
@@ -114,11 +120,6 @@ transitionDelegate.showIndicator = true
|
||||
transitionDelegate.indicatorColor = UIColor.white
|
||||
```
|
||||
|
||||
- Parameter `customHeight` sets custom height for modal controller. Default is `nil`:
|
||||
```swift
|
||||
transitionDelegate.customHeight = 350
|
||||
```
|
||||
|
||||
### Snapshots
|
||||
|
||||
The project uses a snapshot of the screen in order to avoid compatibility and customization issues. Before controller presentation, a snapshot of the parent view is made, and size and position are changed for the snapshot. Sometimes you will need to update the screenshot of the parent view, for that use static func:
|
||||
@@ -165,7 +166,7 @@ pod 'SparrowKit'
|
||||
|
||||
### Working with UIScrollView
|
||||
|
||||
If you use `UIScrollView` (or UITableView & UICollectionView) on your controller, I recommend making it more interactive. When scrolling reaches the top position, the controller will interactively drag down, simulating a closing animation. To do this, set the delegate and in the function `scrollViewDidScroll` call:
|
||||
If you use `UIScrollView` (or UITableView & UICollectionView) on your controller, I recommend making it more interactive. When scrolling reaches the top position, the controller will interactively drag down, simulating a closing animation. Also available close controller by drag down on `UIScrollView`. To do this, set the delegate and in the function `scrollViewDidScroll` call:
|
||||
|
||||
```swift
|
||||
func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
||||
@@ -177,17 +178,14 @@ func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
||||
|
||||
Working with a collections classes is not difficult. In the `Example` folder you can find an implementation. However, I will give a couple of tips for making the table look better.
|
||||
|
||||
Firstly, if you use `SPFakeBarView`, don't forget to set top insets for content & scroll indicator. Also, I recommend setting bottom insets:
|
||||
Firstly, if you use `SPFakeBarView`, don't forget to set top insets for content & scroll indicator. Also, I recommend setting bottom insets (it optional):
|
||||
|
||||
```swift
|
||||
tableView.contentInset.top = self.navBar.height
|
||||
tableView.scrollIndicatorInsets.top = self.navBar.height
|
||||
|
||||
tableView.contentInset.bottom = self.safeAreaInsets.bottom
|
||||
tableView.scrollIndicatorInsets.bottom = self.safeAreaInsets.bottom
|
||||
```
|
||||
|
||||
Please, also use `SPStorkController.scrollViewDidScroll()` function in delegate for more interactiveness with your collection or table view
|
||||
Please, also use `SPStorkController.scrollViewDidScroll` function in scroll delegate for more interactiveness with your collection or table view.
|
||||
|
||||
### Modal presentation of different controller
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "SPStorkController"
|
||||
s.version = "1.4"
|
||||
s.version = "1.5"
|
||||
s.summary = "Modal controller as mail or Apple music application"
|
||||
s.homepage = "https://github.com/IvanVorobei/SPStorkController"
|
||||
s.source = { :git => "https://github.com/IvanVorobei/SPStorkController.git", :tag => s.version }
|
||||
|
||||
Regular → Executable
+17
-2
@@ -28,13 +28,28 @@ public struct SPStorkController {
|
||||
if let presentationController = controller.presentationController as? SPStorkPresentationController {
|
||||
let translation = -(scrollView.contentOffset.y + scrollView.contentInset.top)
|
||||
if translation >= 0 {
|
||||
|
||||
if controller.isBeingPresented { return }
|
||||
|
||||
scrollView.subviews.forEach {
|
||||
$0.transform = CGAffineTransform(translationX: 0, y: -translation)
|
||||
}
|
||||
if presentationController.pan?.state != UIGestureRecognizer.State.changed {
|
||||
presentationController.scrollViewDidScroll(translation)
|
||||
|
||||
presentationController.setIndicator(style: scrollView.isTracking ? .line : .arrow)
|
||||
|
||||
if translation >= presentationController.translateForDismiss * 0.4 {
|
||||
if !scrollView.isTracking && !scrollView.isDragging {
|
||||
presentationController.presentedViewController.dismiss(animated: true, completion: nil)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if presentationController.pan?.state != UIGestureRecognizer.State.changed {
|
||||
presentationController.scrollViewDidScroll(translation * 2)
|
||||
}
|
||||
|
||||
} else {
|
||||
presentationController.setIndicator(style: .arrow)
|
||||
presentationController.scrollViewDidScroll(0)
|
||||
}
|
||||
}
|
||||
|
||||
Regular → Executable
Regular → Executable
Regular → Executable
+27
-16
@@ -23,11 +23,13 @@ import UIKit
|
||||
|
||||
class SPStorkPresentationController: UIPresentationController, UIGestureRecognizerDelegate {
|
||||
|
||||
var isSwipeToDismissEnabled: Bool = true
|
||||
var isTapAroundToDismissEnabled: Bool = true
|
||||
var swipeToDismissEnabled: Bool = true
|
||||
var tapAroundToDismissEnabled: Bool = true
|
||||
var showIndicator: Bool = true
|
||||
var indicatorColor: UIColor = UIColor.init(red: 202/255, green: 201/255, blue: 207/255, alpha: 1)
|
||||
var customHeight: CGFloat? = nil
|
||||
var translateForDismiss: CGFloat = 200
|
||||
|
||||
var transitioningDelegate: SPStorkTransitioningDelegate?
|
||||
|
||||
var pan: UIPanGestureRecognizer?
|
||||
@@ -84,7 +86,7 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
|
||||
|
||||
if self.showIndicator {
|
||||
self.indicatorView.color = self.indicatorColor
|
||||
let tap = UITapGestureRecognizer.init(target: self, action: #selector(self.handleTap))
|
||||
let tap = UITapGestureRecognizer.init(target: self, action: #selector(self.dismissAction))
|
||||
tap.cancelsTouchesInView = false
|
||||
self.indicatorView.addGestureRecognizer(tap)
|
||||
presentedView.addSubview(self.indicatorView)
|
||||
@@ -133,8 +135,9 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
|
||||
containerView.insertSubview(snapshotView, aboveSubview: self.backgroundView)
|
||||
snapshotView.frame = initialFrame
|
||||
snapshotView.transform = transformForSnapshotView
|
||||
snapshotView.alpha = self.alpha
|
||||
snapshotView.alpha = 1 - self.alpha
|
||||
snapshotView.layer.cornerRadius = self.cornerRadius
|
||||
snapshotView.contentMode = .top
|
||||
snapshotView.layer.masksToBounds = true
|
||||
rootSnapshotView = snapshotView
|
||||
|
||||
@@ -169,13 +172,13 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
|
||||
self.snapshotViewContainer.centerXAnchor.constraint(equalTo: containerView.centerXAnchor).isActive = true
|
||||
self.updateSnapshotAspectRatio()
|
||||
|
||||
if self.isTapAroundToDismissEnabled {
|
||||
self.tap = UITapGestureRecognizer.init(target: self, action: #selector(self.handleTap))
|
||||
if self.tapAroundToDismissEnabled {
|
||||
self.tap = UITapGestureRecognizer.init(target: self, action: #selector(self.dismissAction))
|
||||
self.tap?.cancelsTouchesInView = false
|
||||
self.snapshotViewContainer.addGestureRecognizer(self.tap!)
|
||||
}
|
||||
|
||||
if self.isSwipeToDismissEnabled {
|
||||
if self.swipeToDismissEnabled {
|
||||
self.pan = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan))
|
||||
self.pan!.delegate = self
|
||||
self.pan!.maximumNumberOfTouches = 1
|
||||
@@ -184,7 +187,9 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
|
||||
}
|
||||
}
|
||||
|
||||
@objc func handleTap() {
|
||||
@objc func dismissAction() {
|
||||
self.presentingViewController.view.endEditing(true)
|
||||
self.presentedViewController.view.endEditing(true)
|
||||
self.presentedViewController.dismiss(animated: true, completion: nil)
|
||||
}
|
||||
|
||||
@@ -223,6 +228,7 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
|
||||
containerView.insertSubview(snapshotView, aboveSubview: backgroundView)
|
||||
snapshotView.frame = initialFrame
|
||||
snapshotView.transform = initialTransform
|
||||
snapshotView.contentMode = .top
|
||||
rootSnapshotView = snapshotView
|
||||
snapshotView.layer.cornerRadius = self.cornerRadius
|
||||
snapshotView.layer.masksToBounds = true
|
||||
@@ -230,7 +236,7 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
|
||||
let snapshotRoundedView = UIView()
|
||||
snapshotRoundedView.layer.cornerRadius = self.cornerRadius
|
||||
snapshotRoundedView.layer.masksToBounds = true
|
||||
snapshotRoundedView.backgroundColor = UIColor.black.withAlphaComponent(1 - self.alpha)
|
||||
snapshotRoundedView.backgroundColor = UIColor.black.withAlphaComponent(self.alpha)
|
||||
containerView.insertSubview(snapshotRoundedView, aboveSubview: snapshotView)
|
||||
snapshotRoundedView.frame = initialFrame
|
||||
snapshotRoundedView.transform = initialTransform
|
||||
@@ -266,7 +272,7 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
|
||||
extension SPStorkPresentationController {
|
||||
|
||||
@objc func handlePan(gestureRecognizer: UIPanGestureRecognizer) {
|
||||
guard gestureRecognizer.isEqual(pan), self.isSwipeToDismissEnabled else { return }
|
||||
guard gestureRecognizer.isEqual(self.pan), self.swipeToDismissEnabled else { return }
|
||||
|
||||
switch gestureRecognizer.state {
|
||||
case .began:
|
||||
@@ -278,7 +284,7 @@ extension SPStorkPresentationController {
|
||||
gestureRecognizer.setTranslation(CGPoint(x: 0, y: 0), in: containerView)
|
||||
case .changed:
|
||||
self.workGester = true
|
||||
if self.isSwipeToDismissEnabled {
|
||||
if self.swipeToDismissEnabled {
|
||||
let translation = gestureRecognizer.translation(in: presentedView)
|
||||
self.updatePresentedViewForTranslation(inVerticalDirection: translation.y)
|
||||
} else {
|
||||
@@ -287,8 +293,8 @@ extension SPStorkPresentationController {
|
||||
case .ended:
|
||||
self.workGester = false
|
||||
let translation = gestureRecognizer.translation(in: presentedView).y
|
||||
if translation >= 240 {
|
||||
presentedViewController.dismiss(animated: true, completion: nil)
|
||||
if translation >= self.translateForDismiss {
|
||||
self.presentedViewController.dismiss(animated: true, completion: nil)
|
||||
} else {
|
||||
self.indicatorView.style = .arrow
|
||||
UIView.animate(
|
||||
@@ -319,6 +325,10 @@ extension SPStorkPresentationController {
|
||||
self.updateSnapshot()
|
||||
}
|
||||
|
||||
func setIndicator(style: SPStorkIndicatorView.Style) {
|
||||
self.indicatorView.style = style
|
||||
}
|
||||
|
||||
private func updatePresentedViewForTranslation(inVerticalDirection translation: CGFloat) {
|
||||
if self.startDismissing { return }
|
||||
|
||||
@@ -338,9 +348,10 @@ extension SPStorkPresentationController {
|
||||
|
||||
self.presentedView?.transform = CGAffineTransform(translationX: 0, y: translationForModal)
|
||||
|
||||
let factor = 1 + (translationForModal / 6000)
|
||||
self.snapshotView?.transform = CGAffineTransform.init(scaleX: factor, y: factor)
|
||||
self.gradeView.alpha = self.alpha - ((factor - 1) * 15)
|
||||
let scaleFactor = 1 + (translationForModal / 5000)
|
||||
self.snapshotView?.transform = CGAffineTransform.init(scaleX: scaleFactor, y: scaleFactor)
|
||||
let gradeFactor = 1 + (translationForModal / 7000)
|
||||
self.gradeView.alpha = self.alpha - ((gradeFactor - 1) * 15)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Regular → Executable
+4
-5
@@ -25,15 +25,14 @@ final class SPStorkPresentingAnimationController: NSObject, UIViewControllerAnim
|
||||
|
||||
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
|
||||
|
||||
guard let presentedViewController = transitionContext.viewController(forKey: .to) else {
|
||||
return
|
||||
}
|
||||
guard let presentedViewController = transitionContext.viewController(forKey: .to) else { return }
|
||||
|
||||
let containerView = transitionContext.containerView
|
||||
containerView.addSubview(presentedViewController.view)
|
||||
presentedViewController.view.frame = CGRect(x: 0, y: containerView.bounds.height, width: containerView.bounds.width, height: containerView.bounds.height)
|
||||
|
||||
|
||||
let finalFrameForPresentedView = transitionContext.finalFrame(for: presentedViewController)
|
||||
presentedViewController.view.frame = finalFrameForPresentedView
|
||||
presentedViewController.view.frame.origin.y = containerView.bounds.height
|
||||
|
||||
UIView.animate(
|
||||
withDuration: transitionDuration(using: transitionContext),
|
||||
|
||||
Regular → Executable
+6
-4
@@ -23,19 +23,21 @@ import UIKit
|
||||
|
||||
public final class SPStorkTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate {
|
||||
|
||||
public var isSwipeToDismissEnabled: Bool = true
|
||||
public var isTapAroundToDismissEnabled: Bool = true
|
||||
public var swipeToDismissEnabled: Bool = true
|
||||
public var tapAroundToDismissEnabled: Bool = true
|
||||
public var showIndicator: Bool = true
|
||||
public var indicatorColor: UIColor = UIColor.init(red: 202/255, green: 201/255, blue: 207/255, alpha: 1)
|
||||
public var customHeight: CGFloat? = nil
|
||||
public var translateForDismiss: CGFloat = 200
|
||||
|
||||
public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
|
||||
let controller = SPStorkPresentationController(presentedViewController: presented, presenting: presenting)
|
||||
controller.isSwipeToDismissEnabled = self.isSwipeToDismissEnabled
|
||||
controller.isTapAroundToDismissEnabled = self.isTapAroundToDismissEnabled
|
||||
controller.swipeToDismissEnabled = self.swipeToDismissEnabled
|
||||
controller.tapAroundToDismissEnabled = self.tapAroundToDismissEnabled
|
||||
controller.showIndicator = self.showIndicator
|
||||
controller.indicatorColor = self.indicatorColor
|
||||
controller.customHeight = self.customHeight
|
||||
controller.translateForDismiss = self.translateForDismiss
|
||||
controller.transitioningDelegate = self
|
||||
return controller
|
||||
}
|
||||
|
||||
Regular → Executable
+3
-1
@@ -29,10 +29,12 @@ extension UIViewController {
|
||||
&& presentingViewController != nil
|
||||
}
|
||||
|
||||
public func presentAsStork(_ controller: UIViewController, complection: (() -> Void)? = nil) {
|
||||
public func presentAsStork(_ controller: UIViewController, height: CGFloat? = nil, complection: (() -> Void)? = nil) {
|
||||
let transitionDelegate = SPStorkTransitioningDelegate()
|
||||
transitionDelegate.customHeight = height
|
||||
controller.transitioningDelegate = transitionDelegate
|
||||
controller.modalPresentationStyle = .custom
|
||||
controller.modalPresentationCapturesStatusBarAppearance = true
|
||||
self.present(controller, animated: true, completion: complection)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user