Swiftgram/submodules/Display/Display/PageControlNode.swift
Peter 8f5a4f7dc1 Add 'submodules/Display/' from commit '7bd11013ea936e3d49d937550d599f5816d32560'
git-subtree-dir: submodules/Display
git-subtree-mainline: 9bc996374ffdad37aef175427db72731c9551dcf
git-subtree-split: 7bd11013ea936e3d49d937550d599f5816d32560
2019-06-11 18:44:37 +01:00

98 lines
3.6 KiB
Swift

import Foundation
import UIKit
import AsyncDisplayKit
public final class PageControlNode: ASDisplayNode {
private let dotSize: CGFloat
private let dotSpacing: CGFloat
public var dotColor: UIColor {
didSet {
if !oldValue.isEqual(self.dotColor) {
self.normalDotImage = generateFilledCircleImage(diameter: dotSize, color: self.dotColor)!
for dotNode in self.dotNodes {
if dotNode === oldValue {
dotNode.image = self.normalDotImage
}
}
}
}
}
public var inactiveDotColor: UIColor {
didSet {
if !oldValue.isEqual(self.inactiveDotColor) {
self.inactiveDotImage = generateFilledCircleImage(diameter: dotSize, color: self.inactiveDotColor)!
for dotNode in self.dotNodes {
if dotNode === oldValue {
dotNode.image = self.inactiveDotImage
}
}
}
}
}
private var dotNodes: [ASImageNode] = []
private var normalDotImage: UIImage
private var inactiveDotImage: UIImage
public init(dotSize: CGFloat = 7.0, dotSpacing: CGFloat = 9.0, dotColor: UIColor, inactiveDotColor: UIColor) {
self.dotSize = dotSize
self.dotSpacing = dotSpacing
self.dotColor = dotColor
self.inactiveDotColor = inactiveDotColor
self.normalDotImage = generateFilledCircleImage(diameter: dotSize, color: dotColor)!
self.inactiveDotImage = generateFilledCircleImage(diameter: dotSize, color: inactiveDotColor)!
super.init()
}
public var pagesCount: Int = 0 {
didSet {
if self.pagesCount != oldValue {
while self.dotNodes.count > self.pagesCount {
self.dotNodes[self.dotNodes.count - 1].removeFromSupernode()
self.dotNodes.removeLast()
}
while self.dotNodes.count < self.pagesCount {
let dotNode = ASImageNode()
dotNode.image = self.normalDotImage
dotNode.displaysAsynchronously = false
dotNode.displayWithoutProcessing = true
dotNode.isUserInteractionEnabled = false
self.dotNodes.append(dotNode)
self.addSubnode(dotNode)
}
}
}
}
public func setPage(_ pageValue: CGFloat) {
let page = Int(round(pageValue))
for i in 0 ..< self.dotNodes.count {
if i != page {
self.dotNodes[i].image = self.inactiveDotImage
} else {
self.dotNodes[i].image = self.normalDotImage
}
}
}
override public func calculateSizeThatFits(_ constrainedSize: CGSize) -> CGSize {
return CGSize(width: self.dotSize * CGFloat(self.pagesCount) + self.dotSpacing * max(CGFloat(self.pagesCount - 1), 0.0), height: self.dotSize)
}
override public func layout() {
super.layout()
let dotSize = CGSize(width: self.dotSize, height: self.dotSize)
let nominalWidth = self.dotSize * CGFloat(self.pagesCount) + self.dotSpacing * max(CGFloat(self.pagesCount - 1), 0.0)
let startX = floor((self.bounds.size.width - nominalWidth) / 2)
for i in 0 ..< self.dotNodes.count {
self.dotNodes[i].frame = CGRect(origin: CGPoint(x: startX + CGFloat(i) * (dotSize.width + self.dotSpacing), y: 0.0), size: dotSize)
}
}
}