提交 21811d8c 编写于 作者: 囧jt's avatar 囧jt

Merge remote-tracking branch 'origin/master'

......@@ -52,7 +52,7 @@ public class StringUtil {
}
/*
* Replace all occurances of the searchString in the originalString with the replaceString. Faster than the
* Replace all occurrences of the searchString in the originalString with the replaceString. Faster than the
* String.replace() method. Does not use regexes.
* <p/>
* If your searchString is empty, this will spin forever.
......
......@@ -7,7 +7,7 @@
Pod::Spec.new do |s|
s.name = 'DoraemonKit'
s.version = '3.0.8'
s.version = '3.1.0'
s.summary = 'iOS各式各样的工具集合'
s.description = <<-DESC
iOS各式各样的工具集合 Desc
......
......@@ -3,7 +3,7 @@
"packages": [
"packages/*"
],
"version": "0.0.1-alpha.1",
"version": "0.0.1-alpha.4",
"npmClient": "npm",
"command": {
"bootstrap": {
......
{
"name": "@dokit/web-core",
"version": "0.0.1-alpha.1",
"version": "0.0.1-alpha.4",
"description": "Dokit",
"keywords": [
"Dokit"
......@@ -29,7 +29,7 @@
"url": "https://github.com/didi/DoraemonKit/issues"
},
"dependencies": {
"@dokit/web-utils": "^0.0.1-alpha.1"
"@dokit/web-utils": "^0.0.1-alpha.4"
},
"gitHead": "886ea7c19806526668e5da0179da335e7df9d012"
}
{
"name": "@dokit/web-utils",
"version": "0.0.1-alpha.1",
"version": "0.0.1-alpha.4",
"description": "Dokit",
"keywords": [
"Dokit"
......
......@@ -31,11 +31,17 @@ export class Request extends EventEmitter{
const originOpen = winXhrProto.open;
const originSetRequestHeader = winXhrProto.setRequestHeader;
// XMLHttp
window.XMLHttpRequest.prototype.setRequestHeader = function(){
originSetRequestHeader.apply(this, arguments);
window.XMLHttpRequest.prototype.setRequestHeader = function(...args){
if(Req.hookXhrConfig.onBeforeSetRequestHeader) {
args = Req.hookXhrConfig.onBeforeSetRequestHeader(args, this.reqConf);
// 返回false则取消设置请求头 (api-mock拦截接口,会将post改为get 此时设置请求头Content-Type会报跨域错误)
args && originSetRequestHeader.apply(this, args);
} else {
originSetRequestHeader.apply(this, args);
}
}
window.XMLHttpRequest.prototype.open = function (...args) {
let originArgs = {...args}
args = Req.hookXhrConfig.onBeforeOpen && Req.hookXhrConfig.onBeforeOpen(args) || args
const xhr = this;
this.reqConf = {
......@@ -44,6 +50,10 @@ export class Request extends EventEmitter{
requestInfo: {
method: args[0].toUpperCase(),
url: args[1]
},
originRequestInfo: {
method: originArgs[0].toUpperCase(),
url: originArgs[1]
}
}
......
{
"name": "@dokit/web",
"version": "0.0.1-alpha.1",
"version": "0.0.1-alpha.4",
"description": "Dokit Web Main Entry",
"keywords": [
"Dokit"
......@@ -30,8 +30,8 @@
"dev": "npx rollup -wc"
},
"dependencies": {
"@dokit/web-core": "^0.0.1-alpha.1",
"@dokit/web-utils": "^0.0.1-alpha.1"
"@dokit/web-core": "^0.0.1-alpha.4",
"@dokit/web-utils": "^0.0.1-alpha.4"
},
"gitHead": "886ea7c19806526668e5da0179da335e7df9d012"
}
......@@ -3,7 +3,7 @@ import {getGlobalData, RouterPlugin} from '@dokit/web-core'
import { getPartUrlByParam } from "@dokit/web-utils";
import { request } from './../../assets/util'
const mockBaseUrl = "https://pre.dokit.cn";
const mockBaseUrl = "https://www.dokit.cn";
const getCheckedInterfaceList = function (interfaceList) {
return interfaceList.filter(i => i.checked)
......@@ -80,9 +80,11 @@ export default new RouterPlugin({
})
}
})
sceneId && fetchArgs[1] && (fetchArgs[1].method = 'get') && (fetchArgs[1].headers && delete fetchArgs[1].headers)
sceneId && (fetchArgs[0] = `${mockBaseUrl}/api/app/scene/${sceneId}`)
return fetchArgs;
}
},
});
request.hookXhr({
onBeforeOpen: (args) => {
......@@ -99,9 +101,29 @@ export default new RouterPlugin({
})
}
})
sceneId && (args[0] = 'get')
sceneId && (args[1] = `${mockBaseUrl}/api/app/scene/${sceneId}`)
return args;
},
onBeforeSetRequestHeader: (args, config) => {
let checkedInterfaceList = getCheckedInterfaceList(state.interfaceList)
let url = config.originRequestInfo.url;
let path = `/`+getPartUrlByParam(url, 'path')
let sceneId = ''
checkedInterfaceList.forEach(i => {
if(i.path === path) {
i.sceneList.forEach(scene => {
if(scene.checked) {
sceneId = scene._id
}
})
}
})
if (sceneId) {
return false
}
return args
}
});
},
onUnload(){}
......
......@@ -13,8 +13,6 @@
<script>
import interfaceItem from "./interface-item";
const mockBaseUrl = "https://pre.dokit.cn";
export default {
components: {
interfaceItem,
......
......@@ -12,18 +12,21 @@
<h1>DoKit For Web</h1>
<h2>Playground</h2>
</body>
<script src="https://unpkg.com/vue@next"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/3.1.5/vue.global.js"></script>
<script src="../packages/web/dist/dokit.js"></script>
<script>
Dokit.setProductId('379cca45571436f86c31d687578541fc')
</script>
<script>
setTimeout(() => {
// fetch('https://www.tianqiapi.com/free/day?appid=68852321&appsecret=BgGLDVc7', {
// body: JSON.stringify({
// a:1
// fetch('https://www.tianqiapi.com/free/week?appid=68852321&appsecret=BgGLDVc7', {
// // body: JSON.stringify({
// // a:1
// // }),
// headers: new Headers({
// 'Content-Type': 'text/html; charset=utf-8'
// }),
// method: 'get',
// method: 'post',
// })
// .then((response) => {
// let weatherInfo = response.json();
......@@ -39,6 +42,7 @@
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", reqListener);
oReq.open("post", "https://www.tianqiapi.com/free/week?appid=68852321&appsecret=BgGLDVc7");
oReq.setRequestHeader('Content-Type', 'text/html; charset=utf-8')
oReq.send(JSON.stringify({
a:1
}));
......
......@@ -7,7 +7,7 @@
#import <Foundation/Foundation.h>
#import "DoraemonMCMessagePackager.h"
#import "DoraemonMCEventHandler.h"
NS_ASSUME_NONNULL_BEGIN
@interface DoraemonMCCommandExcutor : NSObject
......@@ -17,6 +17,10 @@ NS_ASSUME_NONNULL_BEGIN
+ (void)excuteMessage:(DoraemonMCMessage *)message;
//增加自定义事件
+ (void)addCustomMessage:(NSString *)type eventHandlerName:(DoraemonMCEventHandler *)eventHandler;
@end
NS_ASSUME_NONNULL_END
......@@ -8,6 +8,9 @@
#import "DoraemonMCCommandExcutor.h"
#import "DoraemonMCEventHandler.h"
static NSMutableDictionary *eventHandlerMap = nil;
static NSMutableDictionary *externalEventHandlerMap = nil;
@implementation DoraemonMCCommandExcutor
+ (void)excuteMessageStrFromNet:(NSString *)message {
......@@ -17,7 +20,6 @@
}
+ (void)excuteMessage:(DoraemonMCMessage *)message {
static NSDictionary *eventHandlerMap = nil ;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
DoraemonMCReuseCellEventHandler *handlerReuseCell = [DoraemonMCReuseCellEventHandler new];
......@@ -29,6 +31,7 @@
@(DoraemonMCMessageTypeTextInput) : [DoraemonMCTextFiledEventHandler new],
@(DoraemonMCMessageTypeTarbarSelected) : [DoraemonMCTabbarEventHandler new]
};
externalEventHandlerMap = [NSMutableDictionary new];
});
[eventHandlerMap enumerateKeysAndObjectsUsingBlock:^(NSNumber * _Nonnull typeNumber, DoraemonMCEventHandler * _Nonnull eventHandler, BOOL * _Nonnull stop) {
......@@ -38,6 +41,34 @@
}
}];
[externalEventHandlerMap enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull typeString, DoraemonMCEventHandler * _Nonnull eventHandler, BOOL * _Nonnull stop) {
if ([message.customType isEqualToString:typeString]) {
[eventHandler handleEvent:message];
*stop = YES;
}
}];
}
//增加自定义事件
+ (void)addCustomMessage:(NSString *)type eventHandlerName:(DoraemonMCEventHandler *)eventHandler {
if (eventHandler && type) {
[externalEventHandlerMap enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull typeString, DoraemonMCEventHandler * _Nonnull eventHandler, BOOL * _Nonnull stop) {
if ([type isEqualToString:typeString]) {
*stop = YES;
NSAssert(stop, @"重复添加事件");
}
}];
[externalEventHandlerMap setValue:eventHandler forKey:type];
}
}
@end
......@@ -18,6 +18,12 @@
indexPath:(NSIndexPath *)indexPath
messageType:(DoraemonMCMessageType)type;
+ (DoraemonMCMessage *)sendCustomMessageWithView:(UIView *)view
eventInfo:(NSDictionary *)eventInfo
messageType:(NSString *)type;
@end
......@@ -29,5 +29,18 @@
}
}
+ (DoraemonMCMessage *)sendCustomMessageWithView:(UIView *)view
eventInfo:(NSDictionary *)eventInfo
messageType:(NSString *)type {
DoraemonMCMessage *message = [DoraemonMCMessagePackager packageCustomMessageWithView:view
eventInfo:eventInfo
messageType:type];
[DoraemonMCServer sendMessage:message.toMessageString];
return message;
}
@end
......@@ -19,6 +19,8 @@ NS_ASSUME_NONNULL_BEGIN
- (BOOL)handleEvent:(DoraemonMCMessage*)eventInfo;
- (UIView *)fetchTargetView;
@end
@interface DoraemonMCGestureRecognizerEventHandler : DoraemonMCEventHandler
......
......@@ -28,7 +28,8 @@ typedef NS_ENUM(NSInteger , DoraemonMCMessageType) {
// 消息类型
@property (nonatomic , assign) DoraemonMCMessageType type;
// 自定义消息类型
@property (nonatomic , assign) NSString * customType;
// 控件的xPath
@property (nonatomic , copy ) NSString *xPath;
......@@ -54,6 +55,13 @@ typedef NS_ENUM(NSInteger , DoraemonMCMessageType) {
indexPath:(NSIndexPath *)indexPath
messageType:(DoraemonMCMessageType)type;
/**
自定义事件
*/
+ (DoraemonMCMessage *)packageCustomMessageWithView:(UIView *)view
eventInfo:(NSDictionary *)eventInfo
messageType:(NSString *)type;
/***
根据从网络上获取的消息字符串, 解析出消息对象
*/
......
......@@ -15,7 +15,7 @@ static NSString const *kVcClsNameKey = @"vcClsName";
static NSString const *kEventInfoKey = @"eventInfo";
static NSString const *kXpathKey = @"xPath";
static NSString const *kTypeKey = @"type";
static NSString const *kcustomTypeKey =@"customType";
@implementation DoraemonMCMessagePackager
/**
......@@ -100,6 +100,25 @@ static NSString const *kTypeKey = @"type";
}
/*
* 自定义事件
*/
+ (DoraemonMCMessage *)packageCustomMessageWithView:(UIView *)view
eventInfo:(NSDictionary *)eventInfo
messageType:(NSString *)type {
DoraemonMCMessage *messageInstance = [[DoraemonMCMessage alloc] init];
messageInstance.customType = type;
messageInstance.xPath = [DoraemonMCXPathSerializer xPathStringWithView:view];
messageInstance.eventInfo = eventInfo;
messageInstance.isFirstResponder = view.isFirstResponder;
UIViewController *vc = [DoraemonMCXPathSerializer ownerVCWithView:view];
if (vc) {
messageInstance.currentVCClassName = NSStringFromClass(vc.class) ;
}
return messageInstance;
}
/***
根据从网络上获取的消息字符串, 解析出消息对象
*/
......@@ -107,6 +126,7 @@ static NSString const *kTypeKey = @"type";
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:[messageString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:NULL];
DoraemonMCMessage *messageInstance = [[DoraemonMCMessage alloc] init];
messageInstance.type = [dict[kTypeKey] integerValue];
messageInstance.customType = dict[kcustomTypeKey];
messageInstance.xPath = dict[kXpathKey];
messageInstance.eventInfo = dict[kEventInfoKey];
messageInstance.currentVCClassName = dict[kVcClsNameKey];
......@@ -119,6 +139,7 @@ static NSString const *kTypeKey = @"type";
@implementation DoraemonMCMessage
- (NSString *)toMessageString {
NSDictionary *dict = @{
kTypeKey : @(self.type),
kXpathKey : self.xPath?:@"",
......@@ -126,6 +147,15 @@ static NSString const *kTypeKey = @"type";
kVcClsNameKey: self.currentVCClassName?:@"",
kIsFirstResponderKey : @(self.isFirstResponder)
};
if (self.customType.length) {
dict = @{
kcustomTypeKey : self.customType,
kXpathKey : self.xPath?:@"",
kEventInfoKey : self.eventInfo?:@{},
kVcClsNameKey: self.currentVCClassName?:@"",
kIsFirstResponderKey : @(self.isFirstResponder)
};
}
if ([NSJSONSerialization isValidJSONObject:dict]) {
return [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:NULL] encoding:NSUTF8StringEncoding];
}
......
......@@ -8,6 +8,7 @@
/* Begin PBXBuildFile section */
0977CCE0269F394100A6463E /* DoraemonDemoMultiControlViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0977CCDF269F394000A6463E /* DoraemonDemoMultiControlViewController.m */; };
097F6DA326D53E5D00841403 /* DoraemonDemoMultiSlideView.m in Sources */ = {isa = PBXBuildFile; fileRef = 097F6DA226D53E5D00841403 /* DoraemonDemoMultiSlideView.m */; };
09B042C526A8585500045D2A /* DoraemonDemoMultiConLongPressGesture.m in Sources */ = {isa = PBXBuildFile; fileRef = 09B042C426A8585500045D2A /* DoraemonDemoMultiConLongPressGesture.m */; };
09B042C926A860B400045D2A /* DoraemonDemoMultiConPinchGesture.m in Sources */ = {isa = PBXBuildFile; fileRef = 09B042C826A860B400045D2A /* DoraemonDemoMultiConPinchGesture.m */; };
09B042CD26A8760E00045D2A /* DoraemonDemoMultiConRotationGesture.m in Sources */ = {isa = PBXBuildFile; fileRef = 09B042CC26A8760E00045D2A /* DoraemonDemoMultiConRotationGesture.m */; };
......@@ -57,6 +58,8 @@
/* Begin PBXFileReference section */
0977CCDE269F394000A6463E /* DoraemonDemoMultiControlViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DoraemonDemoMultiControlViewController.h; sourceTree = "<group>"; };
0977CCDF269F394000A6463E /* DoraemonDemoMultiControlViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DoraemonDemoMultiControlViewController.m; sourceTree = "<group>"; };
097F6DA126D53E5D00841403 /* DoraemonDemoMultiSlideView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DoraemonDemoMultiSlideView.h; sourceTree = "<group>"; };
097F6DA226D53E5D00841403 /* DoraemonDemoMultiSlideView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DoraemonDemoMultiSlideView.m; sourceTree = "<group>"; };
09B042C326A8585500045D2A /* DoraemonDemoMultiConLongPressGesture.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DoraemonDemoMultiConLongPressGesture.h; sourceTree = "<group>"; };
09B042C426A8585500045D2A /* DoraemonDemoMultiConLongPressGesture.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DoraemonDemoMultiConLongPressGesture.m; sourceTree = "<group>"; };
09B042C726A860B400045D2A /* DoraemonDemoMultiConPinchGesture.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DoraemonDemoMultiConPinchGesture.h; sourceTree = "<group>"; };
......@@ -172,6 +175,8 @@
09B042D426A877ED00045D2A /* DoraemonDemoMultiConScreenEdgePanGesture.m */,
09B042D726A8781A00045D2A /* DoraemonDemoMultiConTapGesture.h */,
09B042D826A8781A00045D2A /* DoraemonDemoMultiConTapGesture.m */,
097F6DA126D53E5D00841403 /* DoraemonDemoMultiSlideView.h */,
097F6DA226D53E5D00841403 /* DoraemonDemoMultiSlideView.m */,
);
path = MultiControl;
sourceTree = "<group>";
......@@ -597,6 +602,7 @@
DAE7BFAD20205C20008D49D8 /* NSObject+Runtime.m in Sources */,
DABBE3B521D3AA4D0070518E /* DoraemonWKWebViewViewController.m in Sources */,
0977CCE0269F394100A6463E /* DoraemonDemoMultiControlViewController.m in Sources */,
097F6DA326D53E5D00841403 /* DoraemonDemoMultiSlideView.m in Sources */,
DAFE052D21BD4A4D00F97A59 /* DoraemonDemoMockGPSAnnotation.m in Sources */,
DAFE052921BD4A4D00F97A59 /* DoraemonDemoCrashViewController.m in Sources */,
DA0C6F3A1FDEBE3800F43588 /* TestPlugin.m in Sources */,
......@@ -771,14 +777,14 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 46A29A7ADN;
DEVELOPMENT_TEAM = 7M2BQXS6D5;
ENABLE_BITCODE = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "DoraemonKitDemo/DoraemonKitDemo-PrefixHeader.pch";
INFOPLIST_FILE = DoraemonKitDemo/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.didi.dokit.demo.test.a;
PRODUCT_BUNDLE_IDENTIFIER = com.didi.dokit.demo.test.a123;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
TARGETED_DEVICE_FAMILY = "1,2";
......
......@@ -16,6 +16,56 @@
#import "DoraemonDemoMultiConSwipeGesture.h"
#import "DoraemonDemoMultiConTapGesture.h"
#import "DoraemonDemoMultiConScreenEdgePanGesture.h"
#import "DoraemonMCCommandExcutor.h"
#import "DoraemonMCMessagePackager.h"
#import "DoraemonDemoMultiSlideView.h"
@interface DoraemonMCEventHandler1: DoraemonMCEventHandler
@end
@implementation DoraemonMCEventHandler1
- (BOOL)handleEvent:(DoraemonMCMessage*)eventInfo {
self.messageInfo = eventInfo;
self.targetView = [self fetchTargetView];
NSString *message = [NSString stringWithFormat:@"%@,%@",self.targetView, [self.messageInfo.eventInfo objectForKey:@"eventInfo"]];
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"自定义手势" message:message
delegate:nil cancelButtonTitle:@"好的" otherButtonTitles: nil];
[alert show];
return YES;
}
@end
@interface DoraemonMCEventHandler2: DoraemonMCEventHandler
@end
@implementation DoraemonMCEventHandler2
- (BOOL)handleEvent:(DoraemonMCMessage*)eventInfo {
self.messageInfo = eventInfo;
self.targetView = [self fetchTargetView];
NSString *message = [NSString stringWithFormat:@"%@,%@",self.targetView, [self.messageInfo.eventInfo objectForKey:@"eventInfo"]];
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"自定义手势" message:message
delegate:nil cancelButtonTitle:@"好的" otherButtonTitles: nil];
[alert show];
return YES;
}
@end
@interface DoraemonDemoMultiControlViewController ()
@property (nonatomic,strong) UIScrollView * superScrollView;
@end
......@@ -27,7 +77,7 @@
self.title = DoraemonDemoLocalizedString(@"一机多控Demo");
self.superScrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
self.superScrollView.contentSize = CGSizeMake(self.view.doraemon_width, self.view.doraemon_height*1.2);
self.superScrollView.contentSize = CGSizeMake(self.view.doraemon_width, self.view.doraemon_height*1.3);
[self.view addSubview:self.superScrollView];
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, self.view.doraemon_width, 60)];
......@@ -52,20 +102,27 @@
[btn_3 addTarget:self action:@selector(controlEvent3) forControlEvents:UIControlEventTouchUpInside];
[self.superScrollView addSubview:btn_3];
// 自定义事件
DoraemonMCEventHandler1 *customHandler1 = [DoraemonMCEventHandler1 new];
[DoraemonMCCommandExcutor addCustomMessage:@"customType1" eventHandlerName:customHandler1];
DoraemonMCEventHandler2 *customHandler2 = [DoraemonMCEventHandler2 new];
[DoraemonMCCommandExcutor addCustomMessage:@"customType2" eventHandlerName:customHandler2];
DoraemonDemoMultiSlideView *slideView = [[DoraemonDemoMultiSlideView alloc]initWithFrame:CGRectMake(30, btn_3.doraemon_bottom +20, btn_3.doraemon_width-60, 60)];
[self.superScrollView addSubview:slideView];
//输入文本
UITextField *field_1 = [[UITextField alloc] initWithFrame:CGRectMake(60, btn_3.doraemon_bottom+20, self.view.doraemon_width-120, 60)];
UITextField *field_1 = [[UITextField alloc] initWithFrame:CGRectMake(60, slideView.doraemon_bottom+20, self.view.doraemon_width-120, 60)];
field_1.placeholder = @"输入文案测试";
field_1.clearButtonMode = UITextFieldViewModeAlways;
field_1.backgroundColor = [UIColor whiteColor];
[self.superScrollView addSubview:field_1];
//输入 UITextView 文本
UITextView *textView_1 = [[UITextView alloc]initWithFrame:CGRectMake(60, field_1.doraemon_bottom+20, self.view.doraemon_width-120, 60)];
textView_1.layer.borderWidth = 0.5;
......@@ -73,23 +130,15 @@
textView_1.backgroundColor = [UIColor whiteColor];
[self.superScrollView addSubview:textView_1];
// 单击 UITapGestureRecognizer
//左右滑动 UISwipeGestureRecognizer
//旋转 UISwipeGestureRecognizer
//输入 UITextView 文本
UITextView *textView_2 = [[UITextView alloc]initWithFrame:CGRectMake(60, textView_1.doraemon_bottom+20, self.view.doraemon_width-120, 60)];
textView_2.layer.borderWidth = 0.5;
textView_2.layer.borderColor = [[UIColor lightGrayColor] CGColor];
textView_2.backgroundColor = [UIColor whiteColor];
[self.superScrollView addSubview:textView_2];
//长按
UIButton *longPress = [[UIButton alloc] initWithFrame:CGRectMake(0, textView_1.doraemon_bottom+20, self.view.doraemon_width, 60)];
UIButton *longPress = [[UIButton alloc] initWithFrame:CGRectMake(0, textView_2.doraemon_bottom+20, self.view.doraemon_width, 60)];
longPress.backgroundColor = [UIColor orangeColor];
[longPress setTitle:DoraemonDemoLocalizedString(@"长安点击事件") forState:UIControlStateNormal];
[longPress addTarget:self action:@selector(longPressEvent) forControlEvents:UIControlEventTouchUpInside];
......@@ -132,13 +181,10 @@
[screenEdgePan addTarget:self action:@selector(screenEdgePanEvent) forControlEvents:UIControlEventTouchUpInside];
[self.superScrollView addSubview:screenEdgePan];
// 无法识别的手势, 通过touchesBegan 方法来识别
}
- (void)controlEvent{
......@@ -207,3 +253,5 @@
[self.navigationController pushViewController:screenEdgePan animated:YES];
}
@end
//
// DoraemonDemoMultiSlideView.h
// DoraemonKitDemo
//
// Created by wzp on 2021/8/24.
// Copyright © 2021 yixiang. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface DoraemonDemoMultiSlideView : UIView
@end
NS_ASSUME_NONNULL_END
//
// DoraemonDemoMultiSlideView.m
// DoraemonKitDemo
//
// Created by wzp on 2021/8/24.
// Copyright © 2021 yixiang. All rights reserved.
//
#import "DoraemonDemoMultiSlideView.h"
#import <Masonry/Masonry.h>
#import "DoraemonMCCommandGenerator.h"
typedef void(^CommonActionBlock)(id);
@interface DoraemonDemoMultiSlideView ()<UIGestureRecognizerDelegate>
@property (nonatomic, strong) UIView *bgView;
@property (nonatomic, strong) UIView *slideView;
@property (nonatomic, strong) UIButton *slideButton;
@property (nonatomic, assign) CGFloat fMaxSlideValue;
@property (nonatomic, strong) UILabel *lbLockName;
@property (nonatomic, assign) int nUnlockScale;
@property (nonatomic, strong) CommonActionBlock unLockBlock;
@end
@implementation DoraemonDemoMultiSlideView
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self){
_nUnlockScale = 70; // 默认百分之七十
_bgView = [UIView new];
[_bgView setBackgroundColor:[UIColor redColor]];
_bgView.layer.cornerRadius = 12;
_bgView.clipsToBounds = YES;
[self addSubview:_bgView];
[_bgView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
}];
//
_slideView = [UIView new];
[_slideView setBackgroundColor:[UIColor grayColor]];
_slideView.layer.cornerRadius = 12;
[_bgView addSubview:_slideView];
[_slideView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.bgView);
}];
//
_slideButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_slideButton setBackgroundColor:[UIColor orangeColor]];
[_slideView addSubview:_slideButton];
[_slideButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.leading.top.bottom.equalTo(self.slideView);
make.width.equalTo(@(50));
}];
UIFont *font = [UIFont systemFontOfSize:24];
_lbLockName = [UILabel new];
[_lbLockName setBackgroundColor:[UIColor grayColor]];
[_lbLockName setText:@"自定义事件"];
[_lbLockName setTextColor:[UIColor whiteColor]];
[_lbLockName setTextAlignment:NSTextAlignmentCenter];
[_lbLockName setFont:font];
[_slideView addSubview:_lbLockName];
[_lbLockName mas_makeConstraints:^(MASConstraintMaker *make) {
make.leading.equalTo(self.slideView).offset(118);
make.trailing.equalTo(self.slideView).offset(-80);
make.height.equalTo(@(80));
make.center.equalTo(self.slideView);
}];
UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(performPanGestureRecognizer:)];
panGestureRecognizer.delegate = self;
[_slideButton addGestureRecognizer:panGestureRecognizer];
}
return self;
}
- (void)setNUnlockScale:(int)nUnlockScale
{
if(nUnlockScale < 0 ){
nUnlockScale = 0;
}else if(nUnlockScale > 100){
nUnlockScale = 100;
}
_nUnlockScale = nUnlockScale;
}
- (void)performPanGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer
{
_fMaxSlideValue = _bgView.frame.size.width - _slideButton.frame.size.width;
CGPoint translation = [panGestureRecognizer translationInView:_bgView];
if(panGestureRecognizer.state == UIGestureRecognizerStateBegan){
_lbLockName.hidden = YES;
}else if(panGestureRecognizer.state == UIGestureRecognizerStateChanged){
if (translation.x == 1) {
[DoraemonMCCommandGenerator sendCustomMessageWithView:self eventInfo:@{@"eventInfo":@"customType1"} messageType:@"customType1"];
}
if(translation.x > 0){
_lbLockName.hidden = YES;
CGFloat offset = translation.x;
if(offset > _fMaxSlideValue){
offset = _fMaxSlideValue;
}
[_slideView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.leading.equalTo(self.bgView).offset(offset);
make.top.bottom.trailing.equalTo(self.bgView);
}];
}else{
}
}else if(panGestureRecognizer.state == UIGestureRecognizerStateEnded || panGestureRecognizer.state == UIGestureRecognizerStateCancelled){
if(panGestureRecognizer.state == UIGestureRecognizerStateEnded) {
[DoraemonMCCommandGenerator sendCustomMessageWithView:self eventInfo:@{@"eventInfo":@"customType2"} messageType:@"customType2"];
}
if(translation.x > _fMaxSlideValue * self.nUnlockScale/100.0){
[_slideView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.bottom.trailing.equalTo(self.bgView);
make.leading.equalTo(self.bgView).offset(self.fMaxSlideValue);
}];
_lbLockName.hidden = YES;
if(self.unLockBlock){
self.unLockBlock(@(YES));
}
}else{
[_slideView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.bgView);
}];
_lbLockName.hidden = NO;
}
}
}
@end
......@@ -17,4 +17,5 @@ target 'DoraemonKitDemo' do
pod 'FBRetainCycleDetector', :git => 'git@github.com:facebook/FBRetainCycleDetector.git', :branch => 'master'
# pod 'fishhook', '~> 0.2'
pod 'YYDebugDatabase', '~> 2.1'
pod 'Masonry', '0.6.3'
end
......@@ -69,6 +69,7 @@ PODS:
- libwebp/mux (1.1.0):
- libwebp/demux
- libwebp/webp (1.1.0)
- Masonry (0.6.3)
- SDWebImage (5.11.1):
- SDWebImage/Core (= 5.11.1)
- SDWebImage/Core (5.11.1)
......@@ -95,6 +96,7 @@ DEPENDENCIES:
- DoraemonKit/WithMultiControl (from `../../`)
- DoraemonKit/WithWeex (from `../../`)
- "FBRetainCycleDetector (from `git@github.com:facebook/FBRetainCycleDetector.git`, branch `master`)"
- Masonry (= 0.6.3)
- SDWebImage (~> 5.11)
- SDWebImageWebPCoder (~> 0.8)
- SocketRocket (~> 0.5)
......@@ -109,6 +111,7 @@ SPEC REPOS:
- FMDB
- GCDWebServer
- libwebp
- Masonry
- SDWebImage
- SDWebImageWebPCoder
- SocketRocket
......@@ -138,6 +141,7 @@ SPEC CHECKSUMS:
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4
libwebp: 946cb3063cea9236285f7e9a8505d806d30e07f3
Masonry: ff105a956abcd19a618b2028b121cb638d7a8e2f
SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d
SDWebImageWebPCoder: f56ab499e3ea57dfeb6c3187dce183b10e160db0
SocketRocket: d57c7159b83c3c6655745cd15302aa24b6bae531
......@@ -145,6 +149,6 @@ SPEC CHECKSUMS:
WXDevtool: 95b70c73c06fc3299d65bd53ba4b3e0b0087f3cb
YYDebugDatabase: e684a7f79fca2e3673a23347cefb822f911f3124
PODFILE CHECKSUM: 77940354fa7f70dcc3caa7084c50a8b8efe8e6ce
PODFILE CHECKSUM: 932a68754b6bfe4325178d4c6d3639dcd2278eb5
COCOAPODS: 1.10.1
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册