Fix wallet appearance

This commit is contained in:
Ali 2019-11-09 02:45:18 +04:00
parent 536df22d0f
commit e1df955cca
7 changed files with 97 additions and 44 deletions

View File

@ -706,7 +706,11 @@ final class AppDelegate: NSObject, UIApplicationDelegate {
self.walletContext = walletContext self.walletContext = walletContext
let beginWithController: (ViewController) -> Void = { controller in let beginWithController: (ViewController) -> Void = { controller in
let begin: (Bool) -> Void = { animated in
navigationController.setViewControllers([controller], animated: false) navigationController.setViewControllers([controller], animated: false)
if animated {
navigationController.viewControllers.last?.view.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3)
}
var previousBlockchainName = initialConfigBlockchainName var previousBlockchainName = initialConfigBlockchainName
@ -735,6 +739,15 @@ final class AppDelegate: NSObject, UIApplicationDelegate {
}) })
} }
if let splashScreen = navigationController.viewControllers.first as? WalletApplicationSplashScreen, let _ = controller as? WalletSplashScreen {
splashScreen.animateOut(completion: {
begin(true)
})
} else {
begin(false)
}
}
let _ = (combineLatest(queue: .mainQueue(), let _ = (combineLatest(queue: .mainQueue(),
walletContext.storage.getWalletRecords(), walletContext.storage.getWalletRecords(),
walletContext.keychain.encryptionPublicKey() walletContext.keychain.encryptionPublicKey()

View File

@ -1766,7 +1766,7 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture
}, node: { }, node: {
assert(Queue.mainQueue().isCurrent()) assert(Queue.mainQueue().isCurrent())
return referenceNode.syncWith({ $0 })! return referenceNode.syncWith({ $0 })!
}, params: ListViewItemLayoutParams(width: state.visibleSize.width, leftInset: state.insets.left, rightInset: state.insets.right), previousItem: index == 0 ? nil : self.items[index - 1], nextItem: index == self.items.count - 1 ? nil : self.items[index + 1], animation: updateAnimation, completion: { layout, apply in }, params: ListViewItemLayoutParams(width: state.visibleSize.width, leftInset: state.insets.left, rightInset: state.insets.right, availableHeight: state.visibleSize.height - state.insets.top - state.insets.bottom), previousItem: index == 0 ? nil : self.items[index - 1], nextItem: index == self.items.count - 1 ? nil : self.items[index + 1], animation: updateAnimation, completion: { layout, apply in
var updatedState = state var updatedState = state
var updatedOperations = operations var updatedOperations = operations
@ -1841,7 +1841,7 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture
let index = insertionItemIndexAndDirection.0 let index = insertionItemIndexAndDirection.0
let threadId = pthread_self() let threadId = pthread_self()
var tailRecurse = false var tailRecurse = false
self.nodeForItem(synchronous: synchronous, synchronousLoads: synchronousLoads, item: self.items[index], previousNode: previousNodes[index], index: index, previousItem: index == 0 ? nil : self.items[index - 1], nextItem: self.items.count == index + 1 ? nil : self.items[index + 1], params: ListViewItemLayoutParams(width: state.visibleSize.width, leftInset: state.insets.left, rightInset: state.insets.right), updateAnimation: updateAnimation, completion: { (node, layout, apply) in self.nodeForItem(synchronous: synchronous, synchronousLoads: synchronousLoads, item: self.items[index], previousNode: previousNodes[index], index: index, previousItem: index == 0 ? nil : self.items[index - 1], nextItem: self.items.count == index + 1 ? nil : self.items[index + 1], params: ListViewItemLayoutParams(width: state.visibleSize.width, leftInset: state.insets.left, rightInset: state.insets.right, availableHeight: state.visibleSize.height - state.insets.top - state.insets.bottom), updateAnimation: updateAnimation, completion: { (node, layout, apply) in
if pthread_equal(pthread_self(), threadId) != 0 && !tailRecurse { if pthread_equal(pthread_self(), threadId) != 0 && !tailRecurse {
tailRecurse = true tailRecurse = true
@ -1877,7 +1877,7 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture
} else { } else {
let updateItem = updateIndicesAndItems[0] let updateItem = updateIndicesAndItems[0]
if let previousNode = previousNodes[updateItem.index] { if let previousNode = previousNodes[updateItem.index] {
self.nodeForItem(synchronous: synchronous, synchronousLoads: synchronousLoads, item: updateItem.item, previousNode: previousNode, index: updateItem.index, previousItem: updateItem.index == 0 ? nil : self.items[updateItem.index - 1], nextItem: updateItem.index == (self.items.count - 1) ? nil : self.items[updateItem.index + 1], params: ListViewItemLayoutParams(width: state.visibleSize.width, leftInset: state.insets.left, rightInset: state.insets.right), updateAnimation: animated ? .System(duration: insertionAnimationDuration) : .None, completion: { _, layout, apply in self.nodeForItem(synchronous: synchronous, synchronousLoads: synchronousLoads, item: updateItem.item, previousNode: previousNode, index: updateItem.index, previousItem: updateItem.index == 0 ? nil : self.items[updateItem.index - 1], nextItem: updateItem.index == (self.items.count - 1) ? nil : self.items[updateItem.index + 1], params: ListViewItemLayoutParams(width: state.visibleSize.width, leftInset: state.insets.left, rightInset: state.insets.right, availableHeight: state.visibleSize.height - state.insets.top - state.insets.bottom), updateAnimation: animated ? .System(duration: insertionAnimationDuration) : .None, completion: { _, layout, apply in
state.updateNodeAtItemIndex(updateItem.index, layout: layout, direction: updateItem.directionHint, animation: animated ? .System(duration: insertionAnimationDuration) : .None, apply: apply, operations: &operations) state.updateNodeAtItemIndex(updateItem.index, layout: layout, direction: updateItem.directionHint, animation: animated ? .System(duration: insertionAnimationDuration) : .None, apply: apply, operations: &operations)
updateIndicesAndItems.remove(at: 0) updateIndicesAndItems.remove(at: 0)

View File

@ -73,11 +73,13 @@ public struct ListViewItemLayoutParams {
public let width: CGFloat public let width: CGFloat
public let leftInset: CGFloat public let leftInset: CGFloat
public let rightInset: CGFloat public let rightInset: CGFloat
public let availableHeight: CGFloat
public init(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat) { public init(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, availableHeight: CGFloat) {
self.width = width self.width = width
self.leftInset = leftInset self.leftInset = leftInset
self.rightInset = rightInset self.rightInset = rightInset
self.availableHeight = availableHeight
} }
} }

View File

@ -78,7 +78,7 @@ class WalletAmountItemNode: ListViewItemNode, UITextFieldDelegate, ItemListItemN
private let measureNode: TextNode private let measureNode: TextNode
private var item: WalletAmountItem? private var item: WalletAmountItem?
private var validLayout: (CGFloat, CGFloat, CGFloat)? private var validLayout: (CGFloat, CGFloat, CGFloat, CGFloat)?
var tag: ItemListItemTag? { var tag: ItemListItemTag? {
return self.item?.tag return self.item?.tag
@ -166,7 +166,7 @@ class WalletAmountItemNode: ListViewItemNode, UITextFieldDelegate, ItemListItemN
return return
} }
let makeInputFieldLayout = self.inputFieldAsyncLayout() let makeInputFieldLayout = self.inputFieldAsyncLayout()
let (_, _, inputFieldApply) = makeInputFieldLayout(item, ListViewItemLayoutParams(width: validLayout.0, leftInset: validLayout.1, rightInset: validLayout.2)) let (_, _, inputFieldApply) = makeInputFieldLayout(item, ListViewItemLayoutParams(width: validLayout.0, leftInset: validLayout.1, rightInset: validLayout.2, availableHeight: validLayout.3))
inputFieldApply() inputFieldApply()
} }
@ -196,7 +196,7 @@ class WalletAmountItemNode: ListViewItemNode, UITextFieldDelegate, ItemListItemN
return (layout, { [weak self] in return (layout, { [weak self] in
if let strongSelf = self { if let strongSelf = self {
strongSelf.item = item strongSelf.item = item
strongSelf.validLayout = (params.width, params.leftInset, params.rightInset) strongSelf.validLayout = (params.width, params.leftInset, params.rightInset, params.availableHeight)
if let _ = updatedTheme { if let _ = updatedTheme {
strongSelf.bottomStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor strongSelf.bottomStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor

View File

@ -216,7 +216,7 @@ func walletCreateInvoiceScreen(context: WalletContext, address: String) -> ViewC
} }
return state return state
} }
ensureItemVisibleImpl?(tag, false) ensureItemVisibleImpl?(tag, true)
}, dismissInput: { }, dismissInput: {
dismissInputImpl?() dismissInputImpl?()
}, scrollToBottom: { }, scrollToBottom: {

View File

@ -118,21 +118,16 @@ final class WalletInfoEmptyItemNode: ListViewItemNode {
} }
func asyncLayout() -> (_ item: WalletInfoEmptyItem, _ params: ListViewItemLayoutParams) -> (ListViewItemNodeLayout, () -> Void) { func asyncLayout() -> (_ item: WalletInfoEmptyItem, _ params: ListViewItemLayoutParams) -> (ListViewItemNodeLayout, () -> Void) {
let sideInset: CGFloat = 32.0
let buttonSideInset: CGFloat = 48.0
let iconSpacing: CGFloat = 5.0
let titleSpacing: CGFloat = 19.0
let termsSpacing: CGFloat = 11.0
let buttonHeight: CGFloat = 50.0
let iconSize = CGSize(width: 140.0, height: 140.0)
self.animationNode.updateLayout(size: iconSize)
let makeTitleLayout = TextNode.asyncLayout(self.titleNode) let makeTitleLayout = TextNode.asyncLayout(self.titleNode)
let makeTextLayout = TextNode.asyncLayout(self.textNode) let makeTextLayout = TextNode.asyncLayout(self.textNode)
let makeAddressLayout = TextNode.asyncLayout(self.addressNode) let makeAddressLayout = TextNode.asyncLayout(self.addressNode)
return { [weak self] item, params in return { [weak self] item, params in
var iconSpacing: CGFloat = 5.0
var titleSpacing: CGFloat = 19.0
var iconSize = CGSize(width: 140.0, height: 140.0)
let contentVerticalOrigin: CGFloat = 10.0
let sideInset: CGFloat = 16.0 let sideInset: CGFloat = 16.0
var iconOffset = CGPoint() var iconOffset = CGPoint()
@ -149,14 +144,25 @@ final class WalletInfoEmptyItemNode: ListViewItemNode {
addressString.insert("\n", at: addressString.index(addressString.startIndex, offsetBy: addressString.count / 2)) addressString.insert("\n", at: addressString.index(addressString.startIndex, offsetBy: addressString.count / 2))
let (addressLayout, addressApply) = makeAddressLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: addressString, font: Font.monospace(16.0), textColor: textColor), backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - params.leftInset - params.rightInset - sideInset * 2.0, height: .greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.1, cutout: nil, insets: UIEdgeInsets())) let (addressLayout, addressApply) = makeAddressLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: addressString, font: Font.monospace(16.0), textColor: textColor), backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - params.leftInset - params.rightInset - sideInset * 2.0, height: .greatestFiniteMagnitude), alignment: .center, lineSpacing: 0.1, cutout: nil, insets: UIEdgeInsets()))
let contentVerticalOrigin: CGFloat = 32.0 let availableHeight = params.availableHeight - contentVerticalOrigin * 2.0
let rawContentHeight: CGFloat = iconSize.height + titleLayout.size.height + textLayout.size.height + addressLayout.size.height
let contentSpacing = iconSpacing + titleSpacing + titleSpacing
let contentSpacingFactor = max(0.2, min(1.0, (availableHeight - rawContentHeight) / contentSpacing))
if contentSpacingFactor < 0.25 {
iconSize = CGSize(width: 90.0, height: 90.0)
}
iconSpacing = floor(iconSpacing * contentSpacingFactor)
titleSpacing = floor(titleSpacing * contentSpacingFactor)
let iconFrame = CGRect(origin: CGPoint(x: floor((params.width - iconSize.width) / 2.0), y: contentVerticalOrigin), size: iconSize).offsetBy(dx: iconOffset.x, dy: iconOffset.y) let iconFrame = CGRect(origin: CGPoint(x: floor((params.width - iconSize.width) / 2.0), y: contentVerticalOrigin), size: iconSize).offsetBy(dx: iconOffset.x, dy: iconOffset.y)
let titleFrame = CGRect(origin: CGPoint(x: floor((params.width - titleLayout.size.width) / 2.0), y: iconFrame.maxY + iconSpacing), size: titleLayout.size) let titleFrame = CGRect(origin: CGPoint(x: floor((params.width - titleLayout.size.width) / 2.0), y: iconFrame.maxY + iconSpacing), size: titleLayout.size)
let textFrame = CGRect(origin: CGPoint(x: floor((params.width - textLayout.size.width) / 2.0), y: titleFrame.maxY + titleSpacing), size: textLayout.size) let textFrame = CGRect(origin: CGPoint(x: floor((params.width - textLayout.size.width) / 2.0), y: titleFrame.maxY + titleSpacing), size: textLayout.size)
let addressFrame = CGRect(origin: CGPoint(x: floor((params.width - addressLayout.size.width) / 2.0), y: textFrame.maxY + titleSpacing), size: addressLayout.size) let addressFrame = CGRect(origin: CGPoint(x: floor((params.width - addressLayout.size.width) / 2.0), y: textFrame.maxY + titleSpacing), size: addressLayout.size)
let layout = ListViewItemNodeLayout(contentSize: CGSize(width: params.width, height: (item.loading ? iconFrame.maxY : addressFrame.maxY) + 32.0), insets: UIEdgeInsets()) let layout = ListViewItemNodeLayout(contentSize: CGSize(width: params.width, height: (item.loading ? iconFrame.maxY : addressFrame.maxY) + contentVerticalOrigin), insets: UIEdgeInsets())
return (layout, { return (layout, {
guard let strongSelf = self else { guard let strongSelf = self else {
@ -179,6 +185,8 @@ final class WalletInfoEmptyItemNode: ListViewItemNode {
strongSelf.item = item strongSelf.item = item
strongSelf.animationNode.updateLayout(size: iconSize)
strongSelf.offsetContainer.frame = CGRect(origin: CGPoint(), size: layout.contentSize) strongSelf.offsetContainer.frame = CGRect(origin: CGPoint(), size: layout.contentSize)
let _ = titleApply() let _ = titleApply()

View File

@ -1117,6 +1117,10 @@ private final class WalletApplicationSplashScreenNode: ASDisplayNode {
private let headerBackgroundNode: ASDisplayNode private let headerBackgroundNode: ASDisplayNode
private let headerCornerNode: ASImageNode private let headerCornerNode: ASImageNode
private var isDismissed = false
private var validLayout: (layout: ContainerViewLayout, navigationHeight: CGFloat)?
init(theme: WalletTheme) { init(theme: WalletTheme) {
self.headerBackgroundNode = ASDisplayNode() self.headerBackgroundNode = ASDisplayNode()
self.headerBackgroundNode.backgroundColor = .black self.headerBackgroundNode.backgroundColor = .black
@ -1141,11 +1145,32 @@ private final class WalletApplicationSplashScreenNode: ASDisplayNode {
} }
func containerLayoutUpdated(layout: ContainerViewLayout, navigationHeight: CGFloat, transition: ContainedViewLayoutTransition) { func containerLayoutUpdated(layout: ContainerViewLayout, navigationHeight: CGFloat, transition: ContainedViewLayoutTransition) {
if self.isDismissed {
return
}
self.validLayout = (layout, navigationHeight)
let headerHeight = navigationHeight + 260.0 let headerHeight = navigationHeight + 260.0
transition.updateFrame(node: self.headerBackgroundNode, frame: CGRect(origin: CGPoint(x: -1.0, y: 0), size: CGSize(width: layout.size.width + 2.0, height: headerHeight))) transition.updateFrame(node: self.headerBackgroundNode, frame: CGRect(origin: CGPoint(x: -1.0, y: 0), size: CGSize(width: layout.size.width + 2.0, height: headerHeight)))
transition.updateFrame(node: self.headerCornerNode, frame: CGRect(origin: CGPoint(x: 0.0, y: headerHeight), size: CGSize(width: layout.size.width, height: 10.0))) transition.updateFrame(node: self.headerCornerNode, frame: CGRect(origin: CGPoint(x: 0.0, y: headerHeight), size: CGSize(width: layout.size.width, height: 10.0)))
} }
func animateOut(completion: @escaping () -> Void) {
guard let (layout, navigationHeight) = self.validLayout else {
completion()
return
}
self.isDismissed = true
let transition: ContainedViewLayoutTransition = .animated(duration: 0.4, curve: .spring)
let headerHeight = navigationHeight + 260.0
transition.updateFrame(node: self.headerBackgroundNode, frame: CGRect(origin: CGPoint(x: -1.0, y: -headerHeight - 10.0), size: CGSize(width: layout.size.width + 2.0, height: headerHeight)), completion: { _ in
completion()
})
transition.updateFrame(node: self.headerCornerNode, frame: CGRect(origin: CGPoint(x: 0.0, y: -10.0), size: CGSize(width: layout.size.width, height: 10.0)))
}
} }
public final class WalletApplicationSplashScreen: ViewController { public final class WalletApplicationSplashScreen: ViewController {
@ -1174,4 +1199,9 @@ public final class WalletApplicationSplashScreen: ViewController {
(self.displayNode as! WalletApplicationSplashScreenNode).containerLayoutUpdated(layout: layout, navigationHeight: self.navigationHeight, transition: transition) (self.displayNode as! WalletApplicationSplashScreenNode).containerLayoutUpdated(layout: layout, navigationHeight: self.navigationHeight, transition: transition)
} }
public func animateOut(completion: @escaping () -> Void) {
self.statusBar.statusBarStyle = .Black
(self.displayNode as! WalletApplicationSplashScreenNode).animateOut(completion: completion)
}
} }