Cocoa

iOS中UIWebView的Javascript与Objective-C通信

在iOS开发中经常要用到UIWebView,想让Html页面和native本身结合的更好,难免需要让Objective-C和Javascript通信。

那么如何让他们直接能通信呢?大部分用过UIWebView的朋友都知道stringByEvaluatingJavaScriptFromString:,使用这个消息,可以让UIWebView执行Objective-C发来的JS语句。这样Obj-C --> JS的问题解决了。

接下来,如何实现JS --> Obj-C呢?UIWebViewDelegate中有个webView:shouldStartLoadWithRequest:navigationType:。当UIWebView请求某个url之前都会调用这个消息,这个消息的返回值决定着UIWebView是否要加载这个url。我测试了一下改变JS中的location.href也可以触发这个消息。有了这条路子我们就有办法实现JS --> Obj-C

经过几番折腾就有了我的开源项目TGJSBridge,这个项目主要实现了JS与Obj-C之间的项目通信。JS可以向Obj-C发送JSON对象,Obj-C将收到相应的NSDictionary。反过来也一样,TGJSBridge会自动转换数据结构。JS通过bind订阅消息,Obj-C通过委托接收消息。

让UIColor支持Hex值

在使用Cocoa的地方,有个很奇怪问题。为什么每次实例化一个UIColor的时候非要分别指定RGBA四个值,而且每个值都需要除以255.0f。作为前端出生的我太不适应了。公司产品的界面自定义太多了,需要用到特殊颜色的地方也很多。一个颜色值从Photoshop吸取出来后,需要复制四个值。n个颜色也就需要复制4n次。每次都要我这么搞,这也太坑爹了吧。

那有没有办法让UIColor和网页中的CSS那样使用Hex(十六进制值)来指定呢?我写了个UIColor的Category解决了这个问题。

使用Quartz绘制带阴影的圆角图

最近在做iOS开发的时候,遇到这样的需求:需要开发一个高度自适应的控件,背景使用图案平铺,控件下方两个角为圆角,控件的下边有5像素宽的阴影。具体如图所示:

需求效果图

方案A

在做这个需求时首先想到是用colorWithPatternImage来平铺图片,然后使用CALayer添加阴影。