diff --git a/Display.xcodeproj/project.pbxproj b/Display.xcodeproj/project.pbxproj index 004d453011..769d03d1ab 100644 --- a/Display.xcodeproj/project.pbxproj +++ b/Display.xcodeproj/project.pbxproj @@ -64,7 +64,6 @@ D05CC3291B69750D00E235A3 /* InteractiveTransitionGestureRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05CC3281B69750D00E235A3 /* InteractiveTransitionGestureRecognizer.swift */; }; D06EE8451B7140FF00837186 /* Font.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06EE8441B7140FF00837186 /* Font.swift */; }; D07921A91B6FC0C0005C23D9 /* KeyboardHostWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07921A81B6FC0C0005C23D9 /* KeyboardHostWindow.swift */; }; - D07921AC1B6FC92B005C23D9 /* StatusBarHostWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07921AB1B6FC92B005C23D9 /* StatusBarHostWindow.swift */; }; D081229D1D19AA1C005F7395 /* ContainerViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = D081229C1D19AA1C005F7395 /* ContainerViewLayout.swift */; }; D08E903A1D24159200533158 /* ActionSheetItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08E90391D24159200533158 /* ActionSheetItem.swift */; }; D08E903C1D2417E000533158 /* ActionSheetButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D08E903B1D2417E000533158 /* ActionSheetButtonItem.swift */; }; @@ -172,7 +171,6 @@ D05CC3281B69750D00E235A3 /* InteractiveTransitionGestureRecognizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InteractiveTransitionGestureRecognizer.swift; sourceTree = ""; }; D06EE8441B7140FF00837186 /* Font.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Font.swift; sourceTree = ""; }; D07921A81B6FC0C0005C23D9 /* KeyboardHostWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyboardHostWindow.swift; sourceTree = ""; }; - D07921AB1B6FC92B005C23D9 /* StatusBarHostWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarHostWindow.swift; sourceTree = ""; }; D081229C1D19AA1C005F7395 /* ContainerViewLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContainerViewLayout.swift; sourceTree = ""; }; D08E90391D24159200533158 /* ActionSheetItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionSheetItem.swift; sourceTree = ""; }; D08E903B1D2417E000533158 /* ActionSheetButtonItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionSheetButtonItem.swift; sourceTree = ""; }; @@ -435,7 +433,6 @@ D07921AA1B6FC911005C23D9 /* Status Bar */ = { isa = PBXGroup; children = ( - D07921AB1B6FC92B005C23D9 /* StatusBarHostWindow.swift */, D0078A671C92B21400DF6D92 /* StatusBar.swift */, D0B3671F1C94A53A00346D2E /* StatusBarProxyNode.swift */, D03E7DFE1C96F7B400C07816 /* StatusBarManager.swift */, @@ -636,7 +633,6 @@ files = ( D08E903C1D2417E000533158 /* ActionSheetButtonItem.swift in Sources */, D0E49C881B83A3580099E553 /* ImageCache.swift in Sources */, - D07921AC1B6FC92B005C23D9 /* StatusBarHostWindow.swift in Sources */, D0078A681C92B21400DF6D92 /* StatusBar.swift in Sources */, D05CC2F81B6955D000E235A3 /* UIViewController+Navigation.m in Sources */, D02BDB021B6AC703008AFAD2 /* RuntimeUtils.swift in Sources */, diff --git a/Display.xcodeproj/xcuserdata/peter.xcuserdatad/xcschemes/xcschememanagement.plist b/Display.xcodeproj/xcuserdata/peter.xcuserdatad/xcschemes/xcschememanagement.plist index 687ccdfc6e..d32d4398d1 100644 --- a/Display.xcodeproj/xcuserdata/peter.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Display.xcodeproj/xcuserdata/peter.xcuserdatad/xcschemes/xcschememanagement.plist @@ -12,7 +12,7 @@ DisplayTests.xcscheme orderHint - 18 + 19 SuppressBuildableAutocreation diff --git a/Display/ASTransformLayerNode.swift b/Display/ASTransformLayerNode.swift index 14c16e15c8..72c5ef9729 100644 --- a/Display/ASTransformLayerNode.swift +++ b/Display/ASTransformLayerNode.swift @@ -26,7 +26,7 @@ class ASTransformLayer: CATransformLayer { } class ASTransformView: UIView { - override class func layerClass() -> AnyClass { + override class var layerClass: AnyClass { return ASTransformLayer.self } } diff --git a/Display/ActionSheetButtonItem.swift b/Display/ActionSheetButtonItem.swift index ad1de9c38e..b0435d21f6 100644 --- a/Display/ActionSheetButtonItem.swift +++ b/Display/ActionSheetButtonItem.swift @@ -17,6 +17,8 @@ public class ActionSheetButtonItem: ActionSheetItem { } public func node() -> ActionSheetItemNode { - return ActionSheetButtonNode(title: AttributedString(string: title, font: ActionSheetButtonNode.defaultFont, textColor: self.color == .accent ? UIColor(0x1195f2) : UIColor.red()), action: self.action) + let textColorIsAccent = self.color == ActionSheetButtonColor.accent + let textColor = textColorIsAccent ? UIColor(0x1195f2) : UIColor.red + return ActionSheetButtonNode(title: NSAttributedString(string: title, font: ActionSheetButtonNode.defaultFont, textColor: textColor), action: self.action) } } diff --git a/Display/ActionSheetButtonNode.swift b/Display/ActionSheetButtonNode.swift index 40b1aaea14..e740f94b43 100644 --- a/Display/ActionSheetButtonNode.swift +++ b/Display/ActionSheetButtonNode.swift @@ -10,7 +10,7 @@ public class ActionSheetButtonNode: ActionSheetItemNode { private let label: UILabel private var calculatedLabelSize: CGSize? - public init(title: AttributedString, action: () -> Void) { + public init(title: NSAttributedString, action: () -> Void) { self.action = action self.button = HighlightTrackingButton() diff --git a/Display/ActionSheetController.swift b/Display/ActionSheetController.swift index 149d9957fe..afb7038bb6 100644 --- a/Display/ActionSheetController.swift +++ b/Display/ActionSheetController.swift @@ -37,7 +37,7 @@ public class ActionSheetController: ViewController { public func setItemGroups(_ groups: [ActionSheetItemGroup]) { self.groups = groups - if self.isViewLoaded() { + if self.isViewLoaded { self.actionSheetNode.setGroups(groups) } } diff --git a/Display/ActionSheetItemGroupNode.swift b/Display/ActionSheetItemGroupNode.swift index a51be83e76..9ac3c0230c 100644 --- a/Display/ActionSheetItemGroupNode.swift +++ b/Display/ActionSheetItemGroupNode.swift @@ -66,13 +66,13 @@ final class ActionSheetItemGroupNode: ASDisplayNode, UIScrollViewDelegate { func updateItemNodes(_ nodes: [ActionSheetItemNode], leadingVisibleNodeCount: CGFloat = 1000.0) { for node in self.itemNodes { - if !nodes.contains({ $0 === node }) { + if !nodes.contains(where: { $0 === node }) { node.removeFromSupernode() } } for node in nodes { - if !self.itemNodes.contains({ $0 === node }) { + if !self.itemNodes.contains(where: { $0 === node }) { self.scrollView.addSubnode(node) } } diff --git a/Display/BarButtonItemWrapper.swift b/Display/BarButtonItemWrapper.swift index de62a54dee..02b62f6aa3 100644 --- a/Display/BarButtonItemWrapper.swift +++ b/Display/BarButtonItemWrapper.swift @@ -24,7 +24,7 @@ internal class BarButtonItemWrapper { self.parentNode.addSubnode(self.buttonNode) self.setEnabledListenerKey = barButtonItem.addSetEnabledListener({ [weak self] enabled in - self?.buttonNode.isEnabled = enabled.boolValue + self?.buttonNode.isEnabled = enabled return }) diff --git a/Display/Font.swift b/Display/Font.swift index 801e389c73..862078c6ac 100644 --- a/Display/Font.swift +++ b/Display/Font.swift @@ -11,8 +11,8 @@ public struct Font { } } -public extension AttributedString { - convenience init(string: String, font: UIFont, textColor: UIColor = UIColor.black()) { +public extension NSAttributedString { + convenience init(string: String, font: UIFont, textColor: UIColor = UIColor.black) { self.init(string: string, attributes: [NSFontAttributeName: font, NSForegroundColorAttributeName as String: textColor]) } } diff --git a/Display/GenerateImage.swift b/Display/GenerateImage.swift index 5d58c6c413..031843fd81 100644 --- a/Display/GenerateImage.swift +++ b/Display/GenerateImage.swift @@ -2,7 +2,7 @@ import Foundation import UIKit let deviceColorSpace = CGColorSpaceCreateDeviceRGB() -let deviceScale = UIScreen.main().scale +let deviceScale = UIScreen.main.scale public func generateImage(_ size: CGSize, pixelGenerator: (CGSize, UnsafeMutablePointer) -> Void) -> UIImage? { let scale = deviceScale @@ -50,7 +50,7 @@ public func generateImage(_ size: CGSize, contextGenerator: (CGSize, CGContext) return nil } - context.scale(x: scale, y: scale) + context.scaleBy(x: scale, y: scale) contextGenerator(size, context) @@ -73,7 +73,7 @@ public func generateFilledCircleImage(radius: CGFloat, color: UIColor?, backgrou if let color = color { context.setFillColor(color.cgColor) } else { - context.setFillColor(UIColor.clear().cgColor) + context.setFillColor(UIColor.clear.cgColor) context.setBlendMode(.copy) } context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) @@ -110,28 +110,28 @@ public class DrawingContext { public func withContext(_ f: @noescape(CGContext) -> ()) { if self._context == nil { if let c = CGContext(data: bytes, width: Int(scaledSize.width), height: Int(scaledSize.height), bitsPerComponent: 8, bytesPerRow: bytesPerRow, space: deviceColorSpace, bitmapInfo: self.bitmapInfo.rawValue) { - c.scale(x: scale, y: scale) + c.scaleBy(x: scale, y: scale) self._context = c } } if let _context = self._context { - _context.translate(x: self.size.width / 2.0, y: self.size.height / 2.0) - _context.scale(x: 1.0, y: -1.0) - _context.translate(x: -self.size.width / 2.0, y: -self.size.height / 2.0) + _context.translateBy(x: self.size.width / 2.0, y: self.size.height / 2.0) + _context.scaleBy(x: 1.0, y: -1.0) + _context.translateBy(x: -self.size.width / 2.0, y: -self.size.height / 2.0) f(_context) - _context.translate(x: self.size.width / 2.0, y: self.size.height / 2.0) - _context.scale(x: 1.0, y: -1.0) - _context.translate(x: -self.size.width / 2.0, y: -self.size.height / 2.0) + _context.translateBy(x: self.size.width / 2.0, y: self.size.height / 2.0) + _context.scaleBy(x: 1.0, y: -1.0) + _context.translateBy(x: -self.size.width / 2.0, y: -self.size.height / 2.0) } } public func withFlippedContext(_ f: @noescape(CGContext) -> ()) { if self._context == nil { if let c = CGContext(data: bytes, width: Int(scaledSize.width), height: Int(scaledSize.height), bitsPerComponent: 8, bytesPerRow: bytesPerRow, space: deviceColorSpace, bitmapInfo: self.bitmapInfo.rawValue) { - c.scale(x: scale, y: scale) + c.scaleBy(x: scale, y: scale) self._context = c } } @@ -177,7 +177,7 @@ public class DrawingContext { let colorValue = pixel.pointee return UIColor(UInt32(colorValue)) } else { - return UIColor.clear() + return UIColor.clear } } @@ -231,7 +231,7 @@ public class DrawingContext { } } -public enum ParsingError: ErrorProtocol { +public enum ParsingError: Error { case Generic } diff --git a/Display/ListView.swift b/Display/ListView.swift index 2a9a64e5fa..92b9b01f72 100644 --- a/Display/ListView.swift +++ b/Display/ListView.swift @@ -323,7 +323,7 @@ private struct ListViewState { var maxY: CGFloat = 0.0 for i in 0 ..< self.nodes.count { var frame = self.nodes[i].frame - frame.offsetInPlace(dx: 0.0, dy: offset) + frame = frame.offsetBy(dx: 0.0, dy: offset) self.nodes[i].frame = frame minY = min(minY, frame.minY) @@ -338,7 +338,7 @@ private struct ListViewState { if abs(additionalOffset) > CGFloat(FLT_EPSILON) { for i in 0 ..< self.nodes.count { var frame = self.nodes[i].frame - frame.offsetInPlace(dx: 0.0, dy: additionalOffset) + frame = frame.offsetBy(dx: 0.0, dy: additionalOffset) self.nodes[i].frame = frame } } @@ -356,7 +356,7 @@ private struct ListViewState { if abs(offset) > CGFloat(FLT_EPSILON) { for i in 0 ..< self.nodes.count { var frame = self.nodes[i].frame - frame.offsetInPlace(dx: 0.0, dy: offset) + frame = frame.offsetBy(dx: 0.0, dy: offset) self.nodes[i].frame = frame } } @@ -882,7 +882,7 @@ private final class ListViewBackingLayer: CALayer { private final class ListViewBackingView: UIView { weak var target: ASDisplayNode? - override class func layerClass() -> AnyClass { + override class var layerClass: AnyClass { return ListViewBackingLayer.self } @@ -1464,12 +1464,12 @@ public final class ListView: ASDisplayNode, UIScrollViewDelegate { } state.fixScrollPostition(self.items.count) - let sortedDeleteIndices = deleteIndices.sorted(isOrderedBefore: {$0.index < $1.index}) + let sortedDeleteIndices = deleteIndices.sorted(by: {$0.index < $1.index}) for deleteItem in sortedDeleteIndices.reversed() { self.items.remove(at: deleteItem.index) } - let sortedIndicesAndItems = insertIndicesAndItems.sorted(isOrderedBefore: { $0.index < $1.index }) + let sortedIndicesAndItems = insertIndicesAndItems.sorted(by: { $0.index < $1.index }) if self.items.count == 0 { if sortedIndicesAndItems[0].index != 0 { fatalError("deleteAndInsertItems: invalid insert into empty list") diff --git a/Display/ListViewItemNode.swift b/Display/ListViewItemNode.swift index 7e2010d469..5eb8f8eabe 100644 --- a/Display/ListViewItemNode.swift +++ b/Display/ListViewItemNode.swift @@ -27,7 +27,7 @@ struct ListViewItemSpring { } private class ListViewItemView: UIView { - override class func layerClass() -> AnyClass { + override class var layerClass: AnyClass { return ASTransformLayer.self } } diff --git a/Display/NavigationBackButtonNode.swift b/Display/NavigationBackButtonNode.swift index 7aca21f201..780a0b8d67 100644 --- a/Display/NavigationBackButtonNode.swift +++ b/Display/NavigationBackButtonNode.swift @@ -9,7 +9,7 @@ public class NavigationBackButtonNode: ASControlNode { private func attributesForCurrentState() -> [String : AnyObject] { return [ NSFontAttributeName: self.fontForCurrentState(), - NSForegroundColorAttributeName: self.isEnabled ? self.color : UIColor.gray() + NSForegroundColorAttributeName: self.isEnabled ? self.color : UIColor.gray ] } @@ -25,14 +25,14 @@ public class NavigationBackButtonNode: ASControlNode { } set(value) { self._text = value - self.label.attributedString = AttributedString(string: text, attributes: self.attributesForCurrentState()) + self.label.attributedString = NSAttributedString(string: text, attributes: self.attributesForCurrentState()) self.invalidateCalculatedLayout() } } var color: UIColor = UIColor(0x1195f2) { didSet { - self.label.attributedString = AttributedString(string: self._text, attributes: self.attributesForCurrentState()) + self.label.attributedString = NSAttributedString(string: self._text, attributes: self.attributesForCurrentState()) } } diff --git a/Display/NavigationBar.swift b/Display/NavigationBar.swift index af0cda1dfd..ad5d920054 100644 --- a/Display/NavigationBar.swift +++ b/Display/NavigationBar.swift @@ -32,10 +32,10 @@ private func backArrowImage(color: UIColor) -> UIImage? { } public class NavigationBar: ASDisplayNode { - public var foregroundColor: UIColor = UIColor.black() { + public var foregroundColor: UIColor = UIColor.black { didSet { if let title = self.title { - self.titleNode.attributedText = AttributedString(string: title, font: Font.medium(17.0), textColor: self.foregroundColor) + self.titleNode.attributedText = NSAttributedString(string: title, font: Font.medium(17.0), textColor: self.foregroundColor) } } } @@ -66,6 +66,7 @@ public class NavigationBar: ASDisplayNode { private let clippingNode: ASDisplayNode private var itemTitleListenerKey: Int? + private var itemTitleViewListenerKey: Int? private var itemLeftButtonListenerKey: Int? private var _item: UINavigationItem? var item: UINavigationItem? { @@ -94,6 +95,13 @@ public class NavigationBar: ASDisplayNode { } } + self.titleView = item.titleView + self.itemTitleViewListenerKey = item.addSetTitleViewListener { [weak self] titleView in + if let strongSelf = self { + strongSelf.titleView = titleView + } + } + self.itemLeftButtonListenerKey = item.addSetLeftBarButtonItemListener { [weak self] _, _ in if let strongSelf = self { strongSelf.updateLeftButton() @@ -111,7 +119,7 @@ public class NavigationBar: ASDisplayNode { private var title: String? { didSet { if let title = self.title { - self.titleNode.attributedText = AttributedString(string: title, font: Font.medium(17.0), textColor: self.foregroundColor) + self.titleNode.attributedText = NSAttributedString(string: title, font: Font.medium(17.0), textColor: self.foregroundColor) if self.titleNode.supernode == nil { self.clippingNode.addSubnode(self.titleNode) } @@ -123,6 +131,22 @@ public class NavigationBar: ASDisplayNode { self.setNeedsLayout() } } + + private var titleView: UIView? { + didSet { + if let oldValue = oldValue { + oldValue.removeFromSuperview() + } + + if let titleView = self.titleView { + self.clippingNode.view.addSubview(titleView) + } + + self.invalidateCalculatedLayout() + self.setNeedsLayout() + } + } + private let titleNode: ASTextNode var previousItemListenerKey: Int? @@ -414,13 +438,18 @@ public class NavigationBar: ASDisplayNode { } } + if let titleView = self.titleView { + let titleViewSize = CGSize(width: max(1.0, size.width - leftTitleInset - leftTitleInset), height: nominalHeight) + titleView.frame = CGRect(origin: CGPoint(x: leftTitleInset, y: contentVerticalOrigin), size: titleViewSize) + } + //self.effectView.frame = self.bounds } public func makeTransitionTitleNode(foregroundColor: UIColor) -> ASDisplayNode? { if let title = self.title { let node = ASTextNode() - node.attributedText = AttributedString(string: title, font: Font.medium(17.0), textColor: foregroundColor) + node.attributedText = NSAttributedString(string: title, font: Font.medium(17.0), textColor: foregroundColor) return node } else { return nil diff --git a/Display/NavigationButtonNode.swift b/Display/NavigationButtonNode.swift index 5e45e9b88a..15f19a0a2d 100644 --- a/Display/NavigationButtonNode.swift +++ b/Display/NavigationButtonNode.swift @@ -9,7 +9,7 @@ public class NavigationButtonNode: ASTextNode { private func attributesForCurrentState() -> [String : AnyObject] { return [ NSFontAttributeName: self.fontForCurrentState(), - NSForegroundColorAttributeName: self.isEnabled ? self.color : UIColor.gray() + NSForegroundColorAttributeName: self.isEnabled ? self.color : UIColor.gray ] } @@ -21,14 +21,14 @@ public class NavigationButtonNode: ASTextNode { set(value) { _text = value - self.attributedString = AttributedString(string: text, attributes: self.attributesForCurrentState()) + self.attributedString = NSAttributedString(string: text, attributes: self.attributesForCurrentState()) } } public var color: UIColor = UIColor(0x1195f2) { didSet { if let text = self._text { - self.attributedString = AttributedString(string: text, attributes: self.attributesForCurrentState()) + self.attributedString = NSAttributedString(string: text, attributes: self.attributesForCurrentState()) } } } @@ -42,7 +42,7 @@ public class NavigationButtonNode: ASTextNode { if _bold != value { _bold = value - self.attributedString = AttributedString(string: text, attributes: self.attributesForCurrentState()) + self.attributedString = NSAttributedString(string: text, attributes: self.attributesForCurrentState()) } } } @@ -129,7 +129,7 @@ public class NavigationButtonNode: ASTextNode { if self.isEnabled != value { super.isEnabled = value - self.attributedString = AttributedString(string: text, attributes: self.attributesForCurrentState()) + self.attributedString = NSAttributedString(string: text, attributes: self.attributesForCurrentState()) } } } diff --git a/Display/NavigationController.swift b/Display/NavigationController.swift index 98475c4c24..f7f46264d3 100644 --- a/Display/NavigationController.swift +++ b/Display/NavigationController.swift @@ -4,7 +4,7 @@ import AsyncDisplayKit import SwiftSignalKit private class NavigationControllerView: UIView { - override class func layerClass() -> AnyClass { + override class var layerClass: AnyClass { return CATracingLayer.self } } @@ -60,7 +60,7 @@ public class NavigationController: NavigationControllerProxy, ContainableControl } public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { - if !self.isViewLoaded() { + if !self.isViewLoaded { self.loadView() } self.containerLayout = layout @@ -253,7 +253,7 @@ public class NavigationController: NavigationControllerProxy, ContainableControl } if animated && self.viewControllers.count != 0 && viewControllers.count != 0 && self.viewControllers.last! !== viewControllers.last! { - if self.viewControllers.contains({ $0 === viewControllers.last }) { + if self.viewControllers.contains(where: { $0 === viewControllers.last }) { let bottomController = viewControllers.last! as UIViewController let topController = self.viewControllers.last! as UIViewController @@ -323,7 +323,7 @@ public class NavigationController: NavigationControllerProxy, ContainableControl }) } } else { - if let topController = self.viewControllers.last where topController.isViewLoaded() { + if let topController = self.viewControllers.last where topController.isViewLoaded { topController.navigation_setNavigationController(nil) topController.view.removeFromSuperview() } diff --git a/Display/NavigationTitleNode.swift b/Display/NavigationTitleNode.swift index 32449d08d0..4ada590a0b 100644 --- a/Display/NavigationTitleNode.swift +++ b/Display/NavigationTitleNode.swift @@ -15,7 +15,7 @@ public class NavigationTitleNode: ASDisplayNode { } } - public var color: UIColor = UIColor.black() { + public var color: UIColor = UIColor.black { didSet { self.setText(self._text) } @@ -42,7 +42,7 @@ public class NavigationTitleNode: ASDisplayNode { var titleAttributes = [String : AnyObject]() titleAttributes[NSFontAttributeName] = UIFont.boldSystemFont(ofSize: 17.0) titleAttributes[NSForegroundColorAttributeName] = self.color - let titleString = AttributedString(string: text as String, attributes: titleAttributes) + let titleString = NSAttributedString(string: text as String, attributes: titleAttributes) self.label.attributedString = titleString self.invalidateCalculatedLayout() } diff --git a/Display/NavigationTransitionCoordinator.swift b/Display/NavigationTransitionCoordinator.swift index 7785f7f4d0..2e650df56e 100644 --- a/Display/NavigationTransitionCoordinator.swift +++ b/Display/NavigationTransitionCoordinator.swift @@ -8,7 +8,7 @@ enum NavigationTransition { private let shadowWidth: CGFloat = 16.0 private func generateShadow() -> UIImage? { - return UIImage(named: "NavigationShadow", in: Bundle(for: NavigationBackButtonNode.self), compatibleWith: nil)?.precomposed().resizableImage(withCapInsets: UIEdgeInsetsZero, resizingMode: .tile) + return UIImage(named: "NavigationShadow", in: Bundle(for: NavigationBackButtonNode.self), compatibleWith: nil)?.precomposed().resizableImage(withCapInsets: UIEdgeInsets(), resizingMode: .tile) } private let shadowImage = generateShadow() @@ -51,7 +51,7 @@ class NavigationTransitionCoordinator { self.topNavigationBar = topNavigationBar self.bottomNavigationBar = bottomNavigationBar self.dimView = UIView() - self.dimView.backgroundColor = UIColor.black() + self.dimView.backgroundColor = UIColor.black self.shadowView = UIImageView(image: shadowImage) if let topNavigationBar = topNavigationBar, bottomNavigationBar = bottomNavigationBar { diff --git a/Display/PresentationContext.swift b/Display/PresentationContext.swift index 9c9b6dadb9..589fba9030 100644 --- a/Display/PresentationContext.swift +++ b/Display/PresentationContext.swift @@ -46,7 +46,7 @@ final class PresentationContext { self.presentationDisposables.add(controllerReady.start(next: { [weak self] _ in if let strongSelf = self { - if strongSelf.controllers.contains({ $0 === controller }) { + if strongSelf.controllers.contains(where: { $0 === controller }) { return } @@ -131,7 +131,7 @@ final class PresentationContext { func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { for controller in self.controllers { - if controller.isViewLoaded() { + if controller.isViewLoaded { if let result = controller.view.hitTest(point, with: event) { return result } diff --git a/Display/RuntimeUtils.swift b/Display/RuntimeUtils.swift index 54cd75f979..7ae936e860 100644 --- a/Display/RuntimeUtils.swift +++ b/Display/RuntimeUtils.swift @@ -2,7 +2,7 @@ import Foundation import UIKit private let systemVersion = { () -> (Int, Int) in - let string = UIDevice.current().systemVersion as NSString + let string = UIDevice.current.systemVersion as NSString var minor = 0 let range = string.range(of: ".") if range.location != NSNotFound { diff --git a/Display/StatusBarHostWindow.swift b/Display/StatusBarHostWindow.swift deleted file mode 100644 index 02dd884e7a..0000000000 --- a/Display/StatusBarHostWindow.swift +++ /dev/null @@ -1,29 +0,0 @@ -import Foundation -import UIKit - -private class StatusBarHostWindowController: UIViewController { - override func preferredStatusBarStyle() -> UIStatusBarStyle { - return UIStatusBarStyle.default - } - - override func prefersStatusBarHidden() -> Bool { - return false - } - - override func shouldAutorotate() -> Bool { - return true - } -} - -public class StatusBarHostWindow: UIWindow { - public init() { - super.init(frame: CGRect()) - - self.windowLevel = 10000.0 - self.rootViewController = StatusBarHostWindowController() - } - - required public init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/Display/StatusBarManager.swift b/Display/StatusBarManager.swift index 2e3df48206..043b27bbfb 100644 --- a/Display/StatusBarManager.swift +++ b/Display/StatusBarManager.swift @@ -31,7 +31,7 @@ private func optimizeMappedSurface(_ surface: MappedStatusBarSurface) -> MappedS return surface } } - let size = UIApplication.shared().statusBarFrame.size + let size = UIApplication.shared.statusBarFrame.size return MappedStatusBarSurface(statusBars: [MappedStatusBar(style: surface.statusBars[0].style, frame: CGRect(origin: CGPoint(x: 0.0, y: surface.statusBars[0].frame.origin.y), size: size), statusBar: nil)], surface: surface.surface) } else { return surface @@ -124,7 +124,7 @@ class StatusBarManager { for surface in previousSurfaces { for statusBar in surface.statusBars { - if !visibleStatusBars.contains({$0 === statusBar}) { + if !visibleStatusBars.contains(where: {$0 === statusBar}) { statusBar.removeProxyNode() } } @@ -132,7 +132,7 @@ class StatusBarManager { for surface in self.surfaces { for statusBar in surface.statusBars { - if !visibleStatusBars.contains({$0 === statusBar}) { + if !visibleStatusBars.contains(where: {$0 === statusBar}) { statusBar.removeProxyNode() } } @@ -144,8 +144,8 @@ class StatusBarManager { if let globalStatusBar = globalStatusBar { let statusBarStyle: UIStatusBarStyle = globalStatusBar.0 == .Black ? .default : .lightContent - if UIApplication.shared().statusBarStyle != statusBarStyle { - UIApplication.shared().setStatusBarStyle(statusBarStyle, animated: false) + if UIApplication.shared.statusBarStyle != statusBarStyle { + UIApplication.shared.setStatusBarStyle(statusBarStyle, animated: false) } StatusBarUtils.statusBarWindow()!.alpha = globalStatusBar.1 } else { diff --git a/Display/StatusBarProxyNode.swift b/Display/StatusBarProxyNode.swift index 9c8edc4894..7907c2537f 100644 --- a/Display/StatusBarProxyNode.swift +++ b/Display/StatusBarProxyNode.swift @@ -43,16 +43,16 @@ private class StatusBarItemNode: ASDisplayNode { if let contents = sublayer.contents where CFGetTypeID(contents) == CGImage.typeID { let image = contents as! CGImage context.withFlippedContext { c in - c.translate(x: origin.x, y: origin.y) + c.translateBy(x: origin.x, y: origin.y) c.draw(in: CGRect(origin: CGPoint(), size: context.size), image: image) - c.translate(x: -origin.x, y: -origin.y) + c.translateBy(x: -origin.x, y: -origin.y) } } else { context.withContext { c in UIGraphicsPushContext(c) - c.translate(x: origin.x, y: origin.y) + c.translateBy(x: origin.x, y: origin.y) sublayer.render(in: c) - c.translate(x: -origin.x, y: -origin.y) + c.translateBy(x: -origin.x, y: -origin.y) UIGraphicsPopContext() } } diff --git a/Display/SystemContainedControllerTransitionCoordinator.swift b/Display/SystemContainedControllerTransitionCoordinator.swift index ea1034f5d6..69c6025858 100644 --- a/Display/SystemContainedControllerTransitionCoordinator.swift +++ b/Display/SystemContainedControllerTransitionCoordinator.swift @@ -1,41 +1,41 @@ import UIKit final class SystemContainedControllerTransitionCoordinator:NSObject, UIViewControllerTransitionCoordinator { - public func isAnimated() -> Bool { + public var isAnimated: Bool { return false } - public func presentationStyle() -> UIModalPresentationStyle { + public var presentationStyle: UIModalPresentationStyle { return .fullScreen } - public func initiallyInteractive() -> Bool { + public var initiallyInteractive: Bool { return false } public let isInterruptible: Bool = false - public func isInteractive() -> Bool { + public var isInteractive: Bool { return false } - public func isCancelled() -> Bool { + public var isCancelled: Bool { return false } - public func transitionDuration() -> TimeInterval { + public var transitionDuration: TimeInterval { return 0.6 } - public func percentComplete() -> CGFloat { + public var percentComplete: CGFloat { return 0.0 } - public func completionVelocity() -> CGFloat { + public var completionVelocity: CGFloat { return 0.0 } - public func completionCurve() -> UIViewAnimationCurve { + public var completionCurve: UIViewAnimationCurve { return .easeInOut } @@ -47,11 +47,11 @@ final class SystemContainedControllerTransitionCoordinator:NSObject, UIViewContr return nil } - public func containerView() -> UIView { + public var containerView: UIView { return UIView() } - public func targetTransform() -> CGAffineTransform { + public var targetTransform: CGAffineTransform { return CGAffineTransform.identity } diff --git a/Display/TabBarNode.swift b/Display/TabBarNode.swift index 9f314aff8b..387d91eaa5 100644 --- a/Display/TabBarNode.swift +++ b/Display/TabBarNode.swift @@ -2,7 +2,7 @@ import Foundation import UIKit import AsyncDisplayKit -private let separatorHeight: CGFloat = 1.0 / UIScreen.main().scale +private let separatorHeight: CGFloat = 1.0 / UIScreen.main.scale private func tabBarItemImage(_ image: UIImage?, title: String, tintColor: UIColor) -> UIImage { let font = Font.regular(10.0) let titleSize = (title as NSString).boundingRect(with: CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude), options: [.usesLineFragmentOrigin], attributes: [NSFontAttributeName: font], context: nil).size @@ -24,10 +24,10 @@ private func tabBarItemImage(_ image: UIImage?, title: String, tintColor: UIColo if let image = image { let imageRect = CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - imageSize.width) / 2.0), y: 0.0), size: imageSize) context.saveGState() - context.translate(x: imageRect.midX, y: imageRect.midY) - context.scale(x: 1.0, y: -1.0) - context.translate(x: -imageRect.midX, y: -imageRect.midY) - context.clipToMask(imageRect, mask: image.cgImage!) + context.translateBy(x: imageRect.midX, y: imageRect.midY) + context.scaleBy(x: 1.0, y: -1.0) + context.translateBy(x: -imageRect.midX, y: -imageRect.midY) + context.clip(to: imageRect, mask: image.cgImage!) context.setFillColor(tintColor.cgColor) context.fill(imageRect) context.restoreGState() @@ -140,7 +140,8 @@ class TabBarNode: ASDisplayNode { let node = self.tabBarNodes[i] node.measure(CGSize(width: internalWidth, height: size.height)) - node.frame = CGRect(origin: CGPoint(x: floor(leftNodeOriginX + CGFloat(i) * distanceBetweenNodes - node.calculatedSize.width / 2.0), y: 4.0), size: node.calculatedSize) + let originX = floor(leftNodeOriginX + CGFloat(i) * distanceBetweenNodes - node.calculatedSize.width / 2.0) + node.frame = CGRect(origin: CGPoint(x: originX, y: 4.0), size: node.calculatedSize) } } } diff --git a/Display/UIKitUtils.swift b/Display/UIKitUtils.swift index 006c010fb6..0e9249d212 100644 --- a/Display/UIKitUtils.swift +++ b/Display/UIKitUtils.swift @@ -26,7 +26,7 @@ private func dumpLayers(_ layer: CALayer, indent: String = "") { } } -public let UIScreenScale = UIScreen.main().scale +public let UIScreenScale = UIScreen.main.scale public func floorToScreenPixels(_ value: CGFloat) -> CGFloat { return floor(value * UIScreenScale) / UIScreenScale } @@ -96,7 +96,7 @@ public extension UIImage { self.draw(at: CGPoint()) let result = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() - if !UIEdgeInsetsEqualToEdgeInsets(self.capInsets, UIEdgeInsetsZero) { + if !UIEdgeInsetsEqualToEdgeInsets(self.capInsets, UIEdgeInsets()) { return result.resizableImage(withCapInsets: self.capInsets, resizingMode: self.resizingMode) } return result diff --git a/Display/UINavigationItem+Proxy.h b/Display/UINavigationItem+Proxy.h index 0c2a5bd37a..4fd81f16e2 100644 --- a/Display/UINavigationItem+Proxy.h +++ b/Display/UINavigationItem+Proxy.h @@ -1,12 +1,15 @@ #import typedef void (^UINavigationItemSetTitleListener)(NSString *); +typedef void (^UINavigationItemSetTitleViewListener)(UIView *); typedef void (^UINavigationItemSetBarButtonItemListener)(UIBarButtonItem *, BOOL); @interface UINavigationItem (Proxy) - (NSInteger)addSetTitleListener:(UINavigationItemSetTitleListener)listener; - (void)removeSetTitleListener:(NSInteger)key; +- (NSInteger)addSetTitleViewListener:(UINavigationItemSetTitleViewListener)listener; +- (void)removeSetTitleViewListener:(NSInteger)key; - (NSInteger)addSetLeftBarButtonItemListener:(UINavigationItemSetBarButtonItemListener)listener; - (void)removeSetLeftBarButtonItemListener:(NSInteger)key; - (NSInteger)addSetRightBarButtonItemListener:(UINavigationItemSetBarButtonItemListener)listener; diff --git a/Display/UINavigationItem+Proxy.m b/Display/UINavigationItem+Proxy.m index d6944828dc..2a8b1a1b5c 100644 --- a/Display/UINavigationItem+Proxy.m +++ b/Display/UINavigationItem+Proxy.m @@ -4,6 +4,7 @@ #import "RuntimeUtils.h" static const void *setTitleListenerBagKey = &setTitleListenerBagKey; +static const void *setTitleViewListenerBagKey = &setTitleViewListenerBagKey; static const void *setLeftBarButtonItemListenerBagKey = &setLeftBarButtonItemListenerBagKey; static const void *setRightBarButtonItemListenerBagKey = &setRightBarButtonItemListenerBagKey; @@ -15,6 +16,7 @@ static const void *setRightBarButtonItemListenerBagKey = &setRightBarButtonItemL dispatch_once(&onceToken, ^ { [RuntimeUtils swizzleInstanceMethodOfClass:[UINavigationItem class] currentSelector:@selector(setTitle:) newSelector:@selector(_ac91f40f_setTitle:)]; + [RuntimeUtils swizzleInstanceMethodOfClass:[UINavigationItem class] currentSelector:@selector(setTitleView:) newSelector:@selector(_ac91f40f_setTitleView:)]; [RuntimeUtils swizzleInstanceMethodOfClass:[UINavigationItem class] currentSelector:@selector(setLeftBarButtonItem:) newSelector:@selector(_ac91f40f_setLeftBarButtonItem:animated:)]; [RuntimeUtils swizzleInstanceMethodOfClass:[UINavigationItem class] currentSelector:@selector(setRightBarButtonItem:) newSelector:@selector(_ac91f40f_setRightBarButtonItem:animated:)]; }); @@ -24,18 +26,25 @@ static const void *setRightBarButtonItemListenerBagKey = &setRightBarButtonItemL { [self _ac91f40f_setTitle:title]; - [(NSBag *)[self associatedObjectForKey:setTitleListenerBagKey] enumerateItems:^(UINavigationItemSetTitleListener listener) - { + [(NSBag *)[self associatedObjectForKey:setTitleListenerBagKey] enumerateItems:^(UINavigationItemSetTitleListener listener) { listener(title); }]; } +- (void)_ac91f40f_setTitleView:(UIView *)titleView +{ + [self _ac91f40f_setTitleView:titleView]; + + [(NSBag *)[self associatedObjectForKey:setTitleViewListenerBagKey] enumerateItems:^(UINavigationItemSetTitleViewListener listener) { + listener(titleView); + }]; +} + - (void)_ac91f40f_setLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem animated:(BOOL)animated { [self _ac91f40f_setLeftBarButtonItem:leftBarButtonItem animated:animated]; - [(NSBag *)[self associatedObjectForKey:setLeftBarButtonItemListenerBagKey] enumerateItems:^(UINavigationItemSetBarButtonItemListener listener) - { + [(NSBag *)[self associatedObjectForKey:setLeftBarButtonItemListenerBagKey] enumerateItems:^(UINavigationItemSetBarButtonItemListener listener) { listener(leftBarButtonItem, animated); }]; } @@ -44,8 +53,7 @@ static const void *setRightBarButtonItemListenerBagKey = &setRightBarButtonItemL { [self _ac91f40f_setRightBarButtonItem:rightBarButtonItem animated:animated]; - [(NSBag *)[self associatedObjectForKey:setRightBarButtonItemListenerBagKey] enumerateItems:^(UINavigationItemSetBarButtonItemListener listener) - { + [(NSBag *)[self associatedObjectForKey:setRightBarButtonItemListenerBagKey] enumerateItems:^(UINavigationItemSetBarButtonItemListener listener) { listener(rightBarButtonItem, animated); }]; } @@ -66,6 +74,22 @@ static const void *setRightBarButtonItemListenerBagKey = &setRightBarButtonItemL [(NSBag *)[self associatedObjectForKey:setTitleListenerBagKey] removeItem:key]; } +- (NSInteger)addSetTitleViewListener:(UINavigationItemSetTitleViewListener)listener +{ + NSBag *bag = [self associatedObjectForKey:setTitleViewListenerBagKey]; + if (bag == nil) + { + bag = [[NSBag alloc] init]; + [self setAssociatedObject:bag forKey:setTitleViewListenerBagKey]; + } + return [bag addItem:[listener copy]]; +} + +- (void)removeSetTitleViewListener:(NSInteger)key +{ + [(NSBag *)[self associatedObjectForKey:setTitleViewListenerBagKey] removeItem:key]; +} + - (NSInteger)addSetLeftBarButtonItemListener:(UINavigationItemSetBarButtonItemListener)listener { NSBag *bag = [self associatedObjectForKey:setLeftBarButtonItemListenerBagKey]; diff --git a/Display/ViewController.swift b/Display/ViewController.swift index 84d1952aaa..735441cdfc 100644 --- a/Display/ViewController.swift +++ b/Display/ViewController.swift @@ -43,7 +43,7 @@ import SwiftSignalKit private var scrollToTopView: ScrollToTopView? public var scrollToTop: (() -> Void)? { didSet { - if self.isViewLoaded() { + if self.isViewLoaded { self.updateScrollToTopView() } } @@ -92,7 +92,7 @@ import SwiftSignalKit public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { self.containerLayout = layout - if !self.isViewLoaded() { + if !self.isViewLoaded { self.loadView() } self.view.frame = CGRect(origin: self.view.frame.origin, size: layout.size) @@ -133,7 +133,7 @@ import SwiftSignalKit } public func requestLayout(transition: ContainedViewLayoutTransition) { - if self.isViewLoaded() { + if self.isViewLoaded { self.containerLayoutUpdated(self.containerLayout, transition: transition) } } diff --git a/Display/Window.swift b/Display/Window.swift index 04b2c4aa30..536d0b0979 100644 --- a/Display/Window.swift +++ b/Display/Window.swift @@ -2,11 +2,11 @@ import Foundation import AsyncDisplayKit private class WindowRootViewController: UIViewController { - override func preferredStatusBarStyle() -> UIStatusBarStyle { + override var preferredStatusBarStyle: UIStatusBarStyle { return .default } - override func prefersStatusBarHidden() -> Bool { + override var prefersStatusBarHidden: Bool { return false } } @@ -84,8 +84,8 @@ private struct UpdatingLayout { } } -private let orientationChangeDuration: Double = UIDevice.current().userInterfaceIdiom == .pad ? 0.4 : 0.3 -private let statusBarHiddenInLandscape: Bool = UIDevice.current().userInterfaceIdiom == .phone +private let orientationChangeDuration: Double = UIDevice.current.userInterfaceIdiom == .pad ? 0.4 : 0.3 +private let statusBarHiddenInLandscape: Bool = UIDevice.current.userInterfaceIdiom == .phone private func containedLayoutForWindowLayout(_ layout: WindowLayout) -> ContainerViewLayout { return ContainerViewLayout(size: layout.size, intrinsicInsets: UIEdgeInsets(), statusBarHeight: layout.statusBarHeight, inputHeight: layout.inputHeight) @@ -108,12 +108,12 @@ public class Window: UIWindow { private var statusBarHidden = false public convenience init() { - self.init(frame: UIScreen.main().bounds) + self.init(frame: UIScreen.main.bounds) } public override init(frame: CGRect) { self.statusBarManager = StatusBarManager() - self.windowLayout = WindowLayout(size: frame.size, statusBarHeight: UIApplication.shared().statusBarFrame.size.height, inputHeight: 0.0) + self.windowLayout = WindowLayout(size: frame.size, statusBarHeight: UIApplication.shared.statusBarFrame.size.height, inputHeight: 0.0) self.presentationContext = PresentationContext() super.init(frame: frame) @@ -129,7 +129,7 @@ public class Window: UIWindow { self.statusBarChangeObserver = NotificationCenter.default.addObserver(forName: NSNotification.Name.UIApplicationWillChangeStatusBarFrame, object: nil, queue: OperationQueue.main, using: { [weak self] notification in if let strongSelf = self { - let statusBarHeight: CGFloat = max(20.0, (notification.userInfo?[UIApplicationStatusBarFrameUserInfoKey] as? NSValue)?.cgRectValue().height ?? 20.0) + let statusBarHeight: CGFloat = max(20.0, (notification.userInfo?[UIApplicationStatusBarFrameUserInfoKey] as? NSValue)?.cgRectValue.height ?? 20.0) let transition: ContainedViewLayoutTransition = .animated(duration: 0.35, curve: .easeInOut) strongSelf.updateLayout { $0.update(statusBarHeight: statusBarHeight, transition: transition, overrideTransition: false) } @@ -138,8 +138,8 @@ public class Window: UIWindow { self.keyboardFrameChangeObserver = NotificationCenter.default.addObserver(forName: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil, queue: nil, using: { [weak self] notification in if let strongSelf = self { - let keyboardFrame: CGRect = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue() ?? CGRect() - let keyboardHeight = max(0.0, UIScreen.main().bounds.size.height - keyboardFrame.minY) + let keyboardFrame: CGRect = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue ?? CGRect() + let keyboardHeight = max(0.0, UIScreen.main.bounds.size.height - keyboardFrame.minY) var duration: Double = (notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0.0 if duration > DBL_EPSILON { duration = 0.5 @@ -316,7 +316,7 @@ public class Window: UIWindow { if let updatingLayout = self.updatingLayout { self.updatingLayout = nil if updatingLayout.layout != self.windowLayout { - var statusBarHeight = UIApplication.shared().statusBarFrame.size.height + var statusBarHeight = UIApplication.shared.statusBarFrame.size.height var statusBarWasHidden = self.statusBarHidden if statusBarHiddenInLandscape && updatingLayout.layout.size.width > updatingLayout.layout.size.height { statusBarHeight = 0.0