我正在尝试模仿Line Messenger应用程序(在日本实际上是Messenger应用程序)中的一种行为。
基本上,它们具有内部带有滚动视图的模态视图控制器。当滚动动作到达其内容的顶部时,视图控制器将无缝切换到交互式解雇动画。同样,当手势将视图返回到屏幕顶部时,控件将返回到滚动视图。
这是它外观的Gif。
对于我的一生,我不知道他们是如何做到的。我尝试了几种不同的方法,但是它们都失败了,而且我没有主意。谁能指出我正确的方向?
编辑2
要澄清的是,我要模仿的行为不仅仅是将窗口向下拖动。我可以做到,没问题。
我想知道相同的滚动手势(不松开手指)如何触发撤消过渡,然后在视图被拖动回到原始位置后将控制权转移回滚动视图。
这是我不知道的部分。
结束EDIT2
编辑1
到目前为止,这就是我所拥有的。我能够使用滚动视图委托方法来添加可处理常规解雇动画的目标选择器,但仍无法按预期工作。
我创建了一个UIViewController有UIWebView作为的属性。然后,我将其放入,以UINavigationController模态形式显示。
导航控制器将动画/过渡控制器用于常规的交互式解雇(可以通过在导航栏上进行手势来完成)。
从这里开始,一切正常,但是无法从滚动视图中触发解雇。
NavigationController.h
@interface NavigationController : UINavigationController <UIViewControllerTransitioningDelegate>
@property (nonatomic, strong) UIPanGestureRecognizer *gestureRecog;
- (void)handleGesture:(UIPanGestureRecognizer*)gestureRecognizer;
@end
Run Code Online (Sandbox Code Playgroud)
NavigationController.m
#import "NavigationController.h"
#import "AnimationController.h"
#import "TransitionController.h"
@implementation NavigationController {
AnimationController *_animator;
TransitionController *_interactor;
}
- (instancetype)init {
self = [super init];
self.transitioningDelegate = self;
_animator = [[AnimationController alloc] init];
_interactor = [[TransitionController alloc] init];
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Set …Run Code Online (Sandbox Code Playgroud) 我的应用程序使用一个返回 JSON 的服务器,如下所示:
{
"result":"OK",
"data":{
// Common to all URLs
"user": {
"name":"John Smith" // ETC...
},
// Different for each URL
"data_for_this_url":0
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,特定于 URL 的信息与通用user词典存在于同一词典中。
目标:
user很常见,我希望它位于顶级类/结构中。data从顶级user信息和子对象的信息重新创建字典)问题:
重新编码数据时,我无法将user字典(来自顶级对象)和特定于 URL 的数据(来自子对象)写入编码器。
要么user覆盖其他数据,要么其他数据覆盖user. 我不知道如何将它们结合起来。
这是我到目前为止所拥有的:
// MARK: - Common User
struct User: Codable {
var name: String?
}
// MARK: - Abstract Response
struct ApiResponse<DataType: Codable>: Codable …Run Code Online (Sandbox Code Playgroud) 我正在尝试学习ReactiveSwift和ReactiveCocoa.我可以使用Signal和Property相当不错,但我遇到的麻烦SignalProducer.
据我所知,它SignalProducer非常适合网络请求.我设置了我的API层来创建并返回一个信号提供者,调用者可以启动它.
class ApiLayer {
func prepareRequest(withInfo info: RequestInfo) -> SignalProducer<ModelType, ErrorType> {
return SignalProducer<ModelType, ErrorType> { (observer, lifetime) in
// Send API Request ...
// In Completion Handler:
let result = parseJson(json)
observer.send(value: result)
observer.sendCompleted()
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我该如何倾听结果呢?
我尝试过这样的事情,但是我得到了一个错误,所以我一定在做/想到这个错误.
apiLayer.prepareRequest(withInfo: info)
.startWithValues { (resultModel) in
// Do Stuff with result ...
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
对成员'startWithValues'的模糊引用
- 找到这个候选人(ReactiveSwift.SignalProducer <Value,NoError>)
- 找到这个候选人(ReactiveSwift.SignalProducer <Never,NoError>)
编辑
我试图更明确地帮助编译器识别正确的方法,就像这样.但错误仍然存在.
apiLayer.prepareRequest(withInfo: info)
.startWithValues { (resultModel: ModelType) in // Tried adding …Run Code Online (Sandbox Code Playgroud)