mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Video avatar fixes
This commit is contained in:
parent
c4229494e8
commit
6f4d9df1a3
@ -78,14 +78,17 @@ final class MultiScaleTextNode: ASDisplayNode {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func update(stateFractions: [AnyHashable: CGFloat], transition: ContainedViewLayoutTransition) {
|
func update(stateFractions: [AnyHashable: CGFloat], alpha: CGFloat = 1.0, transition: ContainedViewLayoutTransition) {
|
||||||
var fractionSum: CGFloat = 0.0
|
var fractionSum: CGFloat = 0.0
|
||||||
for (_, fraction) in stateFractions {
|
for (_, fraction) in stateFractions {
|
||||||
fractionSum += fraction
|
fractionSum += fraction
|
||||||
}
|
}
|
||||||
for (key, fraction) in stateFractions {
|
for (key, fraction) in stateFractions {
|
||||||
if let node = self.stateNodes[key], let nodeLayout = node.currentLayout {
|
if let node = self.stateNodes[key], let _ = node.currentLayout {
|
||||||
transition.updateAlpha(node: node, alpha: fraction / fractionSum)
|
if !transition.isAnimated {
|
||||||
|
node.layer.removeAllAnimations()
|
||||||
|
}
|
||||||
|
transition.updateAlpha(node: node, alpha: fraction / fractionSum * alpha)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2130,11 +2130,13 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
self.subtitleNodeRawContainer = ASDisplayNode()
|
self.subtitleNodeRawContainer = ASDisplayNode()
|
||||||
self.subtitleNode = MultiScaleTextNode(stateKeys: [TitleNodeStateRegular, TitleNodeStateExpanded])
|
self.subtitleNode = MultiScaleTextNode(stateKeys: [TitleNodeStateRegular, TitleNodeStateExpanded])
|
||||||
self.subtitleNode.displaysAsynchronously = false
|
self.subtitleNode.displaysAsynchronously = false
|
||||||
|
self.subtitleNode.allowsGroupOpacity = true
|
||||||
|
|
||||||
self.usernameNodeContainer = ASDisplayNode()
|
self.usernameNodeContainer = ASDisplayNode()
|
||||||
self.usernameNodeRawContainer = ASDisplayNode()
|
self.usernameNodeRawContainer = ASDisplayNode()
|
||||||
self.usernameNode = MultiScaleTextNode(stateKeys: [TitleNodeStateRegular, TitleNodeStateExpanded])
|
self.usernameNode = MultiScaleTextNode(stateKeys: [TitleNodeStateRegular, TitleNodeStateExpanded])
|
||||||
self.usernameNode.displaysAsynchronously = false
|
self.usernameNode.displaysAsynchronously = false
|
||||||
|
self.usernameNode.allowsGroupOpacity = true
|
||||||
|
|
||||||
self.regularContentNode = PeerInfoHeaderRegularContentNode()
|
self.regularContentNode = PeerInfoHeaderRegularContentNode()
|
||||||
var requestUpdateLayoutImpl: (() -> Void)?
|
var requestUpdateLayoutImpl: (() -> Void)?
|
||||||
@ -2330,7 +2332,7 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
if self.isSettings, let user = peer as? TelegramUser {
|
if self.isSettings, let user = peer as? TelegramUser {
|
||||||
let formattedPhone = formatPhoneNumber(user.phone ?? "")
|
let formattedPhone = formatPhoneNumber(user.phone ?? "")
|
||||||
subtitleString = NSAttributedString(string: formattedPhone, font: Font.regular(15.0), textColor: presentationData.theme.list.itemSecondaryTextColor)
|
subtitleString = NSAttributedString(string: formattedPhone, font: Font.regular(15.0), textColor: presentationData.theme.list.itemSecondaryTextColor)
|
||||||
usernameString = NSAttributedString(string: user.addressName.flatMap { "@\($0)" } ?? "", font: Font.regular(15.0), textColor: presentationData.theme.list.itemAccentColor)
|
usernameString = NSAttributedString(string: user.addressName.flatMap { "@superlongusernamehere\($0)" } ?? "", font: Font.regular(15.0), textColor: presentationData.theme.list.itemAccentColor)
|
||||||
} else if let statusData = statusData {
|
} else if let statusData = statusData {
|
||||||
let subtitleColor: UIColor
|
let subtitleColor: UIColor
|
||||||
if statusData.isActivity {
|
if statusData.isActivity {
|
||||||
@ -2369,22 +2371,7 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
TitleNodeStateRegular: MultiScaleTextState(attributedText: usernameString, constrainedSize: CGSize(width: titleConstrainedSize.width, height: titleConstrainedSize.height)),
|
TitleNodeStateRegular: MultiScaleTextState(attributedText: usernameString, constrainedSize: CGSize(width: titleConstrainedSize.width, height: titleConstrainedSize.height)),
|
||||||
TitleNodeStateExpanded: MultiScaleTextState(attributedText: usernameString, constrainedSize: CGSize(width: width - titleNodeLayout[TitleNodeStateExpanded]!.size.width - 8.0, height: titleConstrainedSize.height))
|
TitleNodeStateExpanded: MultiScaleTextState(attributedText: usernameString, constrainedSize: CGSize(width: width - titleNodeLayout[TitleNodeStateExpanded]!.size.width - 8.0, height: titleConstrainedSize.height))
|
||||||
], mainState: TitleNodeStateRegular)
|
], mainState: TitleNodeStateRegular)
|
||||||
|
|
||||||
self.titleNode.update(stateFractions: [
|
|
||||||
TitleNodeStateRegular: self.isAvatarExpanded ? 0.0 : 1.0,
|
|
||||||
TitleNodeStateExpanded: self.isAvatarExpanded ? 1.0 : 0.0
|
|
||||||
], transition: transition)
|
|
||||||
|
|
||||||
self.subtitleNode.update(stateFractions: [
|
|
||||||
TitleNodeStateRegular: self.isAvatarExpanded ? 0.0 : 1.0,
|
|
||||||
TitleNodeStateExpanded: self.isAvatarExpanded ? 1.0 : 0.0
|
|
||||||
], transition: transition)
|
|
||||||
|
|
||||||
self.usernameNode.update(stateFractions: [
|
|
||||||
TitleNodeStateRegular: self.isAvatarExpanded ? 0.0 : 1.0,
|
|
||||||
TitleNodeStateExpanded: self.isAvatarExpanded ? 1.0 : 0.0
|
|
||||||
], transition: transition)
|
|
||||||
|
|
||||||
let avatarSize: CGFloat = isModalOverlay ? 200.0 : 100.0
|
let avatarSize: CGFloat = isModalOverlay ? 200.0 : 100.0
|
||||||
let avatarFrame = CGRect(origin: CGPoint(x: floor((width - avatarSize) / 2.0), y: statusBarHeight + 10.0), size: CGSize(width: avatarSize, height: avatarSize))
|
let avatarFrame = CGRect(origin: CGPoint(x: floor((width - avatarSize) / 2.0), y: statusBarHeight + 10.0), size: CGSize(width: avatarSize, height: avatarSize))
|
||||||
let avatarCenter = CGPoint(x: (1.0 - transitionFraction) * avatarFrame.midX + transitionFraction * transitionSourceAvatarFrame.midX, y: (1.0 - transitionFraction) * avatarFrame.midY + transitionFraction * transitionSourceAvatarFrame.midY)
|
let avatarCenter = CGPoint(x: (1.0 - transitionFraction) * avatarFrame.midX + transitionFraction * transitionSourceAvatarFrame.midX, y: (1.0 - transitionFraction) * avatarFrame.midY + transitionFraction * transitionSourceAvatarFrame.midY)
|
||||||
@ -2406,6 +2393,7 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
let subtitleFrame: CGRect
|
let subtitleFrame: CGRect
|
||||||
let usernameFrame: CGRect
|
let usernameFrame: CGRect
|
||||||
let usernameSpacing: CGFloat = 4.0
|
let usernameSpacing: CGFloat = 4.0
|
||||||
|
var twoLineInfo = false
|
||||||
if self.isAvatarExpanded {
|
if self.isAvatarExpanded {
|
||||||
let minTitleSize = CGSize(width: titleSize.width * 0.7, height: titleSize.height * 0.7)
|
let minTitleSize = CGSize(width: titleSize.width * 0.7, height: titleSize.height * 0.7)
|
||||||
let minTitleFrame = CGRect(origin: CGPoint(x: 16.0, y: expandedAvatarHeight - expandedAvatarControlsHeight + 9.0 + (subtitleSize.height.isZero ? 10.0 : 0.0)), size: minTitleSize)
|
let minTitleFrame = CGRect(origin: CGPoint(x: 16.0, y: expandedAvatarHeight - expandedAvatarControlsHeight + 9.0 + (subtitleSize.height.isZero ? 10.0 : 0.0)), size: minTitleSize)
|
||||||
@ -2416,9 +2404,11 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
titleFrame = CGRect(origin: CGPoint(x: floor((width - titleSize.width) / 2.0), y: avatarFrame.maxY + 10.0 + (subtitleSize.height.isZero ? 11.0 : 0.0)), size: titleSize)
|
titleFrame = CGRect(origin: CGPoint(x: floor((width - titleSize.width) / 2.0), y: avatarFrame.maxY + 10.0 + (subtitleSize.height.isZero ? 11.0 : 0.0)), size: titleSize)
|
||||||
|
|
||||||
let totalSubtitleWidth = subtitleSize.width + usernameSpacing + usernameSize.width
|
let totalSubtitleWidth = subtitleSize.width + usernameSpacing + usernameSize.width
|
||||||
if usernameSize.width == 0.0 || totalSubtitleWidth > width - textSideInset * 2.0 {
|
twoLineInfo = totalSubtitleWidth > width - textSideInset * 2.0
|
||||||
|
if usernameSize.width == 0.0 || twoLineInfo {
|
||||||
subtitleFrame = CGRect(origin: CGPoint(x: floor((width - subtitleSize.width) / 2.0), y: titleFrame.maxY + 1.0), size: subtitleSize)
|
subtitleFrame = CGRect(origin: CGPoint(x: floor((width - subtitleSize.width) / 2.0), y: titleFrame.maxY + 1.0), size: subtitleSize)
|
||||||
usernameFrame = CGRect(origin: CGPoint(x: floor((width - usernameSize.width) / 2.0), y: subtitleFrame.maxY + 1.0), size: usernameSize)
|
usernameFrame = CGRect(origin: CGPoint(x: floor((width - usernameSize.width) / 2.0), y: subtitleFrame.maxY + 1.0), size: usernameSize)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
subtitleFrame = CGRect(origin: CGPoint(x: floor((width - totalSubtitleWidth) / 2.0), y: titleFrame.maxY + 1.0), size: subtitleSize)
|
subtitleFrame = CGRect(origin: CGPoint(x: floor((width - totalSubtitleWidth) / 2.0), y: titleFrame.maxY + 1.0), size: subtitleSize)
|
||||||
usernameFrame = CGRect(origin: CGPoint(x: subtitleFrame.maxX + usernameSpacing, y: titleFrame.maxY + 1.0), size: usernameSize)
|
usernameFrame = CGRect(origin: CGPoint(x: subtitleFrame.maxX + usernameSpacing, y: titleFrame.maxY + 1.0), size: usernameSize)
|
||||||
@ -2439,6 +2429,22 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
|
|
||||||
let apparentTitleLockOffset = (1.0 - titleCollapseFraction) * 0.0 + titleCollapseFraction * titleMaxLockOffset
|
let apparentTitleLockOffset = (1.0 - titleCollapseFraction) * 0.0 + titleCollapseFraction * titleMaxLockOffset
|
||||||
|
|
||||||
|
self.titleNode.update(stateFractions: [
|
||||||
|
TitleNodeStateRegular: self.isAvatarExpanded ? 0.0 : 1.0,
|
||||||
|
TitleNodeStateExpanded: self.isAvatarExpanded ? 1.0 : 0.0
|
||||||
|
], transition: transition)
|
||||||
|
|
||||||
|
let subtitleAlpha: CGFloat = self.isSettings ? 1.0 - titleCollapseFraction : 1.0
|
||||||
|
self.subtitleNode.update(stateFractions: [
|
||||||
|
TitleNodeStateRegular: self.isAvatarExpanded ? 0.0 : 1.0,
|
||||||
|
TitleNodeStateExpanded: self.isAvatarExpanded ? 1.0 : 0.0
|
||||||
|
], alpha: subtitleAlpha, transition: transition)
|
||||||
|
|
||||||
|
self.usernameNode.update(stateFractions: [
|
||||||
|
TitleNodeStateRegular: self.isAvatarExpanded ? 0.0 : 1.0,
|
||||||
|
TitleNodeStateExpanded: self.isAvatarExpanded ? 1.0 : 0.0
|
||||||
|
], alpha: subtitleAlpha, transition: transition)
|
||||||
|
|
||||||
let avatarScale: CGFloat
|
let avatarScale: CGFloat
|
||||||
let avatarOffset: CGFloat
|
let avatarOffset: CGFloat
|
||||||
if self.navigationTransition != nil {
|
if self.navigationTransition != nil {
|
||||||
@ -2548,7 +2554,10 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
|
|
||||||
self.avatarListNode.listContainerNode.update(size: expandedAvatarListSize, peer: peer, isExpanded: self.isAvatarExpanded, transition: transition)
|
self.avatarListNode.listContainerNode.update(size: expandedAvatarListSize, peer: peer, isExpanded: self.isAvatarExpanded, transition: transition)
|
||||||
|
|
||||||
let panelWithAvatarHeight: CGFloat = (self.isSettings ? 40.0 : 112.0) + avatarSize
|
var panelWithAvatarHeight: CGFloat = (self.isSettings ? 40.0 : 112.0) + avatarSize
|
||||||
|
if twoLineInfo {
|
||||||
|
panelWithAvatarHeight += 7.0
|
||||||
|
}
|
||||||
let buttonsCollapseStart = titleCollapseOffset
|
let buttonsCollapseStart = titleCollapseOffset
|
||||||
let buttonsCollapseEnd = panelWithAvatarHeight - (navigationHeight - statusBarHeight) + 10.0
|
let buttonsCollapseEnd = panelWithAvatarHeight - (navigationHeight - statusBarHeight) + 10.0
|
||||||
|
|
||||||
@ -2593,10 +2602,7 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
transition.updateSublayerTransformScale(node: self.titleNodeContainer, scale: titleScale)
|
transition.updateSublayerTransformScale(node: self.titleNodeContainer, scale: titleScale)
|
||||||
transition.updateSublayerTransformScale(node: self.subtitleNodeContainer, scale: subtitleScale)
|
transition.updateSublayerTransformScale(node: self.subtitleNodeContainer, scale: subtitleScale)
|
||||||
transition.updateSublayerTransformScale(node: self.usernameNodeContainer, scale: subtitleScale)
|
transition.updateSublayerTransformScale(node: self.usernameNodeContainer, scale: subtitleScale)
|
||||||
if self.isSettings {
|
|
||||||
transition.updateAlpha(node: self.subtitleNode, alpha: 1.0 - titleCollapseFraction, beginWithCurrentState: true)
|
|
||||||
transition.updateAlpha(node: self.usernameNode, alpha: 1.0 - titleCollapseFraction, beginWithCurrentState: true)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
let titleScale: CGFloat
|
let titleScale: CGFloat
|
||||||
let subtitleScale: CGFloat
|
let subtitleScale: CGFloat
|
||||||
@ -2629,10 +2635,6 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
transition.updateSublayerTransformScaleAdditive(node: self.titleNodeContainer, scale: titleScale)
|
transition.updateSublayerTransformScaleAdditive(node: self.titleNodeContainer, scale: titleScale)
|
||||||
transition.updateSublayerTransformScaleAdditive(node: self.subtitleNodeContainer, scale: subtitleScale)
|
transition.updateSublayerTransformScaleAdditive(node: self.subtitleNodeContainer, scale: subtitleScale)
|
||||||
transition.updateSublayerTransformScaleAdditive(node: self.usernameNodeContainer, scale: subtitleScale)
|
transition.updateSublayerTransformScaleAdditive(node: self.usernameNodeContainer, scale: subtitleScale)
|
||||||
if self.isSettings {
|
|
||||||
transition.updateAlpha(node: self.subtitleNode, alpha: 1.0 - titleCollapseFraction, beginWithCurrentState: true)
|
|
||||||
transition.updateAlpha(node: self.usernameNode, alpha: 1.0 - titleCollapseFraction, beginWithCurrentState: true)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user