mirror of
https://github.com/vector-im/element-ios.git
synced 2024-09-29 07:42:40 +00:00
swipe animation improvements
This commit is contained in:
parent
c378a33b8f
commit
75d1e1a0ae
4 changed files with 21 additions and 10 deletions
|
@ -118,8 +118,6 @@ extern NSTimeInterval const kResizeComposerAnimationDuration;
|
||||||
|
|
||||||
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray<NSLayoutConstraint*> *toolbarContainerConstraints;
|
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray<NSLayoutConstraint*> *toolbarContainerConstraints;
|
||||||
|
|
||||||
@property (nonatomic, assign) CGFloat originalMaximisedWysiwygHeight;
|
|
||||||
|
|
||||||
@property (strong, nonatomic, nullable) UIView* maximisedToolbarDimmingView;
|
@property (strong, nonatomic, nullable) UIView* maximisedToolbarDimmingView;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -247,22 +247,23 @@ private extension RoomViewController {
|
||||||
guard let wysiwygInputToolbar = wysiwygInputToolbar else { return }
|
guard let wysiwygInputToolbar = wysiwygInputToolbar else { return }
|
||||||
switch sender.state {
|
switch sender.state {
|
||||||
case .began:
|
case .began:
|
||||||
originalMaximisedWysiwygHeight = wysiwygInputToolbar.idealHeight
|
break
|
||||||
case .changed:
|
case .changed:
|
||||||
let translation = sender.translation(in: view)
|
let translation = sender.translation(in: view)
|
||||||
guard wysiwygInputToolbar.idealHeight - translation.y < originalMaximisedWysiwygHeight else { return }
|
let translatedValue = wysiwygInputToolbar.maxExpandedHeight - translation.y
|
||||||
wysiwygInputToolbar.idealHeight = originalMaximisedWysiwygHeight - translation.y
|
guard translatedValue <= wysiwygInputToolbar.maxExpandedHeight, translatedValue >= wysiwygInputToolbar.compressedHeight else { return }
|
||||||
|
wysiwygInputToolbar.idealHeight = translatedValue
|
||||||
case .ended:
|
case .ended:
|
||||||
if wysiwygInputToolbar.idealHeight < originalMaximisedWysiwygHeight * 0.5 {
|
if wysiwygInputToolbar.idealHeight <= wysiwygInputToolbar.maxCompressedHeight {
|
||||||
wysiwygInputToolbar.minimise()
|
wysiwygInputToolbar.minimise()
|
||||||
} else {
|
} else {
|
||||||
wysiwygInputToolbar.idealHeight = self.originalMaximisedWysiwygHeight
|
wysiwygInputToolbar.idealHeight = wysiwygInputToolbar.maxExpandedHeight
|
||||||
UIView.animate(withDuration: 0.3, delay: 0.0, options: [.curveEaseInOut]) {
|
UIView.animate(withDuration: 0.3, delay: 0.0, options: [.curveEaseInOut]) {
|
||||||
wysiwygInputToolbar.layoutIfNeeded()
|
wysiwygInputToolbar.layoutIfNeeded()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case .cancelled:
|
case .cancelled:
|
||||||
wysiwygInputToolbar.idealHeight = self.originalMaximisedWysiwygHeight
|
wysiwygInputToolbar.idealHeight = wysiwygInputToolbar.maxExpandedHeight
|
||||||
UIView.animate(withDuration: 0.3, delay: 0.0, options: [.curveEaseInOut]) {
|
UIView.animate(withDuration: 0.3, delay: 0.0, options: [.curveEaseInOut]) {
|
||||||
wysiwygInputToolbar.layoutIfNeeded()
|
wysiwygInputToolbar.layoutIfNeeded()
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp
|
||||||
private var cancellables = Set<AnyCancellable>()
|
private var cancellables = Set<AnyCancellable>()
|
||||||
private var heightConstraint: NSLayoutConstraint!
|
private var heightConstraint: NSLayoutConstraint!
|
||||||
private var hostingViewController: VectorHostingController!
|
private var hostingViewController: VectorHostingController!
|
||||||
private var wysiwygViewModel = WysiwygComposerViewModel(textColor: ThemeService.shared().theme.colors.primaryContent)
|
private var wysiwygViewModel = WysiwygComposerViewModel(minHeight: 22, textColor: ThemeService.shared().theme.colors.primaryContent)
|
||||||
private var viewModel: ComposerViewModelProtocol = ComposerViewModel(
|
private var viewModel: ComposerViewModelProtocol = ComposerViewModel(
|
||||||
initialViewState: ComposerViewState(textFormattingEnabled: RiotSettings.shared.enableWysiwygTextFormatting,
|
initialViewState: ComposerViewState(textFormattingEnabled: RiotSettings.shared.enableWysiwygTextFormatting,
|
||||||
bindings: ComposerBindings(focused: false)))
|
bindings: ComposerBindings(focused: false)))
|
||||||
|
@ -74,6 +74,18 @@ class WysiwygInputToolbarView: MXKRoomInputToolbarView, NibLoadable, HtmlRoomInp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var compressedHeight: CGFloat {
|
||||||
|
wysiwygViewModel.compressedHeight
|
||||||
|
}
|
||||||
|
|
||||||
|
var maxExpandedHeight: CGFloat {
|
||||||
|
wysiwygViewModel.maxExpandedHeight
|
||||||
|
}
|
||||||
|
|
||||||
|
var maxCompressedHeight: CGFloat {
|
||||||
|
wysiwygViewModel.maxCompressedHeight
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Setup
|
// MARK: - Setup
|
||||||
|
|
||||||
override class func instantiate() -> MXKRoomInputToolbarView! {
|
override class func instantiate() -> MXKRoomInputToolbarView! {
|
||||||
|
|
|
@ -29,7 +29,7 @@ struct Composer: View {
|
||||||
|
|
||||||
private let horizontalPadding: CGFloat = 12
|
private let horizontalPadding: CGFloat = 12
|
||||||
private let borderHeight: CGFloat = 40
|
private let borderHeight: CGFloat = 40
|
||||||
private let minTextViewHeight: CGFloat = 20
|
private let minTextViewHeight: CGFloat = 22
|
||||||
private var verticalPadding: CGFloat {
|
private var verticalPadding: CGFloat {
|
||||||
(borderHeight - minTextViewHeight) / 2
|
(borderHeight - minTextViewHeight) / 2
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue