From e9819443522d7a4fccc573a3c54c68c89d5672a2 Mon Sep 17 00:00:00 2001 From: "pengfei.zhou" Date: Tue, 27 Jun 2023 16:04:52 +0800 Subject: [PATCH] iOS: add DoricPanelView to replace DoricPanel which is extended from UIViewController --- .../Example/Example/DoricEmbeddedExampleVC.m | 14 ++-- doric-iOS/Pod/Classes/Doric.h | 1 + doric-iOS/Pod/Classes/DoricPanelView.h | 31 ++++++++ doric-iOS/Pod/Classes/DoricPanelView.m | 72 +++++++++++++++++++ 4 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 doric-iOS/Pod/Classes/DoricPanelView.h create mode 100644 doric-iOS/Pod/Classes/DoricPanelView.m diff --git a/doric-iOS/Example/Example/DoricEmbeddedExampleVC.m b/doric-iOS/Example/Example/DoricEmbeddedExampleVC.m index 5ab46177..8817aef0 100644 --- a/doric-iOS/Example/Example/DoricEmbeddedExampleVC.m +++ b/doric-iOS/Example/Example/DoricEmbeddedExampleVC.m @@ -89,7 +89,7 @@ - (CGSize)collectionViewContentSize { @interface MyCollectionViewCell : UICollectionViewCell -@property(nonatomic, strong) DoricPanel *panel; +@property(nonatomic, strong) DoricPanelView *panel; @end @implementation MyCollectionViewCell @@ -138,17 +138,17 @@ - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collection @"content": [NSString stringWithFormat:@"第%@项\n++++++++可填充内容++++++++%@", @(indexPath.row + 1), (indexPath.row % 2 == 0) ? @"\n+++再加一行+++" : @""], }; if (cell.panel == nil) { - cell.panel = [[DoricPanel new] also:^(DoricPanel *it) { - it.view.width = self.view.width / 2; - it.view.height = 200; + cell.panel = [[DoricPanelView new] also:^(DoricPanelView *it) { + it.width = self.view.width / 2; + it.height = 200; NSString *scheme = (indexPath.row % 2 == 0) ? @"assets://src/CellModule1Demo.js" : @"assets://src/CellModule2Demo.js"; NSString *alias = (indexPath.row % 2 == 0) ? @"CellModule1Demo.js" : @"CellModule2Demo.js"; [[DoricSingleton.instance.jsLoaderManager request:scheme] setResultCallback:^(NSString *script) { [it config:script alias:alias extra:nil]; }]; - [cell.panel.doricContext callEntity:@"setData", data, nil]; - cell.panel.doricContext.rootNode.reusable = YES; + [it.doricContext callEntity:@"setData", data, nil]; + it.doricContext.rootNode.reusable = YES; }]; } if (cell.panel.doricContext != nil) { @@ -162,7 +162,7 @@ - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collection c.contentView.width = c.width; c.contentView.height = c.height; }; - [cell.contentView addSubview:cell.panel.view]; + [cell.contentView addSubview:cell.panel]; return cell; } diff --git a/doric-iOS/Pod/Classes/Doric.h b/doric-iOS/Pod/Classes/Doric.h index 4edbe088..b2ea4baf 100644 --- a/doric-iOS/Pod/Classes/Doric.h +++ b/doric-iOS/Pod/Classes/Doric.h @@ -28,6 +28,7 @@ #import "UIView+Doric.h" #import "DoricUtil.h" #import "DoricPanel.h" +#import "DoricPanelView.h" #import "DoricJSLoaderManager.h" #import "DoricNavigatorDelegate.h" #import "DoricNavBarDelegate.h" diff --git a/doric-iOS/Pod/Classes/DoricPanelView.h b/doric-iOS/Pod/Classes/DoricPanelView.h new file mode 100644 index 00000000..a865e23b --- /dev/null +++ b/doric-iOS/Pod/Classes/DoricPanelView.h @@ -0,0 +1,31 @@ +/* + * Copyright [2023] [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 2023/6/27. +// + +#import + +#import "DoricContext.h" + +@interface DoricPanelView : UIView +@property(nonatomic, strong) DoricContext *doricContext; +@property(nonatomic, strong) void (^frameChangedBlock)(CGSize frameSize); + +- (void)config:(NSString *)script alias:(NSString *)alias extra:(NSString *)extra; + +- (void)renderSynchronously; +@end \ No newline at end of file diff --git a/doric-iOS/Pod/Classes/DoricPanelView.m b/doric-iOS/Pod/Classes/DoricPanelView.m new file mode 100644 index 00000000..8c678d7e --- /dev/null +++ b/doric-iOS/Pod/Classes/DoricPanelView.m @@ -0,0 +1,72 @@ +/* + * Copyright [2023] [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 2023/6/27. +// + +#import "DoricPanelView.h" +#import "Doric.h" + +@interface DoricPanelView () +@property(nonatomic, assign) CGFloat renderedWidth; +@property(nonatomic, assign) CGFloat renderedHeight; +@end + +@implementation DoricPanelView +- (void)config:(NSString *)script alias:(NSString *)alias extra:(NSString *)extra { + self.doricContext = [[[DoricContext alloc] initWithScript:script source:alias extra:extra] also:^(DoricContext *it) { + [it.rootNode setupRootView:[[DoricRootView new] also:^(DoricRootView *it) { + it.width = self.width; + it.height = self.height; + it.clipsToBounds = YES; + __weak typeof(self) __self = self; + it.frameChangedBlock = ^(CGSize oldSize, CGSize newSize) { + __strong typeof(__self) self = __self; + self.renderedWidth = newSize.width; + self.renderedHeight = newSize.height; + self.width = newSize.width; + self.height = newSize.height; + if (self.frameChangedBlock) { + self.frameChangedBlock(newSize); + } + }; + [self addSubview:it]; + }]]; + }]; + [self build]; +} + + +- (void)build { + [self.doricContext build:CGSizeMake(self.width, self.height)]; + self.renderedWidth = self.width; + self.renderedHeight = self.height; +} + +- (void)renderSynchronously { + [self.doricContext renderSynchronously]; + CGSize newSize = self.doricContext.rootNode.view.frame.size; + if (self.renderedWidth != newSize.width || self.renderedWidth != newSize.height) { + self.renderedWidth = newSize.width; + self.renderedHeight = newSize.height; + self.width = newSize.width; + self.height = newSize.height; + if (self.frameChangedBlock) { + self.frameChangedBlock(newSize); + } + } +} +@end \ No newline at end of file