diff --git a/submodules/ChatListUI/Sources/ChatListSearchFiltersContainerNode.swift b/submodules/ChatListUI/Sources/ChatListSearchFiltersContainerNode.swift index d647105d71..1a85fa03dd 100644 --- a/submodules/ChatListUI/Sources/ChatListSearchFiltersContainerNode.swift +++ b/submodules/ChatListUI/Sources/ChatListSearchFiltersContainerNode.swift @@ -353,14 +353,25 @@ final class ChatListSearchFiltersContainerNode: ASDisplayNode { let paneFrame = CGRect(origin: CGPoint(x: leftOffset, y: floor((size.height - paneNodeSize.height) / 2.0) + verticalOffset), size: paneNodeSize) - if wasAdded { + var effectiveWasAdded = wasAdded + if !effectiveWasAdded && !self.bounds.intersects(self.scrollNode.convert(paneNode.frame, to: self)) && self.bounds.intersects(self.scrollNode.convert(paneFrame, to: self)) { + effectiveWasAdded = true + } + + if effectiveWasAdded { paneNode.frame = paneFrame paneNode.alpha = 0.0 paneNode.subnodeTransform = CATransform3DMakeScale(0.1, 0.1, 1.0) itemNodeTransition.updateSublayerTransformScale(node: paneNode, scale: 1.0) itemNodeTransition.updateAlpha(node: paneNode, alpha: 1.0) } else { - itemNodeTransition.updateFrameAdditive(node: paneNode, frame: paneFrame) + if self.bounds.intersects(self.scrollNode.convert(paneFrame, to: self)) { + itemNodeTransition.updateFrameAdditive(node: paneNode, frame: paneFrame) + } else { + paneNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.4) { [weak paneNode] _ in + paneNode?.frame = paneFrame + } + } } paneNode.updateArea(size: paneFrame.size, sideInset: spacing / 2.0, transition: itemNodeTransition) diff --git a/submodules/GalleryUI/Sources/GalleryTitleView.swift b/submodules/GalleryUI/Sources/GalleryTitleView.swift index 53848f00a4..89ceb199e5 100644 --- a/submodules/GalleryUI/Sources/GalleryTitleView.swift +++ b/submodules/GalleryUI/Sources/GalleryTitleView.swift @@ -44,8 +44,8 @@ final class GalleryTitleView: UIView, NavigationBarTitleView { let leftInset: CGFloat = 0.0 let rightInset: CGFloat = 0.0 - let authorNameSize = self.authorNameNode.measure(CGSize(width: size.width - 44.0 * 2.0 - 8.0 * 2.0 - leftInset - rightInset, height: CGFloat.greatestFiniteMagnitude)) - let dateSize = self.dateNode.measure(CGSize(width: size.width - 44.0 * 2.0 - 8.0 * 2.0, height: CGFloat.greatestFiniteMagnitude)) + let authorNameSize = self.authorNameNode.measure(CGSize(width: size.width - 8.0 * 2.0 - leftInset - rightInset, height: CGFloat.greatestFiniteMagnitude)) + let dateSize = self.dateNode.measure(CGSize(width: size.width - 8.0 * 2.0, height: CGFloat.greatestFiniteMagnitude)) if authorNameSize.height.isZero { self.dateNode.frame = CGRect(origin: CGPoint(x: floor((size.width - dateSize.width) / 2.0), y: floor((size.height - dateSize.height) / 2.0)), size: dateSize) diff --git a/submodules/SearchBarNode/Sources/SearchBarNode.swift b/submodules/SearchBarNode/Sources/SearchBarNode.swift index 32b0a74f1f..1b742bf801 100644 --- a/submodules/SearchBarNode/Sources/SearchBarNode.swift +++ b/submodules/SearchBarNode/Sources/SearchBarNode.swift @@ -70,6 +70,7 @@ private final class TokenNode: ASDisplayNode { self.theme = theme self.token = token self.containerNode = ASDisplayNode() + self.containerNode.clipsToBounds = true self.iconNode = ASImageNode() self.iconNode.displaysAsynchronously = false self.iconNode.displayWithoutProcessing = true @@ -112,6 +113,8 @@ private final class TokenNode: ASDisplayNode { func animateIn() { let targetFrame = self.containerNode.frame self.containerNode.layer.animateFrame(from: CGRect(origin: targetFrame.origin, size: CGSize(width: 1.0, height: targetFrame.height)), to: targetFrame, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) + self.backgroundNode.layer.animateFrame(from: CGRect(origin: targetFrame.origin, size: CGSize(width: 1.0, height: targetFrame.height)), to: targetFrame, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) + self.iconNode.layer.animateScale(from: 0.1, to: 1.0, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) self.iconNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.15) self.titleNode.layer.animateScale(from: 0.1, to: 1.0, duration: 0.3, timingFunction: kCAMediaTimingFunctionSpring) @@ -422,9 +425,14 @@ private class SearchBarTextField: UITextField, UIScrollViewDelegate { } } + private weak var _scrollView: UIScrollView? var scrollView: UIScrollView? { + if let scrollView = self._scrollView { + return scrollView + } for view in self.subviews { if let scrollView = view as? UIScrollView { + _scrollView = scrollView return scrollView } } @@ -462,8 +470,10 @@ private class SearchBarTextField: UITextField, UIScrollViewDelegate { return CGRect(origin: CGPoint(), size: CGSize()) } var rect = bounds.insetBy(dx: 7.0, dy: 4.0) - rect.origin.y += 1.0 - + if #available(iOS 14.0, *) { + } else { + rect.origin.y += 1.0 + } let prefixSize = self.measurePrefixLabel.updateLayout(CGSize(width: floor(bounds.size.width * 0.7), height: bounds.size.height)) if !prefixSize.width.isZero { let prefixOffset = prefixSize.width + 3.0 @@ -497,13 +507,19 @@ private class SearchBarTextField: UITextField, UIScrollViewDelegate { textOffset += 2.0 } + var placeholderOffset: CGFloat = 0.0 + if #available(iOS 14.0, *) { + placeholderOffset = 1.0 + } else { + } + let textRect = self.textRect(forBounds: bounds) let labelSize = self.placeholderLabel.updateLayout(textRect.size) - self.placeholderLabel.frame = CGRect(origin: CGPoint(x: textRect.minX, y: textRect.minY + textOffset), size: labelSize) + self.placeholderLabel.frame = CGRect(origin: CGPoint(x: textRect.minX, y: textRect.minY + textOffset + placeholderOffset), size: labelSize) let prefixSize = self.prefixLabel.updateLayout(CGSize(width: floor(bounds.size.width * 0.7), height: bounds.size.height)) let prefixBounds = bounds.insetBy(dx: 4.0, dy: 4.0) - self.prefixLabel.frame = CGRect(origin: CGPoint(x: prefixBounds.minX, y: prefixBounds.minY + textOffset), size: prefixSize) + self.prefixLabel.frame = CGRect(origin: CGPoint(x: prefixBounds.minX, y: prefixBounds.minY + textOffset + placeholderOffset), size: prefixSize) } override func deleteBackward() { @@ -1095,21 +1111,19 @@ public class SearchBarNode: ASDisplayNode, UITextFieldDelegate { private func updateIsEmpty(animated: Bool = false) { let isEmpty = (self.textField.text?.isEmpty ?? true) && self.tokens.isEmpty - + let transition: ContainedViewLayoutTransition = animated ? .animated(duration: 0.3, curve: .spring) : .immediate let placeholderTransition = !isEmpty ? .immediate : transition placeholderTransition.updateAlpha(node: self.textField.placeholderLabel, alpha: isEmpty ? 1.0 : 0.0) - + let clearIsHidden = isEmpty && self.prefixString == nil - transition.updateAlpha(node: self.clearButton, alpha: clearIsHidden ? 0.0 : 1.0) + transition.updateAlpha(node: self.clearButton.imageNode, alpha: clearIsHidden ? 0.0 : 1.0) transition.updateTransformScale(node: self.clearButton, scale: clearIsHidden ? 0.2 : 1.0) self.clearButton.isUserInteractionEnabled = !clearIsHidden } @objc private func cancelPressed() { - if let cancel = self.cancel { - cancel() - } + self.cancel?() } @objc private func clearPressed() { diff --git a/submodules/TelegramCore/Sources/SearchMessages.swift b/submodules/TelegramCore/Sources/SearchMessages.swift index 69a70251ce..ce30fb2c06 100644 --- a/submodules/TelegramCore/Sources/SearchMessages.swift +++ b/submodules/TelegramCore/Sources/SearchMessages.swift @@ -238,7 +238,7 @@ public func searchMessages(account: Account, location: SearchMessagesLocation, q } else { let lowerBound = state?.main.messages.last.flatMap({ $0.index }) let signal: Signal - if peer.id.namespace == Namespaces.Peer.CloudChannel && query.isEmpty && tags == nil && minDate == nil && maxDate == nil { + if peer.id.namespace == Namespaces.Peer.CloudChannel && query.isEmpty && fromId == nil && tags == nil && minDate == nil && maxDate == nil { signal = account.network.request(Api.functions.messages.getHistory(peer: inputPeer, offsetId: lowerBound?.id.id ?? 0, offsetDate: 0, addOffset: 0, limit: limit, maxId: Int32.max - 1, minId: 0, hash: 0)) } else { signal = account.network.request(Api.functions.messages.search(flags: flags, peer: inputPeer, q: query, fromId: fromInputUser, topMsgId: topMsgId?.id, filter: filter, minDate: minDate ?? 0, maxDate: maxDate ?? (Int32.max - 1), offsetId: lowerBound?.id.id ?? 0, addOffset: 0, limit: limit, maxId: Int32.max - 1, minId: 0, hash: 0))