From ce0e1d0ed0f2cd11e5e6dd30830a543c52a0b698 Mon Sep 17 00:00:00 2001 From: "pengfei.zhou" Date: Sat, 7 Dec 2019 12:47:22 +0800 Subject: [PATCH] feat:add NestedSlider --- Pod/Classes/DoricRegistry.m | 2 + Pod/Classes/Shader/DoricGroupNode.m | 1 - Pod/Classes/Shader/DoricNestedSliderNode.h | 24 +++++ Pod/Classes/Shader/DoricNestedSliderNode.m | 101 +++++++++++++++++++++ 4 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 Pod/Classes/Shader/DoricNestedSliderNode.h create mode 100644 Pod/Classes/Shader/DoricNestedSliderNode.m diff --git a/Pod/Classes/DoricRegistry.m b/Pod/Classes/DoricRegistry.m index 4ffefa29..f9614756 100644 --- a/Pod/Classes/DoricRegistry.m +++ b/Pod/Classes/DoricRegistry.m @@ -42,6 +42,7 @@ #import "DoricFlowLayoutNode.h" #import "DoricPopoverPlugin.h" #import "DoricAnimatePlugin.h" +#import "DoricNestedSliderNode.h" @interface DoricRegistry () @@ -86,6 +87,7 @@ - (void)innerRegister { [self registerViewNode:DoricRefreshableNode.class withName:@"Refreshable"]; [self registerViewNode:DoricFlowLayoutItemNode.class withName:@"FlowLayoutItem"]; [self registerViewNode:DoricFlowLayoutNode.class withName:@"FlowLayout"]; + [self registerViewNode:DoricNestedSliderNode.class withName:@"NestedSlider"]; } - (void)registerJSBundle:(NSString *)bundle withName:(NSString *)name { diff --git a/Pod/Classes/Shader/DoricGroupNode.m b/Pod/Classes/Shader/DoricGroupNode.m index c35156fb..0e59c8fb 100644 --- a/Pod/Classes/Shader/DoricGroupNode.m +++ b/Pod/Classes/Shader/DoricGroupNode.m @@ -20,7 +20,6 @@ // Created by pengfei.zhou on 2019/7/30. // -#import #import "DoricGroupNode.h" @interface DoricGroupNode () diff --git a/Pod/Classes/Shader/DoricNestedSliderNode.h b/Pod/Classes/Shader/DoricNestedSliderNode.h new file mode 100644 index 00000000..13e7ccc0 --- /dev/null +++ b/Pod/Classes/Shader/DoricNestedSliderNode.h @@ -0,0 +1,24 @@ +/* + * Copyright [2019] [Doric.Pub] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// +// Created by pengfei.zhou on 2019/12/7. +// + +#import +#import "DoricGroupNode.h" + +@interface DoricNestedSliderNode : DoricGroupNode +@end \ No newline at end of file diff --git a/Pod/Classes/Shader/DoricNestedSliderNode.m b/Pod/Classes/Shader/DoricNestedSliderNode.m new file mode 100644 index 00000000..56d916c4 --- /dev/null +++ b/Pod/Classes/Shader/DoricNestedSliderNode.m @@ -0,0 +1,101 @@ +/* + * Copyright [2019] [Doric.Pub] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// +// Created by pengfei.zhou on 2019/12/7. +// + +#import "DoricNestedSliderNode.h" +#import "Doric.h" + +@interface DoricNestedSliderView : UIScrollView + +@end + +@implementation DoricNestedSliderView +- (CGSize)sizeThatFits:(CGSize)size { + if (self.subviews.count > 0) { + CGFloat width = size.width; + CGFloat height = size.height; + for (UIView *child in self.subviews) { + CGSize childSize = [child measureSize:size]; + width = MAX(childSize.width, width); + height = MAX(childSize.height, height); + } + return CGSizeMake(width, height); + } + return size; +} + +- (void)layoutSelf:(CGSize)targetSize { + [super layoutSelf:targetSize]; + [self.subviews forEachIndexed:^(__kindof UIView *obj, NSUInteger idx) { + obj.left = idx * self.width; + }]; + [self setContentSize:CGSizeMake(self.subviews.count * self.width, self.height)]; +} +@end + +@interface DoricNestedSliderNode () +@property(nonatomic, copy) NSString *onPageSelectedFuncId; +@property(nonatomic, assign) NSUInteger lastPosition; +@end + +@implementation DoricNestedSliderNode +- (UIScrollView *)build { + return [[DoricNestedSliderView new] also:^(DoricNestedSliderView *it) { + it.delegate = self; + it.pagingEnabled = YES; + [it setShowsVerticalScrollIndicator:NO]; + [it setShowsHorizontalScrollIndicator:NO]; + }]; +} + +- (void)blendView:(UIScrollView *)view forPropName:(NSString *)name propValue:(id)prop { + if ([@"onPageSlided" isEqualToString:name]) { + self.onPageSelectedFuncId = prop; + } else { + [super blendView:view forPropName:name propValue:prop]; + } +} + +- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { + NSUInteger pageIndex = (NSUInteger) (scrollView.contentOffset.x / scrollView.width); + [scrollView setContentOffset:CGPointMake(pageIndex * scrollView.width, scrollView.contentOffset.y) animated:YES]; + if (self.onPageSelectedFuncId && self.onPageSelectedFuncId.length > 0) { + if (pageIndex != self.lastPosition) { + [self callJSResponse:self.onPageSelectedFuncId, @(pageIndex), nil]; + } + } + self.lastPosition = pageIndex; +} + + +- (void)slidePage:(NSDictionary *)params withPromise:(DoricPromise *)promise { + NSUInteger pageIndex = [params[@"page"] unsignedIntegerValue]; + BOOL smooth = [params[@"smooth"] boolValue]; + [self.view setContentOffset:CGPointMake(pageIndex * self.view.width, self.view.contentOffset.y) animated:smooth]; + [promise resolve:nil]; + self.lastPosition = pageIndex; + if (self.onPageSelectedFuncId && self.onPageSelectedFuncId.length > 0) { + [self callJSResponse:self.onPageSelectedFuncId, @(pageIndex), nil]; + } +} + +- (NSNumber *)getSlidedPage { + NSUInteger pageIndex = (NSUInteger) (self.view.contentOffset.x / self.view.width); + return @(pageIndex); +} +@end