mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 14:20:20 +00:00
[WIP] Channel appearance
This commit is contained in:
@@ -1043,11 +1043,18 @@ public final class EmojiStatusSelectionController: ViewController {
|
||||
sourceOrigin = CGPoint(x: layout.size.width / 2.0, y: floor(layout.size.height / 2.0 - componentSize.height))
|
||||
}
|
||||
|
||||
var componentFrame: CGRect
|
||||
let pointsToTop: Bool
|
||||
if sourceOrigin.y + 5.0 + componentSize.height > layout.size.height - layout.insets(options: []).bottom {
|
||||
sourceOrigin.y = layout.size.height - layout.insets(options: []).bottom - componentSize.height - 5.0
|
||||
componentFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - componentSize.width) / 2.0), y: sourceOrigin.y - 25.0 - componentSize.height), size: componentSize)
|
||||
pointsToTop = false
|
||||
} else {
|
||||
componentFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - componentSize.width) / 2.0), y: sourceOrigin.y + 5.0), size: componentSize)
|
||||
pointsToTop = true
|
||||
}
|
||||
if componentFrame.minY < layout.insets(options: [.statusBar]).top {
|
||||
componentFrame.origin.y = layout.insets(options: [.statusBar]).top
|
||||
}
|
||||
|
||||
let componentFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - componentSize.width) / 2.0), y: sourceOrigin.y + 5.0), size: componentSize)
|
||||
|
||||
if self.componentShadowLayer.bounds.size != componentFrame.size {
|
||||
let componentShadowPath = UIBezierPath(roundedRect: CGRect(origin: CGPoint(), size: componentFrame.size), cornerRadius: 24.0).cgPath
|
||||
@@ -1057,7 +1064,12 @@ public final class EmojiStatusSelectionController: ViewController {
|
||||
|
||||
let cloudOffset0: CGFloat = 30.0
|
||||
let cloudSize0: CGFloat = 16.0
|
||||
var cloudFrame0 = CGRect(origin: CGPoint(x: floor(sourceOrigin.x + cloudOffset0 - cloudSize0 / 2.0), y: componentFrame.minY - cloudSize0 / 2.0), size: CGSize(width: cloudSize0, height: cloudSize0))
|
||||
var cloudFrame0: CGRect
|
||||
if pointsToTop {
|
||||
cloudFrame0 = CGRect(origin: CGPoint(x: floor(sourceOrigin.x + cloudOffset0 - cloudSize0 / 2.0), y: componentFrame.minY - cloudSize0 / 2.0), size: CGSize(width: cloudSize0, height: cloudSize0))
|
||||
} else {
|
||||
cloudFrame0 = CGRect(origin: CGPoint(x: floor(sourceOrigin.x + cloudOffset0 - cloudSize0 / 2.0), y: componentFrame.maxY - cloudSize0 / 2.0), size: CGSize(width: cloudSize0, height: cloudSize0))
|
||||
}
|
||||
var invertX = false
|
||||
if cloudFrame0.maxX >= layout.size.width - layout.safeInsets.right - 32.0 {
|
||||
cloudFrame0.origin.x = floor(sourceOrigin.x - cloudSize0 - cloudOffset0 + cloudSize0 / 2.0)
|
||||
@@ -1074,7 +1086,12 @@ public final class EmojiStatusSelectionController: ViewController {
|
||||
|
||||
let cloudOffset1 = CGPoint(x: -9.0, y: -14.0)
|
||||
let cloudSize1: CGFloat = 8.0
|
||||
var cloudFrame1 = CGRect(origin: CGPoint(x: floor(cloudFrame0.midX + cloudOffset1.x - cloudSize1 / 2.0), y: floor(cloudFrame0.midY + cloudOffset1.y - cloudSize1 / 2.0)), size: CGSize(width: cloudSize1, height: cloudSize1))
|
||||
var cloudFrame1: CGRect
|
||||
if pointsToTop {
|
||||
cloudFrame1 = CGRect(origin: CGPoint(x: floor(cloudFrame0.midX + cloudOffset1.x - cloudSize1 / 2.0), y: floor(cloudFrame0.midY + cloudOffset1.y - cloudSize1 / 2.0)), size: CGSize(width: cloudSize1, height: cloudSize1))
|
||||
} else {
|
||||
cloudFrame1 = CGRect(origin: CGPoint(x: floor(cloudFrame0.midX + cloudOffset1.x - cloudSize1 / 2.0), y: floor(cloudFrame0.midY - cloudOffset1.y - cloudSize1 / 2.0)), size: CGSize(width: cloudSize1, height: cloudSize1))
|
||||
}
|
||||
if invertX {
|
||||
cloudFrame1.origin.x = floor(cloudFrame0.midX - cloudSize1 - cloudOffset1.x + cloudSize1 / 2.0)
|
||||
}
|
||||
@@ -1095,7 +1112,7 @@ public final class EmojiStatusSelectionController: ViewController {
|
||||
|
||||
let contentDuration: Double = 0.3
|
||||
let contentDelay: Double = 0.14
|
||||
let initialContentFrame = CGRect(origin: CGPoint(x: cloudFrame0.midX - 24.0, y: componentFrame.minY), size: CGSize(width: 24.0 * 2.0, height: 24.0 * 2.0))
|
||||
let initialContentFrame = CGRect(origin: CGPoint(x: cloudFrame0.midX - 24.0, y: pointsToTop ? componentFrame.minY : (componentFrame.maxY - 24.0 * 2.0)), size: CGSize(width: 24.0 * 2.0, height: 24.0 * 2.0))
|
||||
|
||||
if let emojiView = self.componentHost.findTaggedView(tag: EmojiPagerContentComponent.Tag(id: AnyHashable("emoji"))) as? EmojiPagerContentComponent.View {
|
||||
emojiView.animateIn(fromLocation: self.view.convert(initialContentFrame.center, to: emojiView))
|
||||
@@ -1103,7 +1120,7 @@ public final class EmojiStatusSelectionController: ViewController {
|
||||
|
||||
componentView.layer.animatePosition(from: initialContentFrame.center, to: componentFrame.center, duration: contentDuration, delay: contentDelay, timingFunction: kCAMediaTimingFunctionSpring)
|
||||
componentView.layer.animateBounds(from: CGRect(origin: CGPoint(x: -(componentFrame.minX - initialContentFrame.minX), y: -(componentFrame.minY - initialContentFrame.minY)), size: initialContentFrame.size), to: CGRect(origin: CGPoint(), size: componentFrame.size), duration: contentDuration, delay: contentDelay, timingFunction: kCAMediaTimingFunctionSpring)
|
||||
self.componentShadowLayer.animateFrame(from: CGRect(origin: CGPoint(x: cloudFrame0.midX - 24.0, y: componentFrame.minY), size: CGSize(width: 24.0 * 2.0, height: 24.0 * 2.0)), to: componentView.frame, duration: contentDuration, delay: contentDelay, timingFunction: kCAMediaTimingFunctionSpring)
|
||||
self.componentShadowLayer.animateFrame(from: CGRect(origin: CGPoint(x: cloudFrame0.midX - 24.0, y: pointsToTop ? componentFrame.minY : (componentFrame.maxY - 24.0 * 2.0)), size: CGSize(width: 24.0 * 2.0, height: 24.0 * 2.0)), to: componentView.frame, duration: contentDuration, delay: contentDelay, timingFunction: kCAMediaTimingFunctionSpring)
|
||||
componentView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.04, delay: contentDelay)
|
||||
self.componentShadowLayer.animateAlpha(from: 0.0, to: 1.0, duration: 0.04, delay: contentDelay)
|
||||
|
||||
@@ -1283,7 +1300,17 @@ public final class EmojiStatusSelectionController: ViewController {
|
||||
return
|
||||
}
|
||||
|
||||
if let _ = item, let destinationView = controller.destinationItemView() {
|
||||
var animateOutToView = false
|
||||
switch controller.mode {
|
||||
case .backgroundSelection, .customStatusSelection, .quickReactionSelection:
|
||||
if let itemFile = item?.itemFile, itemFile.fileId.id != 0 {
|
||||
animateOutToView = true
|
||||
}
|
||||
case .statusSelection:
|
||||
animateOutToView = true
|
||||
}
|
||||
|
||||
if animateOutToView, item != nil, let destinationView = controller.destinationItemView() {
|
||||
if let snapshotView = destinationView.snapshotView(afterScreenUpdates: false) {
|
||||
snapshotView.frame = destinationView.frame
|
||||
destinationView.superview?.insertSubview(snapshotView, belowSubview: destinationView)
|
||||
@@ -1299,7 +1326,9 @@ public final class EmojiStatusSelectionController: ViewController {
|
||||
let _ = (self.context.engine.accountData.setEmojiStatus(file: item?.itemFile, expirationDate: nil)
|
||||
|> deliverOnMainQueue).start()
|
||||
case let .backgroundSelection(completion):
|
||||
completion(item?.itemFile?.fileId.id)
|
||||
completion(item?.itemFile)
|
||||
case let .customStatusSelection(completion):
|
||||
completion(item?.itemFile, nil)
|
||||
case let .quickReactionSelection(completion):
|
||||
if let item = item, let itemFile = item.itemFile {
|
||||
var selectedReaction: MessageReaction.Reaction?
|
||||
@@ -1325,7 +1354,7 @@ public final class EmojiStatusSelectionController: ViewController {
|
||||
completion()
|
||||
}
|
||||
|
||||
if let item = item, let destinationView = controller.destinationItemView() {
|
||||
if animateOutToView, let item = item, let destinationView = controller.destinationItemView() {
|
||||
var emojiString: String?
|
||||
if let itemFile = item.itemFile {
|
||||
attributeLoop: for attribute in itemFile.attributes {
|
||||
@@ -1385,7 +1414,8 @@ public final class EmojiStatusSelectionController: ViewController {
|
||||
|
||||
public enum Mode {
|
||||
case statusSelection
|
||||
case backgroundSelection(completion: (Int64?) -> Void)
|
||||
case backgroundSelection(completion: (TelegramMediaFile?) -> Void)
|
||||
case customStatusSelection(completion: (TelegramMediaFile?, Int32?) -> Void)
|
||||
case quickReactionSelection(completion: () -> Void)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user