当前位置: 首页 > 编程日记 > 正文

iOS11、iPhone X、Xcode9 适配指南

2017.09.23

不断完善中。。。

2017.10.02 新增 iPhone X 适配官方中文文档

更新iOS11后,发现有些地方需要做适配,整理后按照优先级分为以下三类:

  1. 单纯升级iOS11后造成的变化;
  2. Xcode9 打包后造成的变化;
  3. iPhoneX的适配

一、单纯升级iOS11后造成的变化

######1. 升级后,发现某个拥有tableView的界面错乱,组间距和contentInset错乱,因为iOS11中 UIViewControllerautomaticallyAdjustsScrollViewInsets 属性被废弃了,因此当tableView超出安全区域时,系统自动会调整SafeAreaInsets值,进而影响adjustedContentInset

// 有些界面以下使用代理方法来设置,发现并没有生效
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;// 这样的原理是因为之前只是实现了高度的代理方法,却没有实现View的代理方法,iOS10及以前这么写是没问题的,iOS11开启了行高估算机制引起的bug,因此有以下几种解决方法:// 解决方法一:添加实现View的代理方法,只有实现下面两个方法,方法 (CGFloat)tableView: heightForFooterInSection: 才会生效
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {return nil;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {return nil;
}// 解决方法二:直接使用tableView属性进行设置,修复该UI错乱
self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 5;[_optionTableView setContentInset:UIEdgeInsetsMake(-35, 0, 0, 0)];// 解决方法三:添加以下代码关闭估算行高
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;
复制代码
2. 如果使用了Masonry 进行布局,就要适配safeArea
if ([UIDevice currentDevice].systemVersion.floatValue >= 11.0) {make.edges.equalTo(self.view.safeAreaInsets);
} else {make.edges.equalTo(self.view);
}
复制代码
3. 对于IM的发送原图功能,iOS11启动全新的HEIC 格式的图片,iPhone7以上设备+iOS11拍出的live照片是.heic格式图片,同一张live格式的图片,iOS10发送就没问题(转成了jpg),iOS11就不行
  • 微信的处理方式是一比一转化成 jpg 格式
  • QQ和钉钉的处理方式是直接压缩,即使是原图也压缩为非原图
  • 最终采取的是微信的方案,使用以下代码转成jpg格式
// 0.83能保证压缩前后图片大小是一致的
// 造成不一致的原因是图片的bitmap一个是8位的,一个是16位的
imageData = UIImageJPEGRepresentation([UIImage imageWithData:imageData], 0.83);
复制代码
4. 有的页面在侧滑返回或者pop操作后,会出现页面下沉的现象,效果如下图所示

// 这是因为 UIScrollView 的 contentInsetAdjustmentBehavior 属性默认为 automatic,通过以下代码可以修复
if (@available(iOS 11.0, *)) {self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
// 当然,如果是使用 Storyboard,可以依次 Size Inspector -> Content Insets -> Set 'Never' 搞定
复制代码

进行修改之后,没有 SearchViewController 的页面是没有问题的,但是拥有searchViewController 的页面,进行搜索文本的输入会造成UI错乱,因此使用以下解决方法

- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];if (@available(iOS 11.0, *)) {self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;}
}- (void)viewDidAppear:(BOOL)animated {[super viewDidAppear:animated];if (@available(iOS 11.0, *)) {self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAutomatic;}
}
复制代码
5. 另外,项目中还使用了【FDTemplateLayoutCell】这个第三方用来缓存行高,孙源大神可能近期太忙,也少有更新,但是在 iOS11 上发现近期报了一个频繁的 crash

针对这个问题的解决方法,在 issue 中找到了答案:

前往文件 "UITableView+FDTemplateLayoutCell.h" 70if (isSystemVersionEqualOrGreaterThen10_2) {// 将这里的 UILayoutPriorityRequired 更改为 UILayoutPriorityDefaultHigh 即可解决问题widthFenceConstraint.priority = UILayoutPriorityDefaultHigh - 1;
}
复制代码
6. UITableView 的删除操作,由于iOS11 手感的优化,出现了以下问题:

  • 后来查明原因是最开始写代码的时候没有注意细节,在定义删除按钮的时候没有设置合适的类型:之前是 UITableViewRowActionStyleNormal,改为UITableViewRowActionStyleDestructive即可
  • 原因:由于没有设置 删除 所特有的type,因此在UI展示上默认是不删除的,因此适配的是保留cell的UI,只有设置删除属性后,才能和deleteRowsAtIndexPaths方法保持UI上的同步
UITableViewRowAction *deleteRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"删除" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {[self.dataSource removeObjectAtIndex:indexPath.row];// 刷新tableview[self.tableView beginUpdates];[self.tableView deleteRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationAutomatic];[self.tableView endUpdates];
}
复制代码

二、使用Xcode9 编译后发现的问题

1. 发现fastSocket第三方报错,具体原因是缺少C99的头文件,引入#include <sys/time.h>即可

2. 导航栏的新特性
  • 原生的搜索栏样式发生改变

查看 API 后发现,iOS11后将searchController赋值给了 NavigationItem,通过属性 hidesSearchBarWhenScrolling 可以控制搜索栏是否在滑动的时候进行隐藏和显示

// A view controller that will be shown inside of a navigation controller can assign a UISearchController to this property to display the search controller’s search bar in its containing navigation controller’s navigation bar.
@property (nonatomic, retain, nullable) UISearchController *searchController API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);// If this property is true (the default), the searchController’s search bar will hide as the user scrolls in the top view controller’s scroll view. If false, the search bar will remain visible and pinned underneath the navigation bar.
@property (nonatomic) BOOL hidesSearchBarWhenScrolling API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);
复制代码
  • 另外,UINavigationBar 新增属性 BOOL值 prefersLargeTitles 来实现下面的效果,并可以通过 largeTitleTextAttributes来设置大标题的文本样式。设置大标题之后,导航栏的高度就会由之前的64pt变成 96pt,如果项目中有直接写死的高度或者隐藏导航栏之类的操作,就需要适配一下

  • 有个界面使用到了导航栏按钮相关的frame,也发生了UI错乱,查看UI层级关系后发现,iOS11以前是直接把按钮加到了UINavigationBar上面,而iOS11则是先将按钮加到了_UITAMICAdaptorView,再加到_UIButtonBarStackView_UINavigationBarContentView,接着才是UINavigationBar。因此如果需要获取导航栏按钮 frame 或者 superView,这里需要专门做下适配

三、iPhone X的适配

下载完Xcode9之后,第一件事自然是在 iPhone X(模拟器)上过把瘾,然后编译后就发现报错了 由于iPhone X的状态栏是和其他版本手机差异比较大的,因此api 变化也比较大 先后做了以下适配

适配点一:项目中使用状态栏中图标判断当前网络的具体状态

打印的 Log 报出以下错误: Trapped uncaught exception 'NSUnknownKeyException', reason: '[<UIStatusBar_Modern 0x7fcdb0805770> valueForUndefinedKey:]: this class is not key value coding-compliant for the key foregroundView.'

使用 runtime 打印其所有属性,发现以下差异

// 测试代码
#import <objc/runtime.h>
NSMutableString *resultStr = [NSMutableString string];
//获取指定类的Ivar列表及Ivar个数
unsigned int count = 0;
Ivar *member = class_copyIvarList([[application valueForKeyPath:@"_statusBar"] class], &count);for(int i = 0; i < count; i++){Ivar var = member[i];//获取Ivar的名称const char *memberAddress = ivar_getName(var);//获取Ivar的类型const char *memberType = ivar_getTypeEncoding(var);NSString *str = [NSString stringWithFormat:@"key = %s             type = %s \n",memberAddress,memberType];[resultStr appendString:str];
}
NSLog(@"%@", resultStr);
复制代码
// 其他版本的手机
key = _inProcessProvider            type = @"<UIStatusBarStateProvider>"
key = _showsForeground              type = B
key = _backgroundView               type = @"UIStatusBarBackgroundView"
key = _doubleHeightLabel            type = @"UILabel"
key = _doubleHeightLabelContainer   type = @"UIView"
key = _currentDoubleHeightText      type = @"NSString"
key = _currentRawData               type = {超长。。}
key = _interruptedAnimationCompositeViews  type = @"NSMutableArray"
key = _newStyleBackgroundView       type = @"UIStatusBarBackgroundView"
key = _newStyleForegroundView       type = @"UIStatusBarForegroundView"
key = _slidingStatusBar             type = @"UIStatusBar"
key = _styleAttributes              type = @"UIStatusBarStyleAttributes"
key = _waitingOnCallbackAfterChangingStyleOverridesLocally  type = B
key = _suppressGlow                 type = B
key = _translucentBackgroundAlpha   type = d
key = _showOnlyCenterItems          type = B
key = _foregroundViewShouldIgnoreStatusBarDataDuringAnimation  type = B
key = _tintColor                    type = @"UIColor"
key = _lastUsedBackgroundColor      type = @"UIColor"
key = _nextTintTransition           type = @"UIStatusBarStyleAnimationParameters"
key = _overrideHeight               type = @"NSNumber"
key = _disableRasterizationReasons  type = @"NSMutableSet"
key = _timeHidden                   type = B
key = _statusBarWindow              type = @"UIStatusBarWindow"// iPhone X
key = _statusBar ; type = @"_UIStatusBar"// 因此可见iPhone X的状态栏是多嵌套了一层,多取一次即可,最终适配代码为:
NSArray *children;
// 不能用 [[self deviceVersion] isEqualToString:@"iPhone X"] 来判断,因为iPhone X 的模拟器不会返回 iPhone Xif ([[application valueForKeyPath:@"_statusBar"] isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {children = [[[[application valueForKeyPath:@"_statusBar"] valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];} else {children = [[[application valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];}
复制代码

警告以上处理,代码看起来是不报错了,然而!!具体看了下代码发现并不生效!因为从iPhone X取出来之后只有view层级的信息,因此采用以下方法确定2G/3G/4G,从API上目测是有效的

NSArray *typeStrings2G = @[CTRadioAccessTechnologyEdge,CTRadioAccessTechnologyGPRS,CTRadioAccessTechnologyCDMA1x];NSArray *typeStrings3G = @[CTRadioAccessTechnologyHSDPA,CTRadioAccessTechnologyWCDMA,CTRadioAccessTechnologyHSUPA,CTRadioAccessTechnologyCDMAEVDORev0,CTRadioAccessTechnologyCDMAEVDORevA,CTRadioAccessTechnologyCDMAEVDORevB,CTRadioAccessTechnologyeHRPD];NSArray *typeStrings4G = @[CTRadioAccessTechnologyLTE];// 该 API 在 iOS7 以上系统才有效if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {CTTelephonyNetworkInfo *teleInfo= [[CTTelephonyNetworkInfo alloc] init];NSString *accessString = teleInfo.currentRadioAccessTechnology;if ([typeStrings4G containsObject:accessString]) {NSLog(@"4G网络");} else if ([typeStrings3G containsObject:accessString]) {NSLog(@"3G网络");} else if ([typeStrings2G containsObject:accessString]) {NSLog(@"2G网络");} else {NSLog(@"未知网络");}} else {NSLog(@"未知网络");}
复制代码
适配点二:解决这个问题后项目跑起来发现,整个app界面上下各空出大概40pt的高度

经常从 Github 上下载项目把玩的老司机们都知道,有些老项目在模拟器上跑起来之后也会只有 iPhone 4(320480)的布局空间,造成这个的原因是启动图使用 Launch Images Source 设置的时候没有勾选并设置对应的图片(11252436),解决方法如下

但是即使按照上面的操作进行之后,会发现底部 UITabBar 依旧是高出一些高度,查看层级关系后发现,同样是由于安全区的原因,UITabBar 高度由49pt变成了83pt,因此这里也要对iPhone X 及其模拟器进行适配

适配点三:iPhone X 只有 faceID,没有touchID,如果in的应用有使用到 touchID 解锁的地方,这里要根据机型进行相应的适配
适配点四:之前有偷懒的直接使用20替代状态栏高度,这些坑都要通过重新获取状态栏高度,另外没有使用自动布局的也要默默还债了
CGRectGetHeight([UIApplication sharedApplication].statusBarFrame)
复制代码
适配点五:然而iPhone X更大的坑是屏幕的适配

首先看下屏幕尺寸

这张图反映出不少信息:

  • iPhone X的宽度虽然和7是一样的,但是高度多出145pt
  • 使用三倍图是重点,而且一般认为肉眼所能所能识别的最高的屏幕密度是300ppi,iPhone X已达到458ppi(查证发现三星galaxy系列的屏幕密度是522ppi)

在设计方面,苹果官方文档human-interface-guidelines有明确要求,下面结合图例进行说明:

上面这张图内含信息略多

  • 头部导航栏不予许进行用户交互的,意味着下面这两种情况 Apple 官方是不允许的
  • 底部虚拟区是替代了传统home键,高度为34pt,通过上滑可呼起多任务管理,考虑到手势冲突,这部分也是不允许有任何可交互的控件,但是设计的背景图要覆盖到非安全区域
  • 状态栏在非安全区域,文档中也提到,除非可以通过隐藏状态栏给用户带来额外的价值,否则最好把状态栏还给用户
  • 不要让 界面中的元素 干扰底部的主屏幕指示器
  • 重复使用现有图片时,注意长宽比差异。iPhone X 与常规 iPhone 的屏幕长宽比不同,因此,全屏的 4.7 寸屏图像在 iPhone X 上会出现裁切或适配宽度显示。所以,这部分的视图需要根据设备做出适配。

适配点六:横屏适配

关于 safe area,使用 safeAreaLayoutGuidesafeAreaInset就能解决大部分问题,但是横屏下还可能会产生一些问题,需要额外适配

  • 产生这个原因代码是:[headerView.contentView setBackgroundColor:[UIColor headerFooterColor]],这个写法看起来没错,但是只有在 iPhone X上有问题

  • 解决方法:设置backgroundView颜色 [headerView.backgroundView setBackgroundColor:[UIColor headerFooterColor]]
适配点七:设备信息
if ([deviceString isEqualToString:@"iPhone10,1"])   return @"国行(A1863)、日行(A1906)iPhone 8";
if ([deviceString isEqualToString:@"iPhone10,4"])   return @"美版(Global/A1905)iPhone 8";
if ([deviceString isEqualToString:@"iPhone10,2"])   return @"国行(A1864)、日行(A1898)iPhone 8 Plus";
if ([deviceString isEqualToString:@"iPhone10,5"])   return @"美版(Global/A1897)iPhone 8 Plus";
if ([deviceString isEqualToString:@"iPhone10,3"])   return @"国行(A1865)、日行(A1902)iPhone X";
if ([deviceString isEqualToString:@"iPhone10,6"])   return @"美版(Global/A1901)iPhone X";
复制代码

更多新设备信息详见**Github-iOS-getClientInfo**

适配点八:如果是业务需求需要隐藏底部Indicator
// 在VC里面重写下面这个方法即可
- (BOOL)prefersHomeIndicatorAutoHidden{return YES;
}
复制代码
  • 史上第二走心的 iOS11-Drag & Drop 教程
  • 2017.10.02补充:iPhone X 中文官方适配文档
  • iOS11/iPhone X 适配简单,但你的Apple思维适配做好了么?

相关文章:

Grape和Sinatra结合使用

Grape && Sinatra Grape(https://github.com/intridea/grape) is a REST-like API micro-framework for Ruby Sinatra(http://www.sinatrarb.com/intro.html) is a DSL for quickly creating web applications in Ruby 可见&#xff0c;Grape适合构建纯Api系统&#xf…

公告三大“罪状”,无人驾驶公司Roadstar联合创始人被罢免

&#xff08;从左至右依次是为周光、佟显乔、衡量&#xff09; 整理 | Jane 出品 | AI科技大本营 1 月 21 日&#xff0c;因技术造假等违规行为&#xff0c;国内自动驾驶创业公司 Roadstar &#xff08;深圳星行科技有限公司&#xff09;官方宣布&#xff0c;罢免联合创始人周…

大雁悲歌,月哭泣

??时间&#xff0c;毫无感情的把这段故事剪成了碎片……??――题记????一??眺望天边那抹残红&#xff0c;心瞬间间抖落成一滴血。??无法愈合的伤口&#xff0c;夜夜繁衍着孤寂。爱,颈椎痛 &#xff0c;这个烂熟于胸的字&#xff0c;有时真是扎心般刺眼&#xff0c;…

写高质量的代码,永不言晚!

作者 | Nitesh sharma 译者 | 弯月责编 | 郭芮出转载自 CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 以下为译文&#xff1a; 在如今这个时代&#xff0c;每个人都在努力提升资源能力。在Web应用程序方面&#xff0c;我们有Spring、Play和Struts等框架&#xff0c;这…

ios searchBar 的代理方法 集合

下面是搜索框控件的一些代理方法&#xff1a; - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar;将要开始编辑时的回调&#xff0c;返回为NO&#xff0c;则不能编辑- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar;已经开始编辑时的回调- (BOOL)…

双绞线接法详解

一直以来很多人&#xff08;包括作者&#xff09;都认为10 base-t 10m网络使用了网线中8条信号线之4条&#xff0c;而100 base-t 100m则使用了全部8条信号线&#xff08;要不怎么那么快呢&#xff1f;&#xff09;。可是作者前不久在使用一条按所谓10m直连接法&#xff08;1与3…

step by step YAML 复用

yaml文件适合用来描述软件测试过程的步骤。当不同类型的CI过程集中在一个yaml文件时&#xff0c;首先碰到的一个问题是&#xff1a;大量重复的步骤如何进行复用&#xff1f; 举个例子&#xff1a; stage1:run_it:exec:- A- B- C- D1stage2:run_it:exec:- A- B- C- D2显然&#…

在winform中从外部拖动节点到树形结构(treeview和listview相互拖动)(一)

最近一个项目要用到从listview向treeview拖动item&#xff0c;达到从外部拖动图标成为树形结构的一部分&#xff0c;通过查阅资料总结了一些实现方式&#xff0c;分享给大家。这是winform中的例子。 在进行拖放操作之前&#xff0c;必须要对进行拖放操作的组件的"AllowDro…

node 模块化 require expores,简易实现原理。

为了更好的理解 Node.js 的 require 实现机制&#xff0c;我实现了一个简易的版本。我们node index.js的时候就是require(./index.js)&#xff0c;话不多说我们直接上代码&#xff1a; 目录index.jsa.jsb.jsc.jsindex.js use strictfunction $require(filepath) {const fs req…

100+Python编程题给你练~(附答案)

整理 | Just 出品 | Python大本营 春节马上就要到了&#xff0c;怎么能让自己在假期里不掉队&#xff1f;今天&#xff0c;营长给大家准备一个项目&#xff1a; 100 编程练习&#xff0c;这些题如果能坚持每天至少完成一道&#xff0c;一定可以帮大家轻松 get Python 的编程技…

为了一窥国足输韩国之后人们的评论,我爬了懂球帝App

【导语】2019亚洲杯决赛正如火如荼进行中&#xff0c;国足的晋级之路可谓用“惊现”二字评论。继1月16日&#xff0c;国足对战韩国队败北后&#xff0c;一名Python学习者为了一窥网友们的评论&#xff0c;特意爬了懂球帝App的数据。最新喜讯是在20日国足对战泰国的比赛中&#…

Mac下mysql服务器安装

Mac下mysql服务器安装 下载mysql 进入http://dev.mysql.com/downloads/mysql/ 下载Mac OS X 10.9 (x86, 64-bit), Compressed TAR Archive 安装 tar -zxvf mysql-5.6.25-osx10.9-x86_64.tar.gz mv mysql-5.6.25-osx10.9-x86_64 mysql cd mysql sudo scripts/mysql_install_db -…

linux查找文件

find . | grep xyz 将当前目录下&#xff08;包括子目录&#xff09;的文件名中含有xyz的文件过滤出来 find . | xargs grep xyz 将当前目录下&#xff08;包括子目录&#xff09;的文件内容中含有xyz的行过滤出来 转载于:https://www.cnblogs.com/anovana/p/8036032.html

Grape Api 笔记

关键字&#xff1a;namespace aliases&#xff1a;group&#xff0c;resources&#xff0c;resources&#xff0c;segment define route parameter: 1. namespace :id 2. param_route :id 关键字before 每次api请求前均执行一次 关键字helpers 1. 定义module&#xff0c;通过…

第一个spring boot应用

前提 首先要确保已经安装了java和maven&#xff1a; $ java -version java version "1.8.0_102" Java(TM) SE Runtime Environment (build 1.8.0_102-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode) $ mvn -v Apache Maven 3.3.9 (bb52d850…

【转载】xp自动校时

招式一. 自由设定XP时间同步间隔 而对于Windows 2000和XP&#xff0c;由于自身已经集成了自动对时功能&#xff0c;就不用像Win98那样麻烦地安装第三方软件了。但系统默认的时间同步间隔只是7天&#xff0c;我们无法自由选择&#xff0c;使得这个功能在灵活性方面大打折扣。其实…

发改委:互联网企业没有出现大规模裁员现象

1 月 22 日&#xff0c;据中国网报道&#xff0c;国家发改委就宏观经济运行情况举行发布会&#xff0c;新闻发言人孟玮就近期互联网行业裁员情况以及就业保障问题予以回应。 孟玮表示&#xff0c;近期国家发改委通过多种方式进行了调研&#xff0c;包括到有关企业进行座谈&…

php操作mysql的常用语句(大全)

SQL分类&#xff1a;DDL—数据定义语言(Create&#xff0c;Alter&#xff0c;Drop&#xff0c;DECLARE)DML—数据操纵语言(Select&#xff0c;Delete&#xff0c;Update&#xff0c;Insert)DCL—数据控制语言(GRANT&#xff0c;REVOKE&#xff0c;COMMIT&#xff0c;ROLLBACK)p…

ElasticSearch + xpack 使用

ElasticSearch 是一个高可用开源全文检索和分析组件。提供存储服务&#xff0c;搜索服务&#xff0c;大数据准实时分析等。一般用于提供一些提供复杂搜索的应。我们为什么要选择 ElasticSearch &#xff1f;因为它是一个准实时的搜索工具&#xff0c;在一般情况下延时少于一秒&…

java coverage exclude使用

使用cobertura&#xff1a;http://mojo.codehaus.org/cobertura-maven-plugin/usage.html 若想要忽略一部分代码&#xff0c;可以通过exclude来指定&#xff1a; <configuration> <instrumentation><excludes><exclude>com/alibaba/ws/gcenter/web/**/…

人工智障?243个机器人被裁

图片源自 Henn-na 官网作者 | 若名出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;全球经济降温&#xff0c;企业裁员消息不断&#xff0c;如果你不能带来显著效益&#xff0c;则很有可能被淘汰&#xff0c;即使是机器人&#xff0c;也难逃被裁的命运。“我们酒店的…

Silverlight C# 游戏开发:Silverlight开发环境

Silverlight C# 游戏开发&#xff1a;Silverlight开发环境 所谓工欲善其事必先利其器&#xff0c;没有好的工具也没有办法做事&#xff0c;我以前曾经想学习C以外的程序语言&#xff0c;当时有java和C#来选择&#xff0c;当时考虑java比较受推崇&#xff0c;可能会比较好一些&a…

算法工程师必须要知道的面试技能雷达图

本文作者王喆&#xff0c;硅谷高级机器学习工程师。转载自知乎专栏&#xff1a;https://zhuanlan.zhihu.com/p/52169807这里是 王喆的机器学习笔记 的第五篇文章&#xff0c;今天我们不聊paper&#xff0c;换一个轻松一点的话题&#xff0c;聊一聊如何准备算法工程师的面试。今…

Qt中文手册 之 QHeaderView

一、 头文件:#include<QHeaderView> 继承自:QAbstractItemView 二、属性 1、cascadingSectionResizes : bool 如果下一区域已经达到最小,是否继续改变下下一个区域的大小。 前提条件是:设置setResizeMode()为interactive 默认是false 相关函数: bool cascadingS…

Linux硬盘性能测试工具 - FIO

1.安装&#xff1a;方法一&#xff1a;直接用指令yum -y install fio方法二&#xff1a;如果方法一不可行则&#xff0c;在官网http://freshmeat.net/projects/fio/下载fio的安装包。安装方法很简单。解压缩后&#xff0c;进入目录输入./configure make make install。2.执行…

linux下vmware tools工具共享

(1.)现在windows 创建一个文件件linux,添加一个test.txt文件(2).虚拟机—设置&#xff08;red hat linux挂载起来&#xff0c;或运行&#xff0c;有的时候都处于禁用状态&#xff0c;如果这样就有关闭red hat linux&#xff0c;然后再进行设置&#xff09;--选项 –文件夹共享—…

在全面部署 IPV6 前,你需要了解都在这儿

IPv6 的发展形势 近日&#xff0c;中办国办印发《推进互联网协议第六版&#xff08;IPv6&#xff09;规模部署行动计划》&#xff08;以下简称《计划》&#xff09;&#xff0c;加快推进基于 IPv6 的下一代互联网规模部署&#xff0c;计划指出到 2018 年末国内 IPv6 活跃用户数…

Qt中文手册 之 QApplication

QApplication管理GUI程序的控制流和主要设置。 QApplication包含由窗口系统和其他来源处理过和发送过的主事件循环。它也处理应用程序的初始化和收尾工作,并提供对话管理。QApplication可以对系统和应用的大部分设置项进行设置。 对于用Qt写的任何一个GUI应用,不管这个应用…

微信真要做操作系统了?

整理 | 仲培艺转载自CSDN&#xff08;ID:CSDNnews&#xff09;微信爸爸又带着小程序搞事了&#xff0c;一夕之间&#xff0c;小程序界面“变天”&#xff0c;类操作系统来了。「微信二楼」&#xff1a;欢迎来到小程序的世界下拉即见又一个手机桌面&#xff1f;&#xff01;1 月…

netsh命令修改ip

当前笔记本的可移动性增强&#xff0c;我们需要在多个环境下接入网络开始工作&#xff0c;在没有路由器自动分配的情况下&#xff0c;就需要每次手动设置IP地址和网关等信息&#xff0c;相当烦琐&#xff0c;通过实践利用netsh命令用快捷方式实现了IP地址的快速切换。A. 基本用…