This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
Doric/doric-iOS/Devkit/Classes/DoricSnapshotView.m
2021-07-21 19:32:31 +08:00

167 lines
6.0 KiB
Objective-C

/*
* Copyright [2021] [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 2021/7/14.
//
#import "DoricSnapshotView.h"
#import <JavaScriptCore/JavaScriptCore.h>
@interface DoricSnapshotView ()
@property(nonatomic, weak) DoricContext *doricContext;
@property(nonatomic, strong) UIImageView *prevBtn;
@property(nonatomic, strong) UIImageView *nextBtn;
@property(nonatomic, strong) UIImageView *closeBtn;
@property(nonatomic, strong) UILabel *indexLabel;
@property(nonatomic, assign) NSUInteger snapSize;
@property(nonatomic, assign) NSUInteger snapIndex;
@end
@implementation DoricSnapshotView
- (instancetype)initWithDoricContext:(DoricContext *)context {
if (self = [super init]) {
_doricContext = context;
[self setupUI];
}
return self;
}
- (void)setupUI {
self.width = 240;
self.height = 70;
self.backgroundColor = DoricColor(@(0xffecf0f1));
self.alpha = 0.8f;
UIImageView *moveBtn = [[UIImageView new] also:^(UIImageView *it) {
UIImage *image = [UIImage imageNamed:@"DoricDevkit.bundle/icon_doricdev_move"];
it.image = image;
it.width = 40;
it.height = 40;
it.contentMode = UIViewContentModeScaleToFill;
[self addSubview:it];
}];
self.prevBtn = [[UIImageView new] also:^(UIImageView *it) {
UIImage *image = [UIImage imageNamed:@"DoricDevkit.bundle/icon_doricdev_prev"];
it.image = image;
it.width = 40;
it.height = 40;
it.contentMode = UIViewContentModeScaleToFill;
[self addSubview:it];
it.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onPrev)];
[it addGestureRecognizer:tapGestureRecognizer];
}];
self.nextBtn = [[UIImageView new] also:^(UIImageView *it) {
UIImage *image = [UIImage imageNamed:@"DoricDevkit.bundle/icon_doricdev_next"];
it.image = image;
it.width = 40;
it.height = 40;
it.contentMode = UIViewContentModeScaleToFill;
[self addSubview:it];
it.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onNext)];
[it addGestureRecognizer:tapGestureRecognizer];
}];
self.closeBtn = [[UIImageView new] also:^(UIImageView *it) {
UIImage *image = [UIImage imageNamed:@"DoricDevkit.bundle/icon_doricdev_close"];
it.image = image;
it.width = 40;
it.height = 40;
it.contentMode = UIViewContentModeScaleToFill;
[self addSubview:it];
it.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onClose)];
[it addGestureRecognizer:tapGestureRecognizer];
}];
self.indexLabel = [[UILabel new] also:^(UILabel *it) {
it.width = 40;
it.height = 40;
it.textAlignment = NSTextAlignmentCenter;
it.font = [UIFont systemFontOfSize:30];
[self addSubview:it];
}];
moveBtn.left = 0;
moveBtn.centerY = self.centerY;
self.prevBtn.left = moveBtn.right + 5;
self.prevBtn.centerY = self.centerY;
self.indexLabel.left = self.prevBtn.right + 10;
self.indexLabel.centerY = self.centerY;
self.nextBtn.left = self.indexLabel.right + 10;
self.nextBtn.centerY = self.centerY;
self.closeBtn.left = self.nextBtn.right + 10;
self.closeBtn.centerY = self.centerY;
[[self.doricContext callEntity:@"__renderSnapshotDepth__" withArgumentsArray:@[]] setResultCallback:^(JSValue *result) {
self.snapSize = [[result toNumber] unsignedIntegerValue];
dispatch_async(dispatch_get_main_queue(), ^{
self.snapIndex = self.snapSize;
[self updateUI];
});
}];
}
- (void)onPrev {
if (self.snapIndex <= 0) {
return;
}
self.snapIndex--;
[self updateUI];
}
- (void)onNext {
if (self.snapIndex >= self.snapSize) {
return;
}
self.snapIndex++;
[self updateUI];
}
- (void)onClose {
self.snapIndex = self.snapSize;
[self updateUI];
[self removeFromSuperview];
}
- (void)updateUI {
self.prevBtn.alpha = self.snapIndex <= 0 ? 0.5f : 1;
self.nextBtn.alpha = self.snapIndex >= self.snapSize ? 0.5f : 1;
self.indexLabel.text = [NSString stringWithFormat:@"%@", @(self.snapIndex)];
[[self.doricContext callEntity:@"__restoreRenderSnapshot__" withArgumentsArray:@[@(self.snapIndex)]] setResultCallback:^(JSValue *result) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.doricContext.rootNode.view.subviews forEach:^(__kindof UIView *obj) {
[obj removeFromSuperview];
}];
[self.doricContext.rootNode clearSubModel];
[[result toArray] forEach:^(NSDictionary *obj) {
NSString *viewId = obj[@"id"];
if (self.doricContext.rootNode.viewId == nil && [@"Root" isEqualToString:[obj optString:@"type"]]) {
self.doricContext.rootNode.viewId = viewId;
[self.doricContext.rootNode blend:[obj optObject:@"props"]];
[self.doricContext.rootNode requestLayout];
} else {
DoricViewNode *viewNode = [self.doricContext targetViewNode:viewId];
[viewNode blend:[obj optObject:@"props"]];
[viewNode requestLayout];
}
}];
});
}];
}
@end