一个UIViewController的View可能有很多小的子view。这些子view很多时候被盖在最后,我们在最外层ViewController的viewDidLoad方法中,用addSubview增加了大量的子view。这些子view大多数不会一直处于界面上,只是在某些情况下才会出现,例如登陆失败的提示view,上传附件成功的提示view,网络失败的提示view等。但是虽然这些view很少出现,但是我们却常常一直把它们放在内存中。另外,当收到内存警告时,我们只能自己手工把这些view从superview中去掉。2.替代方法聪明的你,也许已经体会到了,该transitionFromViewController方法闪亮登场:苹果新的API增加了addChildViewController方法,并且希望我们在使用addSubview时,同时调用[selfaddChildViewController:child]方法将subview对应的viewController也加到当前ViewController的管理中。对于那些当前暂时不需要显示的subview,只通过addChildViewController把subViewController加进去;需要显示时再调用transitionFromViewController方法。将其添加进入底层的ViewController中。这样做的好处:1.无疑,对页面中的逻辑更加分明了。相应的View对应相应的ViewController。2.当某个子View没有显示时,将不会被Load,减少了内存的使用。3.当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。3.transitionFromViewController:toViewController:duration:options:animations:completion方法-(void)transitionFromViewController:(UIViewController*)fromViewControllertoViewController:(UIViewController*)toViewControllerduration:(NSTimeInterval)durationoptions:(UIViewAnimationOptions)optionsanimations:(void(^)(void))animationscompletion:(void(^)(BOOLfinished))completion在两个子视图控制器中转换。支持的iOS5.0以及以后的版本。fromViewController:当前显示在父视图控制器中的子视图控制器toViewController:将要显示的子视图控制器duration:完成过渡的时间;单位:秒。options:指定的过渡效果。animations:转换过程中,的动画。是个Block块操作。completion:过渡完成后,执行的Block块操作。该方法,执行完以后,fromViewController指代的视图控制器的View将从界面消失;toViewController所指代的视图控制器的View将被载入到页面中。
创新互联建站主要从事成都网站制作、成都网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务阿拉山口,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
最近在做的一个项目,项目的前期采用Weex开发。但是随着交互复杂度的增加,Weex一处开发多处多处运行的特征并没有很好的体现,相反很多时候我们还是需要做IOS和Android的适配。如今火热的Flutter相比Weex和Rn来说,给出了更好的跨平台解决方案。所以我们设计了一套基于Weex实现,底层跑在Flutter Engine上的框架。
底层的Runtime采用isolate engine,框架业务逻辑,Dom的解析逻辑和Render逻辑都跑在这里。
渲染引擎采用Flutter的Skia,彻底剥离了Android和IOS的差异性.
将Weex VirsualDom的解析都替换成Flutter Widget.
设计基于Weex2Dart的Brider,使JS和Dart可以相互调用
weex-demo的性能展示
release环境下采用AOT模式,性能会有质的飞跃。
Android-Release版本只有10m大小
相比Weex和Rn具有更好的性能,同时具有更好的跨平台性
相比Flutter,具有动态部署的能力(Flutter Release采用AoT模式并没有动态部署的能力,即使Debug版本也只是开发环境下才有动态化能力并没有可以实施项目的能力)
只需要会Weex开发或则Rn开发就可以,不需要额外学习Dart,已有的Weex项目可以无缝切换。
最近一直在做weex的iOS APP,发现了不少坑,weex自带的model.toast可以模拟iOS的各种提示框信息,但是实际应用中发现在网页端显示正常,但在模拟器和真机上无法显示,找了很久也没发现有用的信息(weex相关的资料实在是太少了!),无意中发现了一篇文件完美解决这个问题。
方法一:如果App没有使用storyboard布局,可以删除Main.storyboard
首先删除Main.storyboard(有洁癖的肯定也会删除Xcode自动创建的ViewController),记住是移到废纸篓,而不是删除索引
然后删除Info.plist中的选项:Main storyboard file base name即可
方法二:修改WXModalUIModule.m中的方法如下即可:
项目初始化1、没有现成的工程的话新建ios项目命令行cd到项目根目录 执行 pod init,会创建一个pod配置文件用编辑器打开,加上 pod 'WeexSDK', :path='./sdk/'
/weex在ios目录下有个sdk文件夹,把它复制到ios项目根目录,和podFile里配置的路径一致关掉xcode,在当前目录,命令行执行pod install,现在项目目录变成了这样,以后点击xcworkspace文件打开项目创建一个新目录weex,命令行cd到weex目录,执行weex init,会提示你输入项目名称自动创建的文件:
在当前目录命令行执行npm install,安装依赖库创建一个文件夹js,命令行执行weex src -o js生成最终需要的js文件也可以weex src/main.we在浏览器预览或者weex src/main.we --qr 生成二维码,用playground App 扫描预览加载weex页面xcode打开workspace项目文件打开AppDelegate.m添加一下内容将之前创建的js文件夹拖到xcode工程的文件列表效果是这样的weex视图控制器的初始化ViewController.h:
[objc] view plain copy在CODE上查看代码片派生到我的代码片//// ViewController.h// weexDemo3//// Created by admin on 16/8/3.
// Copyright ? 2016年 admin. All rights reserved.
//#import UIKit/UIKit.h
@interface ViewController : UIViewController- (instancetype)initWithJs:(NSString *)filePath;@endViewController.m:
[objc] view plain copy在CODE上查看代码片派生到我的代码片//// ViewController.m// weexDemo3//// Created by admin on 16/8/3.
// Copyright ? 2016年 admin. All rights reserved.
//#import "ViewController.h"#import WeexSDK/WXSDKInstance.h
@interface ViewController ()@property (nonatomic, strong) WXSDKInstance *instance;@property (nonatomic, strong) UIView *weexView;@end@implementation ViewController{NSURL *jsUrl;}
- (instancetype)initWithJs:(NSString *)filePath{self = [super init];if (self) {//远程js文件// NSString *path=[NSString stringWithFormat:@"",filePath];//本地js文件NSString *path=[NSString stringWithFormat:@"",[NSBundle mainBundle].bundlePath,filePath];NSLog(@"-----path:%@",path);jsUrl=[NSURL URLWithString:path];}
return self;}
- (void)viewDidLoad {[super viewDidLoad];_instance = [[WXSDKInstance alloc] init];_instance.viewController = self;_instance.frame=self.view.frame;__weak typeof(self) weakSelf = self;_instance.onCreate = ^(UIView *view) {[weakSelf.weexView removeFromSuperview];weakSelf.weexView = view;[weakSelf.view addSubview:weakSelf.weexView];};_instance.onFailed = ^(NSError *error) {NSLog(@"加载错误");};_instance.renderFinish = ^ (UIView *view) {NSLog(@"加载完成");};if (!jsUrl) {return;}
[_instance renderWithURL: jsUrl];self.view.backgroundColor=[UIColor whiteColor];}
- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}
- (void)dealloc{[_instance destroyInstance];}
@end再打开AppDelegate成都软件开发公司创建导航控制器引入头文件#import "ViewController.h"创建导航视图:
[objc] view plain copy在CODE上查看代码片派生到我的代码片- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {//weex[self initWeex];ViewController *vc=[[ViewController alloc]initWithJs:@"main.js"];UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:vc];self.window.rootViewController=nav;return YES;}
运行图片不显示是因为图片加载需要自己创建模块,可以直接把demo的代码和pod配置粘过来使用
现在新的技术已经出来了,可以统一开发网页、android、ios。技术的名字就交WebAPP的开发。需要的技术是网页前端的开发技术,需要会html、css、javascript。WebAPP用的框架是AngularJS。可以搜索ionic + AngularJS,有一个中文的网站,提供了文档以及免费的视频教程。
说明:首先waterfall是weex的原生组件,WEEX的出现让我们可以使用Vue来进行移动端原生应用开发。这里就需要了解什么是weex?
Weex是一个可以使用现代化的 Web 技术开发高性能原生应用的框架",这是Weex官网对其的一句很简介明了的定义。Weex是一个可以利用web 前端开发技术来实现Android/ios 原生引用的框架,使用 Vue 作为上层框架,并遵循 W3C 标准实现了统一的 JSEngine 和 DOM API。
1、组件是提供瀑布流布局的核心组件。瀑布流,又称瀑布流式布局是比较流行的一种页面布局,视觉表现为参差不齐的多栏布局。随着页面滚动条向下滚动,这种布局还可以不断加载数据块并附加至当前尾部。
2、 waterfall 只支持 Android 和 iOS,不支持 Web。
3、注意:(个人经验总结)当waterfall组件里面出现图片image组件时,不允许对image自适应高度是因为weex的css样式布置auto属性。所以在当我们用uniapp开发时,uniapp的mode属性是不能使用的。且weex的image并没有mode属性而是resize属性。所以image的宽高就需要固定,如需保持宽度一致高度适应就需要计算了。