读完的书

  1. 催眠师手记
    刚开通借阅,看到首页推荐,于是下下来看了下。故事还可以,看到一多半的时候就开始腻……最后是努力看完的后面两个故事,属于还能看看的故事书吧。本来以为是专业性比较强的东西,结果是打着手记外衣的小说。作者有点模仿福尔摩斯的感觉,只是这次厉害的那个关键人物换成了非第一人称:解密二人组,有一个人上知天文下知地理专业精湛,另一个负责处理杂事以及理解天才的不可理解之处。这样的故事讲好了也还不错,只可惜这本书里的故事,有点装神弄鬼。Any way,比起普遍的酸酸文艺风和无法直视的网文,这本书还算可以一读,拿来休闲正好。

读完的杂志

  1. 中文传媒精选
  2. 知乎周刊2015年度300问-心理
    阅读全文 »

工作原因换上了最新的树莓派3B,使用了几天,虽然变化不大,但跟2B还是有一些区别的。在这里写下来供爱好者们参考。

  1. 硬件上,基本上是可以通用的,接口跟2B保持一致,GPIO的排列也没有变过。值得注意的是3B自带了WIFI模块,所以你会看到开机就能有Wlan0的设备。
  2. 系统上,有一些改变可能是操作系统升级导致的,比如cmdline跟以前不同,但总的来说变化不大。官网的烧录img和github提供的kernel源码现在都已经提供了3B的支持,只是烧录系统就不讨论了,如果是自己编译kernel的话要注意/boot/bcm2710-rpi-3-b.dtb这个文件,这是系统支持3B的关键。内核的img名字还是kernel7.img没变,新的系统能同时支持3B和2B。是否把bcm2701-rpi-3-b.dtb拷贝到旧的系统中就能使其支持3B,我没有测试过,但我想应该不能成功,因为恐怕还需要更新一些index。
  3. 实际使用中,关于UART发现了一个很好玩的变化。以前串口的设备是/dev/ttyAMA0,但在3B上变成了/dev/ttyS0。确切地说,是3B的设备多出来一个ttyS0,并且使用ttyAMA0无法传输数据,必须使用ttyS0。前面说了新的系统可以同时兼容两种板子,我用同样的软件在2B和3B上都试了一下,2B依然只有ttyAMA0,所以可以肯定这不是软件升级的区别,具体原因就不知到了。
    目前只看到这些不同,用起来也没什么区别的样子,可能好的地方就是可以省出一个USB口吧。😀

这些小Tips为本人近期读书笔记,收集来自网络开发者发布的技术文档,并非原创,共享的目的是为了扩散分享技术,共同进步。如有侵权不得转载等情况,请联系我告知,谢谢!

  • iOS获取通知需要注意以:iOS 设备收到一条推送(APNs),用户点击推送通知打开应用时,应用程序根据状态不同进行处理需在 AppDelegate 中的以下两个方法中添加代码以获取apn内容
    1. 如果 App 状态为未运行,此函数将被调用,如果launchOptions包含UIApplicationLaunchOptionsRemoteNotificationKey表示用户点击apn 通知导致app被启动运行;如果不含有对应键值则表示 App 不是因点击apn而被启动,可能为直接点击icon被启动或其他。
      (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions;
      // apn 内容获取:
      NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]
  • 基于iOS 6 及以下的系统版本,如果 App状态为正在前台或者点击通知栏的通知消息,那么此函数将被调用,并且可通过AppDelegate的applicationState是否为UIApplicationStateActive判断程序是否在前台运行。此种情况在此函数中处理:
    (void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo; // apn内容为userInfo
  • 基于iOS 7 及以上的系统版本,如果是使用 iOS 7 的 Remote Notification 特性那么处理函数需要使用
    (void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler; // apn内容为userInfo
  • 触摸事件withEvent:的方法处理流程:首先会在当前视图view上调用pointInside:withEvent:方法来判断触摸事件是否存在当前view中,如果返回NO,则说明触摸事件不在该view范围中,hitText:withEvent:方法返回nil;如果返回YES,则说明触摸在该view中,则向该view的subViews发送htiText:withEvent:消息,所有subviews的数组遍历顺序是从后往前,直至遍历到pointInside:withEvent:返回值为非空或者遍历完所有subview结束。如果遍历有非空对象,则hitTextField:withEvent:返回该对象结束;如果遍历完没有非空对象,则返回自己(self)。
  • 响应者原理:首先会在触摸view上调用inital view方法,看能否处理此事件,如果不能则会将事件传递给其上级视图(inital view的superView);如果上级视图仍然无法处理则会继续往上传递;一直传递到视图控制器view controller,首先判断视图控制器的根视图view是否能处理此事件;如果不能则接着判断该视图控制器能否处理此事件,如果还是不能则继续向上传递;(对于第二个图视图控制器本身还在另一个视图控制器中,则继续交给父视图控制器的根视图,如果根视图不能处理则交给父视图控制器处理);一直到window,如果window还是不能处理此事件则继续交给application(UIApplication单例对象)处理,如果最后application还是不能处理此事件则将其丢弃。
  • UITabBarController的subview 共有两个,一个叫 UITabBar,就是底下的那个 Bar;另一个叫UITranstionview,就是 Bar 上面的视图。把UITabBar的 y 向下移49个单位,把UITranstionview 的 hight 加长 49 个单位,也能实现隐藏UITabBar的效果。
  • UITextView开始编辑时,文字没有左上角对齐解决办法:其一,没有给textview对齐方式;其二,没有将BOOL类型的“automaticallyAdjustsScrollViewInsets”属性置为yes

这些小Tips为本人近期读书笔记,收集来自网络开发者发布的技术文档,并非原创,共享的目的是为了扩散分享技术,共同进步。如有侵权不得转载等情况,请联系我告知,谢谢!

  • UIImage两种初始化方式的区别:
      使用imageNamed:第一次读取的时候,先把这个图片放到缓存里,下次再使用到这个同名图片的时候直接从缓存中读取;优点:方便快捷,只有第一次使用的时候稍慢,接下来再使用就会稍微快点;缺点:如果在当前工程中只使用一次会浪费内存。(这个内存在程序关闭的时候才释放)
      使用initWithContentsOfFile:每次都会根据路径去读取,不会占用内存,如果图片在当前工程中只使用一次,应该选择这个方法
  • UIView和CALayer的区别与联系)
    1. 每个 UIView 内部都有一个 CALayer 在背后提供内容的绘制和显示,并且 UIView 的尺寸样式都由内部的 Layer 所提供。两者都有树状层级结构,layer 内部有 SubLayers,View 内部有 SubViews.但是 Layer 比 View 多了个AnchorPoint
    2. 在 View显示的时候,UIView 做为 Layer 的 CALayerDelegate,View 的显示内容由内部的 CALayer 的 display
    3. CALayer 是默认修改属性支持隐式动画的,在给 UIView 的 Layer 做动画的时候,View 作为 Layer 的代理,Layer 通过 actionForLayer:forKey:向 View请求相应的 action(动画行为)
    4. layer 内部维护着三分 layer tree,分别是 presentLayer Tree(动画树),modeLayer Tree(模型树), Render Tree (渲染树),在做 iOS动画的时候,我们修改动画的属性,在动画的其实是 Layer 的 presentLayer的属性值,而最终展示在界面上的其实是提供 View的modelLayer
    5. 两者最明显的区别是 View可以接受并处理事件,而 Layer 不可以
  • 在使用 ImagesQA.xcassets 时需要注意:将图片直接拖入image到ImagesQA.xcassets中时,图片的名字会保留。这个时候如果图片的名字过长,那么这个名字会存入到ImagesQA.xcassets中,名字过长会引起SourceTree判断异常。
  • UIScrollView添加了一个很好用的属性keyboardDismissMode,这样可以让键盘在滚动时自动收起。这个属性使用了新的UIScrollViewKeyboardDismissMode enum枚举类型。这个enum枚举类型可能的值如下:
    阅读全文 »

这些小Tips为本人近期读书笔记,收集来自网络开发者发布的技术文档,并非原创,共享的目的是为了扩散分享技术,共同进步。如有侵权不得转载等情况,请联系我告知,谢谢!

  • 当手势和touchmoved同时加在uiview上面的时候将会优先的识别手势。滑动手势的识别是需要时间的,当手势在被识别出来以前,touchbegan 依旧会被调用。如果你希望在你的手势被识别的过程中touchbegan不被调用,那么你需要调用delaysTouchesBegan。
  • 修改状态栏字体颜色:只能设置两种颜色,黑色和白色,系统默认黑色。设置为白色方法:
    1. 在plist里面添加Status bar style,值为UIStatusBarStyleLightContent(白色)或UIStatusBarStyleDefault(黑 色)
    2. 在Info.plist中设置UIViewControllerBasedStatusBarAppearance 为NO
  • 改善APP的流畅度:
    1. 尽量不要实现drawRect(每次调用该方法时,都要为backing store分配内存,非常消耗CPU)
    2. 避免在drawRect:中进行耗费大量CPU资源的工作
    3. 尽量少调用setNeedsDisplay:(视图内容变化时才调用)
    4. 考虑使用setNeedDisplayInRect: , 传入drawRect:的rect越小,stoke,fill的时间越少, 即使drawRect:是根据视图边界绘制的)
    5. 充分利用GPU的资源,直接设置layer的border,shadow,corner,gradient等属性, GPU将会处理这些属性(相反如果GPU紧张,CPU空闲,应由CPU处理,可在drawRect:中实现)
      阅读全文 »

这些小Tips为本人近期读书笔记,收集来自网络开发者发布的技术文档,并非原创,共享的目的是为了扩散分享技术,共同进步。如有侵权不得转载等情况,请联系我告知,谢谢!

  • UIProgressView 的 subviews 是两个 UIImageView,第一个是 TrackTintColor 层(轨道),第二个是 Progress Tint Color 层(进度)
  • 如果你对文本显示没有特殊要求,可以参考下 UILabel 内部的实现方式:用 NSAttributedString boundingRectWithSize:options:context: 来计算文本宽高,用 -NSAttributedString drawWithRect:options:context: 来绘制文本。尽管这两个方法性能不错,但仍旧需要放到后台线程进行以避免阻塞主线程
  • 为了帮助你发现你的代码的问题,你可以使用Xcode来分析你的代码,帮助你找到出现问题的地方。注意,Xcode分析项目,它会指出每一个潜在的可能出现的问题的地方。从Xcode的 Product菜单选择 Analyze或按 Shift-Command-B.Xcode的将需要片刻的时间,但是当它完成的时候你会在左边的 Issue Navigator看到问题列表。由Analyze发现的问题用蓝色高亮显示
  • 多视图控制器跳转方法
    1. Modal:
      打开:presentViewController
      关闭:dismissViewController
    2. Push:需搭配NavigationController使用,采用压栈和出栈的方式
      打开:pushViewController
      关闭:popViewController
    3. Segue:以上两种方式都可以,如果在打开目标控制器前需要额外处理,可使用perfromSegueWithIdentifier方法。Identifier在storyboard里设置。
  • 设置UIImage的渲染模式:你可以设置一个UIImage在渲染时是否使用当前视图的Tint Color。UIImage新增了一个只读属性:renderingMode,对应的还有一个新增方法:imageWithRenderingMode:,它使用UIImageRenderingMode枚举值来设置图片的renderingMode属性。该枚举中包含下列值:
    阅读全文 »

首先, http://conanwhf.github.io 还是可用主力哈!

主要是怕哪天GFW发威上不了了,所以在国内服务商放个镜像而已。

墙内新域名:http://conanwhf.coding.me/

旧的gitcafe那个,就不用了

周末爬山下海的,肌肉酸痛还没解除,就看到GitCafe要关闭,整个迁移到Coding去了,晕!连封邮件也没发给我,突然就说什么要全部迁移删除,然后一看时间,最后期限5月份,但是从今天开始就全部只读了……😡我真是服了国内的这些服务商,不靠谱到了一个境界。还能怎么办呢?迁移呗!本来因为是中文博客,我的各种相关配置和网络服务都注册的是GitCafe的域名,这次也都要检查一遍、修改更换,麻烦死了。以后还是准备回归GitHub为主吧!
另外,因为gitcafe已经全面只读了,我连提交个域名更新说明的机会都没,真是@#$$(%#^%^)$$%^%$#$%😤😱
长长的年过完了,紧接着又巴厘岛玩了几天,以至于留下了太多功课没有做完。家里两位老人天天拉着我聊天修电脑,再加上新接了个项目,搞OpenCV和C++搞得连轴转,更没时间管iOS的东西了。想想每天也没做什么,过个年,跑跑步,吃三顿饭,刷刷新闻社交,帮公婆处理点杂事,研究旅游的各种事情,最后出去玩一趟,怎么哗哗哗一个月就过去了?!搞得我好焦虑,害怕项目进度赶不完。怎么办!!!

你看到的是非授权版本!爬虫凶猛,请尊重知识产权!

转载请注明出处:http://conanwhf.github.io/2016/03/02/addressUpdate/

访问原文「域名更新」获取最佳阅读体验并参与讨论

这些小Tips为本人近期读书笔记,收集来自网络开发者发布的技术文档,并非原创,共享的目的是为了扩散分享技术,共同进步。如有侵权不得转载等情况,请联系我告知,谢谢!

  • UIView 的translatesAutoresizingMaskIntoConstraints属性为true时,设置 frame 会自动转化为约束,修改 frame 时也会自动调整约束。这时候就不要再手动添加约束了,你再添加约束往往会造成冲突
  • 使用XCODE交付应用,常见的返回错误:
    1. ERROR:–90096 :原因是:启动图的问题;解决 :添加一张名字是 Default-568h@2x.png 的启动图;
    2. ERROR:–90535 :原因是:导入的第三方的问题;解决 :删除第三方包中的info.plist里的Executable file 这一行
  • ios下每个app可用的内存是被限制的,如果一个app使用的内存超过了这个阀值,则系统会向该app发送Memory Warning消息。收到消息后,app必须尽可能多的释放一些不必要的内存,否则OS会关闭app。
  • 数组的contains方法需要用到==操作符,所以当数组的内容为自定义类型,且需要使用contains方法是,需要自定义的类实现Equatable协议即可
  • Swift 的枚举类型,如果指定了原始值的类型(Int, String等),就会有默认值的存在。如果不指定原始值类型,编译器就不会分配默认值。
    1. 当枚举类型的原始值类型指定为 Int 时,这个时候,就和其他语言的枚举的默认值分配一样,从0开始
    2. 如果指定了一个枚举值的原始值,后面接下来的枚举值的原始值会自动 +1
    3. 原始值类型为字符串的时候,默认的值就是和枚举值的字符串一样
    4. 没有设置原始值的,就使用默认值
  • 开发中经常会遇到控件不接收用户交互了,可以从以下几个方面检查:
    阅读全文 »