Commit 7aee3d67 by Daniel Dahan

development: updated PresenterCard to use mathematical layout rather than…

development: updated PresenterCard to use mathematical layout rather than AutoLayout for performance reasons
parent 34e53600
......@@ -35,12 +35,12 @@ extension Animation {
:name: backgroundColor
*/
public static func backgroundColor(color: UIColor, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "backgroundColor")
let animation = CABasicAnimation(keyPath: "backgroundColor")
animation.toValue = color.cgColor
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......@@ -50,12 +50,12 @@ extension Animation {
:name: cornerRadius
*/
public static func cornerRadius(radius: CGFloat, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "cornerRadius")
let animation = CABasicAnimation(keyPath: "cornerRadius")
animation.toValue = radius
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......@@ -65,12 +65,12 @@ extension Animation {
:name: translation
*/
public static func transform(transform: CATransform3D, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "transform")
let animation = CABasicAnimation(keyPath: "transform")
animation.toValue = NSValue(caTransform3D: transform)
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......@@ -80,7 +80,7 @@ extension Animation {
:name: rotate
*/
public static func rotate(angle: CGFloat? = nil, rotation: CGFloat? = nil, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation")
let animation = CABasicAnimation(keyPath: "transform.rotation")
if let v: CGFloat = angle {
animation.toValue = (CGFloat(M_PI) * v / 180) as NSNumber
} else if let v: CGFloat = rotation {
......@@ -89,7 +89,7 @@ extension Animation {
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......@@ -99,7 +99,7 @@ extension Animation {
:name: rotateX
*/
public static func rotateX(angle: CGFloat? = nil, rotation: CGFloat? = nil, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.x")
let animation = CABasicAnimation(keyPath: "transform.rotation.x")
if let v: CGFloat = angle {
animation.toValue = (CGFloat(M_PI) * v / 180) as NSNumber
} else if let v: CGFloat = rotation {
......@@ -108,7 +108,7 @@ extension Animation {
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......@@ -118,7 +118,7 @@ extension Animation {
:name: rotateY
*/
public static func rotateY(angle: CGFloat? = nil, rotation: CGFloat? = nil, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.y")
let animation = CABasicAnimation(keyPath: "transform.rotation.y")
if let v: CGFloat = angle {
animation.toValue = (CGFloat(M_PI) * v / 180) as NSNumber
} else if let v: CGFloat = rotation {
......@@ -127,7 +127,7 @@ extension Animation {
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......@@ -137,7 +137,7 @@ extension Animation {
:name: rotateZ
*/
public static func rotateZ(angle: CGFloat? = nil, rotation: CGFloat? = nil, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
let animation = CABasicAnimation(keyPath: "transform.rotation.z")
if let v: CGFloat = angle {
animation.toValue = (CGFloat(M_PI) * v / 180) as NSNumber
} else if let v: CGFloat = rotation {
......@@ -146,7 +146,7 @@ extension Animation {
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......@@ -156,12 +156,12 @@ extension Animation {
:name: scale
*/
public static func scale(scale: CGFloat, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "transform.scale")
let animation = CABasicAnimation(keyPath: "transform.scale")
animation.toValue = scale as NSNumber
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......@@ -171,12 +171,12 @@ extension Animation {
:name: scaleX
*/
public static func scaleX(scale: CGFloat, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "transform.scale.x")
let animation = CABasicAnimation(keyPath: "transform.scale.x")
animation.toValue = scale as NSNumber
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......@@ -186,12 +186,12 @@ extension Animation {
:name: scaleY
*/
public static func scaleY(scale: CGFloat, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "transform.scale.y")
let animation = CABasicAnimation(keyPath: "transform.scale.y")
animation.toValue = scale as NSNumber
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......@@ -201,12 +201,12 @@ extension Animation {
:name: scaleZ
*/
public static func scaleZ(scale: CGFloat, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "transform.scale.z")
let animation = CABasicAnimation(keyPath: "transform.scale.z")
animation.toValue = scale as NSNumber
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......@@ -216,12 +216,12 @@ extension Animation {
:name: translate
*/
public static func translate(translation: CGSize, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "transform.translation")
let animation = CABasicAnimation(keyPath: "transform.translation")
animation.toValue = NSValue(cgSize: translation)
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......@@ -231,12 +231,12 @@ extension Animation {
:name: translateX
*/
public static func translateX(translation: CGFloat, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "transform.translation.x")
let animation = CABasicAnimation(keyPath: "transform.translation.x")
animation.toValue = translation as NSNumber
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......@@ -246,12 +246,12 @@ extension Animation {
:name: translateY
*/
public static func translateY(translation: CGFloat, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "transform.translation.y")
let animation = CABasicAnimation(keyPath: "transform.translation.y")
animation.toValue = translation as NSNumber
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......@@ -261,12 +261,12 @@ extension Animation {
:name: translateZ
*/
public static func translateZ(translation: CGFloat, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "transform.translation.z")
let animation = CABasicAnimation(keyPath: "transform.translation.z")
animation.toValue = translation as NSNumber
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......@@ -276,24 +276,24 @@ extension Animation {
:name: position
*/
public static func position(point: CGPoint, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "position")
let animation = CABasicAnimation(keyPath: "position")
animation.toValue = NSValue(cgPoint: point)
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
}
public static func shadowPath(path: CGPath, duration: CFTimeInterval? = nil) -> CABasicAnimation {
let animation: CABasicAnimation = CABasicAnimation(keyPath: "shadowPath")
let animation = CABasicAnimation(keyPath: "shadowPath")
animation.toValue = path
animation.fillMode = AnimationFillModeToValue(mode: .forwards)
animation.isRemovedOnCompletion = false
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
if let v: CFTimeInterval = duration {
if let v = duration {
animation.duration = v
}
return animation
......
......@@ -172,6 +172,7 @@ open class Button: UIButton {
layoutShape()
layoutVisualLayer()
}
open override func layoutSubviews() {
super.layoutSubviews()
layoutShadowPath()
......
......@@ -71,6 +71,9 @@ open class Card: PulseView {
open var toolbar: Toolbar? {
didSet {
oldValue?.removeFromSuperview()
if let v = toolbar {
container.addSubview(v)
}
layoutSubviews()
}
}
......@@ -95,6 +98,10 @@ open class Card: PulseView {
open var contentView: UIView? {
didSet {
oldValue?.removeFromSuperview()
if let v = contentView {
v.clipsToBounds = true
container.addSubview(v)
}
layoutSubviews()
}
}
......@@ -119,6 +126,9 @@ open class Card: PulseView {
open var bottomBar: Bar? {
didSet {
oldValue?.removeFromSuperview()
if let v = bottomBar {
container.addSubview(v)
}
layoutSubviews()
}
}
......@@ -169,12 +179,15 @@ open class Card: PulseView {
self.init(frame: .zero)
prepareProperties(toolbar: toolbar, contentView: contentView, bottomBar: bottomBar)
}
open override func layoutSubviews() {
super.layoutSubviews()
guard willLayout else {
return
}
container.width = width
reload()
}
......@@ -256,6 +269,37 @@ open class Card: PulseView {
}
/**
Prepare the view size from a given top position.
- Parameter view: A UIView.
- Parameter edge insets: An EdgeInsets.
- Parameter from top: A CGFloat.
- Returns: A CGFloat.
*/
open func prepare(view: UIView?, with insets: EdgeInsets, from top: CGFloat) -> CGFloat {
guard let v = view else {
return top
}
let t = insets.top + top
v.y = t
v.x = insets.left
let w = container.width - insets.left - insets.right
var h = v.height
if 0 == h {
(v as? UILabel)?.sizeToFit()
h = v.sizeThatFits(CGSize(width: w, height: CGFloat.greatestFiniteMagnitude)).height
}
v.width = w
v.height = h
return t + h + insets.bottom
}
/**
A preparation method that sets the base UI elements.
- Parameter toolbar: An optional Toolbar.
- Parameter contentView: An optional UIView.
......@@ -270,6 +314,6 @@ open class Card: PulseView {
/// Prepares the container.
private func prepareContainer() {
container.clipsToBounds = true
layout(container).edges()
addSubview(container)
}
}
......@@ -237,7 +237,7 @@ public class Grid {
canvas.addSubview(v)
}
// Forces the views to adjust accordingly to size changes, ie: UILabel.
// Forces the view to adjust accordingly to size changes, ie: UILabel.
(v as? UILabel)?.sizeToFit()
switch axis.direction {
......
......@@ -83,7 +83,7 @@ internal class MaterialLayer {
}
/// Enables automatic shadowPath sizing.
internal var isShadowPathAutoSizing = true
internal var isShadowPathAutoSizing = false
/**
Initializer that takes in a CALayer.
......@@ -315,7 +315,13 @@ extension CALayer {
guard isShadowPathAutoSizing else {
return
}
shadowPath = .none == depthPreset ? nil : UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius).cgPath
z
if .none == depthPreset {
shadowPath = nil
} else if nil == shadowPath {
shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius).cgPath
} else {
animate(animation: Animation.shadowPath(path: UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius).cgPath, duration: 0))
}
}
}
......@@ -52,55 +52,23 @@ open class PresenterCard: Card {
open var presenterView: UIView? {
didSet {
oldValue?.removeFromSuperview()
if let v = presenterView {
v.clipsToBounds = true
container.addSubview(v)
}
layoutSubviews()
}
}
open override func reload() {
var top: CGFloat = 0
var bottom: CGFloat = 0
container.removeConstraints(container.constraints)
if let v = toolbar {
top += toolbarEdgeInsets.top
container.layout(v).top(top).left(toolbarEdgeInsets.left).right(toolbarEdgeInsets.right).height(v.height)
top += v.height + toolbarEdgeInsets.bottom
}
top = prepare(view: toolbar, with: toolbarEdgeInsets, from: top)
top = prepare(view: presenterView, with: presenterViewEdgeInsets, from: top)
top = prepare(view: contentView, with: contentViewEdgeInsets, from: top)
top = prepare(view: bottomBar, with: bottomBarEdgeInsets, from: top)
if let v = presenterView {
top += presenterViewEdgeInsets.top
container.layout(v).top(top).left(presenterViewEdgeInsets.left).right(presenterViewEdgeInsets.right)
top += v.height + presenterViewEdgeInsets.bottom
}
//
// if let v = contentView {
// top += contentViewEdgeInsets.top
// container.layout(v).top(top).left(contentViewEdgeInsets.left).right(contentViewEdgeInsets.right)
// top += v.height + contentViewEdgeInsets.bottom
// }
//
// if let v = bottomBar {
// top += bottomBarEdgeInsets.top
// container.layout(v).top(top).left(bottomBarEdgeInsets.left).right(bottomBarEdgeInsets.right).bottom(bottomBarEdgeInsets.bottom)
// bottom += v.height + bottomBarEdgeInsets.top + bottomBarEdgeInsets.bottom
// }
//
// if let v = contentView {
// bottom += contentViewEdgeInsets.bottom
// container.layout(v).bottom(bottom)
// bottom += v.height + contentViewEdgeInsets.top
// }
//
// if let v = presenterView {
// bottom += presenterViewEdgeInsets.bottom
// container.layout(v).bottom(bottom)
// bottom += v.height + presenterViewEdgeInsets.top
// }
//
// if let v = toolbar {
// bottom += toolbarEdgeInsets.bottom
// container.layout(v).bottom(bottom)
// }
container.height = top
height = top
}
}
......@@ -122,6 +122,7 @@ open class TabBar: Bar {
line.height = value
}
}
open override func layoutSubviews() {
super.layoutSubviews()
guard willLayout else {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment