mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-17 11:50:56 +00:00
Fix stars ref UI
(cherry picked from commit 1abaeddfad850a90402527754a69e2bd08f672f8)
This commit is contained in:
parent
00150920d9
commit
285e21cbdf
@ -1,6 +1,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import UIKit
|
import UIKit
|
||||||
import ComponentFlow
|
import ComponentFlow
|
||||||
|
import MultilineTextComponent
|
||||||
|
|
||||||
final class TextView: UIView {
|
final class TextView: UIView {
|
||||||
private struct Params: Equatable {
|
private struct Params: Equatable {
|
||||||
@ -21,6 +22,8 @@ final class TextView: UIView {
|
|||||||
private var layoutState: LayoutState?
|
private var layoutState: LayoutState?
|
||||||
private var animateContentsTransition: Bool = false
|
private var animateContentsTransition: Bool = false
|
||||||
|
|
||||||
|
private let content = ComponentView<Empty>()
|
||||||
|
|
||||||
override init(frame: CGRect) {
|
override init(frame: CGRect) {
|
||||||
super.init(frame: CGRect())
|
super.init(frame: CGRect())
|
||||||
|
|
||||||
@ -56,17 +59,26 @@ final class TextView: UIView {
|
|||||||
font = UIFont.systemFont(ofSize: fontSize, weight: UIFont.Weight(fontWeight))
|
font = UIFont.systemFont(ofSize: fontSize, weight: UIFont.Weight(fontWeight))
|
||||||
}
|
}
|
||||||
|
|
||||||
let paragraphStyle = NSMutableParagraphStyle()
|
|
||||||
paragraphStyle.alignment = alignment
|
|
||||||
paragraphStyle.lineSpacing = 0.6
|
|
||||||
let attributedString = NSAttributedString(string: string, attributes: [
|
let attributedString = NSAttributedString(string: string, attributes: [
|
||||||
.font: font,
|
.font: font,
|
||||||
.foregroundColor: color,
|
.foregroundColor: color,
|
||||||
.paragraphStyle: paragraphStyle
|
|
||||||
])
|
])
|
||||||
let stringBounds = attributedString.boundingRect(with: CGSize(width: constrainedWidth, height: 200.0), options: .usesLineFragmentOrigin, context: nil)
|
|
||||||
let stringSize = CGSize(width: ceil(stringBounds.width), height: ceil(stringBounds.height))
|
let contentSize = self.content.update(
|
||||||
let size = CGSize(width: min(constrainedWidth, stringSize.width), height: stringSize.height)
|
transition: .immediate,
|
||||||
|
component: AnyComponent(MultilineTextComponent(
|
||||||
|
text: .plain(attributedString),
|
||||||
|
horizontalAlignment: alignment,
|
||||||
|
lineSpacing: 0.6
|
||||||
|
)),
|
||||||
|
environment: {},
|
||||||
|
containerSize: CGSize(width: constrainedWidth, height: 1000.0)
|
||||||
|
)
|
||||||
|
if let contentView = self.content.view {
|
||||||
|
contentView.frame = CGRect(origin: CGPoint(), size: contentSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
let size = CGSize(width: min(constrainedWidth, contentSize.width), height: contentSize.height)
|
||||||
|
|
||||||
let layoutState = LayoutState(params: params, size: size, attributedString: attributedString)
|
let layoutState = LayoutState(params: params, size: size, attributedString: attributedString)
|
||||||
if self.layoutState != layoutState {
|
if self.layoutState != layoutState {
|
||||||
@ -79,10 +91,12 @@ final class TextView: UIView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override func draw(_ rect: CGRect) {
|
override func draw(_ rect: CGRect) {
|
||||||
guard let layoutState = self.layoutState else {
|
guard let _ = self.layoutState else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
layoutState.attributedString.draw(with: rect, options: [.truncatesLastVisibleLine, .usesLineFragmentOrigin], context: nil)
|
if let contentView = self.content.view {
|
||||||
|
contentView.draw(contentView.bounds)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -94,6 +94,7 @@ final class AffiliateProgramSetupScreenComponent: Component {
|
|||||||
private let coinIcon = ComponentView<Empty>()
|
private let coinIcon = ComponentView<Empty>()
|
||||||
private let title = ComponentView<Empty>()
|
private let title = ComponentView<Empty>()
|
||||||
private let titleTransformContainer: UIView
|
private let titleTransformContainer: UIView
|
||||||
|
private var titleNeutralScale: CGFloat = 1.0
|
||||||
private let subtitle = ComponentView<Empty>()
|
private let subtitle = ComponentView<Empty>()
|
||||||
|
|
||||||
private let introBackground = ComponentView<Empty>()
|
private let introBackground = ComponentView<Empty>()
|
||||||
@ -339,7 +340,7 @@ final class AffiliateProgramSetupScreenComponent: Component {
|
|||||||
let titleYDistance: CGFloat = titleY - titleCenterY
|
let titleYDistance: CGFloat = titleY - titleCenterY
|
||||||
let titleTransformFraction: CGFloat = 1.0 - max(0.0, min(1.0, titleYDistance / titleTransformDistance))
|
let titleTransformFraction: CGFloat = 1.0 - max(0.0, min(1.0, titleYDistance / titleTransformDistance))
|
||||||
let titleMinScale: CGFloat = 17.0 / 30.0
|
let titleMinScale: CGFloat = 17.0 / 30.0
|
||||||
let titleScale: CGFloat = 1.0 * (1.0 - titleTransformFraction) + titleMinScale * titleTransformFraction
|
let titleScale: CGFloat = self.titleNeutralScale * (1.0 - titleTransformFraction) + (titleMinScale / self.titleNeutralScale) * titleTransformFraction
|
||||||
if let titleView = self.title.view {
|
if let titleView = self.title.view {
|
||||||
transition.setScale(view: titleView, scale: titleScale)
|
transition.setScale(view: titleView, scale: titleScale)
|
||||||
}
|
}
|
||||||
@ -668,9 +669,11 @@ final class AffiliateProgramSetupScreenComponent: Component {
|
|||||||
text: .plain(NSAttributedString(string: titleValue, font: Font.bold(30.0), textColor: environment.theme.list.itemPrimaryTextColor))
|
text: .plain(NSAttributedString(string: titleValue, font: Font.bold(30.0), textColor: environment.theme.list.itemPrimaryTextColor))
|
||||||
)),
|
)),
|
||||||
environment: {},
|
environment: {},
|
||||||
containerSize: CGSize(width: availableSize.width - textSideInset * 2.0, height: 1000.0)
|
containerSize: CGSize(width: availableSize.width + 140.0, height: 1000.0)
|
||||||
)
|
)
|
||||||
let titleFrame = CGRect(origin: CGPoint(x: floor((availableSize.width - titleSize.width) * 0.5), y: contentHeight), size: titleSize)
|
let titleFrame = CGRect(origin: CGPoint(x: floor((availableSize.width - titleSize.width) * 0.5), y: contentHeight), size: titleSize)
|
||||||
|
let titleNeutralScale: CGFloat = min(1.0, (availableSize.width - sideInset * 2.0) / titleSize.width)
|
||||||
|
self.titleNeutralScale = titleNeutralScale
|
||||||
if let titleView = self.title.view {
|
if let titleView = self.title.view {
|
||||||
if self.titleTransformContainer.superview == nil {
|
if self.titleTransformContainer.superview == nil {
|
||||||
if let controller = environment.controller(), let navigationBar = controller.navigationBar {
|
if let controller = environment.controller(), let navigationBar = controller.navigationBar {
|
||||||
@ -685,7 +688,7 @@ final class AffiliateProgramSetupScreenComponent: Component {
|
|||||||
titleView.bounds = CGRect(origin: CGPoint(), size: titleFrame.size)
|
titleView.bounds = CGRect(origin: CGPoint(), size: titleFrame.size)
|
||||||
transition.setPosition(view: self.titleTransformContainer, position: titleFrame.center)
|
transition.setPosition(view: self.titleTransformContainer, position: titleFrame.center)
|
||||||
}
|
}
|
||||||
contentHeight += titleSize.height
|
contentHeight += floor(titleSize.height * titleNeutralScale)
|
||||||
contentHeight += 10.0
|
contentHeight += 10.0
|
||||||
|
|
||||||
let subtitleSize = self.subtitle.update(
|
let subtitleSize = self.subtitle.update(
|
||||||
@ -855,8 +858,8 @@ final class AffiliateProgramSetupScreenComponent: Component {
|
|||||||
transition: transition,
|
transition: transition,
|
||||||
component: AnyComponent(FilledRoundedRectangleComponent(
|
component: AnyComponent(FilledRoundedRectangleComponent(
|
||||||
color: environment.theme.list.itemBlocksBackgroundColor,
|
color: environment.theme.list.itemBlocksBackgroundColor,
|
||||||
cornerRadius: .value(5.0),
|
cornerRadius: .value(11.0),
|
||||||
smoothCorners: true
|
smoothCorners: false
|
||||||
)),
|
)),
|
||||||
environment: {},
|
environment: {},
|
||||||
containerSize: introBackgroundFrame.size
|
containerSize: introBackgroundFrame.size
|
||||||
@ -1153,7 +1156,7 @@ final class AffiliateProgramSetupScreenComponent: Component {
|
|||||||
),
|
),
|
||||||
content: AnyComponentWithIdentity(id: AnyHashable(0 as Int), component: AnyComponent(Text(text: buttonText, font: Font.semibold(17.0), color: environment.theme.list.itemCheckColors.foregroundColor))),
|
content: AnyComponentWithIdentity(id: AnyHashable(0 as Int), component: AnyComponent(Text(text: buttonText, font: Font.semibold(17.0), color: environment.theme.list.itemCheckColors.foregroundColor))),
|
||||||
isEnabled: self.currentProgram?.endDate == nil,
|
isEnabled: self.currentProgram?.endDate == nil,
|
||||||
allowActionWhenDisabled: true,
|
allowActionWhenDisabled: false,
|
||||||
displaysProgress: false,
|
displaysProgress: false,
|
||||||
action: { [weak self] in
|
action: { [weak self] in
|
||||||
guard let self else {
|
guard let self else {
|
||||||
|
|||||||
@ -286,17 +286,25 @@ private final class PeerInfoScreenDisclosureItemNode: PeerInfoScreenItemNode {
|
|||||||
if self.labelBadgeNode.supernode == nil {
|
if self.labelBadgeNode.supernode == nil {
|
||||||
self.insertSubnode(self.labelBadgeNode, belowSubnode: self.labelNode)
|
self.insertSubnode(self.labelBadgeNode, belowSubnode: self.labelNode)
|
||||||
}
|
}
|
||||||
} else if item.additionalBadgeLabel != nil {
|
|
||||||
if previousItem?.additionalBadgeLabel == nil {
|
|
||||||
self.labelBadgeNode.image = generateFilledRoundedRectImage(size: CGSize(width: 16.0, height: 16.0), cornerRadius: 5.0, color: presentationData.theme.list.itemCheckColors.fillColor)?.stretchableImage(withLeftCapWidth: 6, topCapHeight: 6)
|
|
||||||
}
|
|
||||||
if self.labelBadgeNode.supernode == nil {
|
|
||||||
self.insertSubnode(self.labelBadgeNode, belowSubnode: self.labelNode)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
self.labelBadgeNode.removeFromSupernode()
|
self.labelBadgeNode.removeFromSupernode()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if item.additionalBadgeLabel != nil {
|
||||||
|
if previousItem?.additionalBadgeLabel == nil {
|
||||||
|
let additionalLabelBadgeNode: ASImageNode
|
||||||
|
if let current = self.additionalLabelBadgeNode {
|
||||||
|
additionalLabelBadgeNode = current
|
||||||
|
} else {
|
||||||
|
additionalLabelBadgeNode = ASImageNode()
|
||||||
|
additionalLabelBadgeNode.isUserInteractionEnabled = false
|
||||||
|
self.additionalLabelBadgeNode = additionalLabelBadgeNode
|
||||||
|
self.insertSubnode(additionalLabelBadgeNode, belowSubnode: self.labelNode)
|
||||||
|
}
|
||||||
|
additionalLabelBadgeNode.image = generateFilledRoundedRectImage(size: CGSize(width: 16.0, height: 16.0), cornerRadius: 5.0, color: presentationData.theme.list.itemCheckColors.fillColor)?.stretchableImage(withLeftCapWidth: 6, topCapHeight: 6)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let additionalBadgeIcon = item.additionalBadgeIcon {
|
if let additionalBadgeIcon = item.additionalBadgeIcon {
|
||||||
let additionalLabelBadgeNode: ASImageNode
|
let additionalLabelBadgeNode: ASImageNode
|
||||||
if let current = self.additionalLabelBadgeNode {
|
if let current = self.additionalLabelBadgeNode {
|
||||||
@ -308,7 +316,7 @@ private final class PeerInfoScreenDisclosureItemNode: PeerInfoScreenItemNode {
|
|||||||
self.insertSubnode(additionalLabelBadgeNode, belowSubnode: self.labelNode)
|
self.insertSubnode(additionalLabelBadgeNode, belowSubnode: self.labelNode)
|
||||||
}
|
}
|
||||||
additionalLabelBadgeNode.image = additionalBadgeIcon
|
additionalLabelBadgeNode.image = additionalBadgeIcon
|
||||||
} else {
|
} else if item.additionalBadgeLabel == nil {
|
||||||
if let additionalLabelBadgeNode = self.additionalLabelBadgeNode {
|
if let additionalLabelBadgeNode = self.additionalLabelBadgeNode {
|
||||||
self.additionalLabelBadgeNode = nil
|
self.additionalLabelBadgeNode = nil
|
||||||
additionalLabelBadgeNode.removeFromSupernode()
|
additionalLabelBadgeNode.removeFromSupernode()
|
||||||
@ -352,8 +360,12 @@ private final class PeerInfoScreenDisclosureItemNode: PeerInfoScreenItemNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let additionalLabelBadgeNode = self.additionalLabelBadgeNode, let image = additionalLabelBadgeNode.image {
|
if let additionalLabelBadgeNode = self.additionalLabelBadgeNode, let image = additionalLabelBadgeNode.image {
|
||||||
let additionalLabelSize = image.size
|
if item.additionalBadgeLabel != nil, let additionalLabelNode = self.additionalLabelNode {
|
||||||
additionalLabelBadgeNode.frame = CGRect(origin: CGPoint(x: textFrame.maxX + 6.0, y: floor((height - additionalLabelSize.height) / 2.0) + 1.0), size: additionalLabelSize)
|
additionalLabelBadgeNode.frame = additionalLabelNode.frame.insetBy(dx: -4.0, dy: -2.0 + UIScreenPixel)
|
||||||
|
} else {
|
||||||
|
let additionalLabelSize = image.size
|
||||||
|
additionalLabelBadgeNode.frame = CGRect(origin: CGPoint(x: textFrame.maxX + 6.0, y: floor((height - additionalLabelSize.height) / 2.0) + 1.0), size: additionalLabelSize)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let labelBadgeNodeFrame: CGRect
|
let labelBadgeNodeFrame: CGRect
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user