iOS:refact requestLayout logic

This commit is contained in:
pengfei.zhou 2020-04-08 11:57:38 +08:00 committed by osborn
parent 95d9158fac
commit b17ff48c59
11 changed files with 27 additions and 46 deletions

View File

@ -41,9 +41,11 @@ - (void)render:(NSDictionary *)argument withPromise:(DoricPromise *)promise {
if (self.doricContext.rootNode.viewId == nil) { if (self.doricContext.rootNode.viewId == nil) {
self.doricContext.rootNode.viewId = viewId; self.doricContext.rootNode.viewId = viewId;
[self.doricContext.rootNode blend:argument[@"props"]]; [self.doricContext.rootNode blend:argument[@"props"]];
[self.doricContext.rootNode requestLayout];
} else { } else {
DoricViewNode *viewNode = [self.doricContext targetViewNode:viewId]; DoricViewNode *viewNode = [self.doricContext targetViewNode:viewId];
[viewNode blend:argument[@"props"]]; [viewNode blend:argument[@"props"]];
[viewNode requestLayout];
} }
[promise resolve:nil]; [promise resolve:nil];
}); });

View File

@ -31,7 +31,6 @@ @implementation DoricRefreshableNode
- (DoricSwipeRefreshLayout *)build { - (DoricSwipeRefreshLayout *)build {
return [[DoricSwipeRefreshLayout new] also:^(DoricSwipeRefreshLayout *it) { return [[DoricSwipeRefreshLayout new] also:^(DoricSwipeRefreshLayout *it) {
it.swipePullingDelegate = self; it.swipePullingDelegate = self;
}]; }];
} }
@ -62,8 +61,7 @@ - (DoricViewNode *)subNodeWithViewId:(NSString *)viewId {
} }
} }
- (void)blend:(NSDictionary *)props { - (void)afterBlended:(NSDictionary *)props {
[super blend:props];
[self blendContent]; [self blendContent];
[self blendHeader]; [self blendHeader];
} }
@ -102,6 +100,7 @@ - (void)blendContent {
self.view.contentView = it.view; self.view.contentView = it.view;
}]; }];
} }
[self.view.contentView.doricLayout apply:self.view.frame.size];
} }
- (void)blendHeader { - (void)blendHeader {
@ -138,6 +137,7 @@ - (void)blendHeader {
self.view.headerView = it.view; self.view.headerView = it.view;
}]; }];
} }
[self.view.headerView.doricLayout apply:self.view.frame.size];
} }
- (void)blendSubNode:(NSDictionary *)subModel { - (void)blendSubNode:(NSDictionary *)subModel {

View File

@ -20,7 +20,6 @@
#import "DoricSwipeRefreshLayout.h" #import "DoricSwipeRefreshLayout.h"
#import "UIView+Doric.h" #import "UIView+Doric.h"
#import "DoricLayouts.h" #import "DoricLayouts.h"
#import "Doric.h"
@interface DoricSwipeRefreshLayout () <UIScrollViewDelegate> @interface DoricSwipeRefreshLayout () <UIScrollViewDelegate>
@ -54,41 +53,13 @@ - (instancetype)init {
return self; return self;
} }
//- (CGSize)sizeThatFits:(CGSize)size { - (CGSize)sizeThatFits:(CGSize)size {
// if (self.contentView) { if (self.contentView) {
// return [self.contentView measureSize:size]; return self.contentView.frame.size;
// } }
// return CGSizeZero; return CGSizeZero;
//}
//
//- (BOOL)requestFromSubview:(UIView *)subview {
// if (subview == self.headerView) {
// return NO;
// }
// return [super requestFromSubview:subview];
//}
- (void)layoutSubviews {
[super layoutSubviews];
} }
//- (void)layoutSelf:(CGSize)targetSize {
// if (self.contentOffset.y != 0) {
// return;
// }
// self.width = targetSize.width;
// self.height = targetSize.height;
// [self.headerView also:^(UIView *it) {
// [it layoutSelf:[it measureSize:targetSize]];
// it.bottom = 0;
// it.centerX = self.centerX;
// }];
// [self.contentView also:^(UIView *it) {
// [it layoutSelf:targetSize];
// }];
// self.contentSize = self.frame.size;
//}
- (void)setContentView:(UIView *)contentView { - (void)setContentView:(UIView *)contentView {
if (_contentView) { if (_contentView) {
[_contentView removeFromSuperview]; [_contentView removeFromSuperview];

View File

@ -161,4 +161,9 @@ - (DoricViewNode *)subNodeWithViewId:(NSString *)viewId {
return nil; return nil;
} }
- (void)requestLayout {
for (DoricViewNode *node in self.childNodes) {
[node requestLayout];
}
}
@end @end

View File

@ -92,6 +92,8 @@ typedef NS_ENUM(NSInteger, DoricGravity) {
@property(nonatomic, assign) CGFloat maxHeight; @property(nonatomic, assign) CGFloat maxHeight;
@property(nonatomic, assign) BOOL resolved;
- (instancetype)init; - (instancetype)init;
- (void)apply; - (void)apply;

View File

@ -55,7 +55,6 @@ @interface DoricLayout ()
@property(nonatomic, assign) CGFloat measuredHeight; @property(nonatomic, assign) CGFloat measuredHeight;
@property(nonatomic, assign) CGFloat measuredX; @property(nonatomic, assign) CGFloat measuredX;
@property(nonatomic, assign) CGFloat measuredY; @property(nonatomic, assign) CGFloat measuredY;
@property(nonatomic, assign) BOOL resolved;
@end @end
@implementation DoricLayout @implementation DoricLayout

View File

@ -141,6 +141,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N
DoricListItemNode *node = cell.doricListItemNode; DoricListItemNode *node = cell.doricListItemNode;
node.viewId = model[@"id"]; node.viewId = model[@"id"];
[node blend:props]; [node blend:props];
[node requestLayout];
[self callItem:position height:node.view.height]; [self callItem:position height:node.view.height];
return cell; return cell;
} }

View File

@ -61,5 +61,6 @@ - (void)setupRootView:(UIView *)view {
- (void)requestLayout { - (void)requestLayout {
[self.view.doricLayout apply]; [self.view.doricLayout apply];
[super requestLayout];
} }
@end @end

View File

@ -37,7 +37,9 @@ - (void)setContentView:(UIView *)contentView {
- (CGSize)sizeThatFits:(CGSize)size { - (CGSize)sizeThatFits:(CGSize)size {
if (self.contentView) { if (self.contentView) {
[self.contentView.doricLayout apply:self.frame.size]; if (!self.contentView.doricLayout.resolved) {
[self.contentView.doricLayout apply:self.frame.size];
}
return self.contentView.frame.size; return self.contentView.frame.size;
} }
return CGSizeZero; return CGSizeZero;
@ -117,6 +119,10 @@ - (void)afterBlended:(NSDictionary *)props {
} }
} }
- (void)requestLayout {
[self.view.contentView.doricLayout apply:self.view.frame.size];
}
- (void)blendView:(DoricScrollView *)view forPropName:(NSString *)name propValue:(id)prop { - (void)blendView:(DoricScrollView *)view forPropName:(NSString *)name propValue:(id)prop {
if ([@"content" isEqualToString:name]) { if ([@"content" isEqualToString:name]) {
self.childViewId = prop; self.childViewId = prop;

View File

@ -127,8 +127,4 @@ - (DoricViewNode *)subNodeWithViewId:(NSString *)viewId {
NSStringFromSelector(_cmd)); NSStringFromSelector(_cmd));
return nil; return nil;
} }
- (void)requestLayout {
[self.view setNeedsLayout];
}
@end @end

View File

@ -139,8 +139,7 @@ - (void)blend:(NSDictionary *)props {
} }
[self afterBlended:props]; [self afterBlended:props];
[self transformProperties]; [self transformProperties];
[self requestLayout]; [self.gradientLayer also:^(CAGradientLayer *it) {
[self.gradientLayer also:^(CAGradientLayer* it) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
it.frame = CGRectMake(0, 0, self.view.width, self.view.height); it.frame = CGRectMake(0, 0, self.view.width, self.view.height);
}); });
@ -349,7 +348,6 @@ + (__kindof DoricViewNode *)create:(DoricContext *)context withType:(NSString *)
} }
- (void)requestLayout { - (void)requestLayout {
[self.superNode requestLayout];
} }
- (NSNumber *)getWidth { - (NSNumber *)getWidth {