Hexo


  • 首页

  • 分类

  • 归档

  • 标签

初识安卓点九图

发表于 2016-04-08   |   分类于 android   |  

左边点或线控制竖直方向将哪部分拉伸

上边点或线控制水平方向将哪部分拉伸

下边点或线控制内容范围

右边点或线控制内容范围

iOS实用宏

发表于 2016-04-07   |   分类于 iOS   |  

宏

1
2
3
__attribute__((unavailable("Invoke the designated initializer")))

__attribute__((objc_designated_initializer))

用法

1
2
3
4
5
6
7
@interface ZOCNewsViewController : UIViewController

- (instancetype)initWithNews:(ZOCNews *)news ZOC_DESIGNATED_INITIALIZER;
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil ZOC_UNAVAILABLE_INSTEAD(initWithNews:);
- (instancetype)init ZOC_UNAVAILABLE_INSTEAD(initWithNews:);

@end

个人对restful api的一些理解

发表于 2016-03-29   |   分类于 other   |  

最近帮朋友做一个应用的api,采用restful api作为规范。

restful api的一些核心概念

restful api提倡把所有组件都视为资源,因此url中只应该是名词,不应出现动词。用get,post,put,patch,delete等动词对资源进行操作。如对于一个资源user,可以分别用上述动词对其进行增删改查操作。

那么,对于无法明显对应到增删改查范围内的操作如何处理呢?

对于login的处理

通常理解,login是user的操作。所以URI应该是这样的:/users/login。

但是注意restful提倡uri中不应该出现动词,因为uri中的内容都是资源。

那么login是对哪个资源进行操作的呢?又是进行增删改查中的哪个操作呢?

一般登录接口中会返回access_token及用户信息。考虑到login不是新增用户;也不是删;不是改,因为没有改变什么内容;也不是仅仅是查,因为还新增了access_token。那么我们无法将login简单的对应到增删改查中的任意一个操作。

从login所做的具体逻辑出发,login做了两个操作,一是验证用户是否合法,这属于业务逻辑,不做讨论;二是查用户信息,这属于查操作,操作的资源是User;三是增access_token,这又属于新增操作,操作的资源是token。那么login就对应了增删改查中的两个操作,两个资源。所以应该如何处理呢?

个人衡量下认为,应该将login作为增操作进行处理,即采用post方式进行请求。同时在请求中返回User信息。

既然这么处理,那么最合理的url应该是:/user/{userid}/token。但是考虑到实际情况中,/user/login是最易理解并被大家接受的,所以url我建议依然采用/user/login,同时动词依然采用post。

mantle的使用备忘

发表于 2016-03-21   |   分类于 iOS   |  

关于mantle的使用

mantle使用注意事项

数组transformer

1
2
3
+ (NSValueTransformer *)available_couponsJSONTransformer {
return [NSValueTransformer mtl_JSONArrayTransformerWithModelClass:MCIpadVerifyCoupon.class];
}

字典transformer

1
2
3
+ (NSValueTransformer *)related_couponJSONTransformer {
return [NSValueTransformer mtl_JSONDictionaryTransformerWithModelClass:MCIpadVerifyCoupon.class];
}

对象成员转换

必须继承MTLModel,声明MTLJsonAdapter,实现MTLJsonAdapter协议

nsnumber转nsstring

1
2
3
4
5
6
7
+ (NSValueTransformer *)course_typeJSONTransformer {
return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSNumber *courseType) {
return [NSString stringWithFormat:@"%@",courseType];
} reverseBlock:^(NSString *courseType) {
return [NSNumber numberWithLong:courseType.longLongValue];
}];
}

安卓json解析库Gson的基本使用

发表于 2016-03-17   |   分类于 android   |  

安卓json解析库Gson的基本使用

安卓初学者,在使用gson库时碰到一些问题,特记录在此以备忘

基本用法

首先先讲一个比较简单点的例子(最简单的我就不讲啦,网上很多),帮助新手理解Gson的使用方法:
比如我们要解析一个下面这种的Json:
String json = {“a”:”100”,”b”:[{“b1”:”b_value1”,”b2”:”b_value2”},{“b1”:”b_value1”,”b2”:”b_value2”}],”c”:{“c1”:”c_value1”,”c2”:”c_value2”}}
首先我们需要定义一个序列化的Bean,这里采用内部类的形式,看起来会比较清晰一些:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  public class JsonBean {
public String a;
public List<B> b;
public C c;

public static class B {
public String b1;
public String b2;
}

public static class C {
public String c1;
public String c2;
}
}

很多时候大家都是不知道这个Bean是该怎么定义,这里面需要注意几点:
1、内部嵌套的类必须是static的,要不然解析会出错;
2、类里面的属性名必须跟Json字段里面的Key是一模一样的;
3、内部嵌套的用[]括起来的部分是一个List,所以定义为 public List b,而只用{}嵌套的就定义为 public C c,
具体的大家对照Json字符串看看就明白了。

1
2
3
Gson gson = new Gson();
java.lang.reflect.Type type = new TypeToken<JsonBean>() {}.getType();
JsonBean jsonBean = gson.fromJson(json, type);

然后想拿数据就很简单啦,直接在jsonBean里面取就可以了!
如果需要解析的Json嵌套了很多层,同样可以可以定义一个嵌套很多层内部类的Bean,需要细心的对照Json字段来定义哦。

文章来源:http://www.cnblogs.com/jxgxy/p/3677256.html

字段与java关键字重名时候的处理

只要对该变量添加Field Naming Support就可以了。

1
2
3
4
public class BoxSubject {
@SerializedName("new")
private boolean new;
}

参考文章:http://www.jianshu.com/p/b23792d4ba31

Gson官方文档(详细,值得细读)

https://sites.google.com/site/gson/gson-user-guide#TOC-JSON-Field-Naming-Support

JSContext实现js注入

发表于 2016-03-15   |   分类于 iOS   |  

本文记录了iOS端实现js注入的基本方法。

webview内进行跳转后之前注入的js失效的问题

可以在下面函数中重新进行js注入:

1
2
3
4
- (void)webViewDidStartLoad:(UIWebView *)webView
{
[webView setupJSContext];
}

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@protocol MyPointExports <JSExport>
@property double x;
@property double y;
- (NSString *)description;
- (instancetype)initWithX:(double)x y:(double)y;
+ (MyPoint *)makePointWithX:(double)x y:(double)y;
@end

@interface MyPoint : NSObject <MyPointExports>
- (void)myPrivateMethod; // Not in the MyPointExports protocol, so not visible to JavaScript code.
@end

@implementation MyPoint
// ...
@end
1
2
3
4
5
6
- (void)setupJSContext
{
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
MyPoint *mobile=[[MyPoint alloc] init];
context[@"mobile"]=mobile;
}

集成Reveal:不修改您的Xcode工程并加载Reveal

发表于 2016-03-10   |  

此方法仅适用于在iOS模拟器上运行的应用。

通过不修改Xcode工程文件来加载Reveal的方式,您可以检视任何一个您正在开发的iOS应用,而不需要对这些应用的工程做任何修改。另一个好处就是,您不需要再担心,犯下一不小心将Reveal库连接到应用中发布了的错误。

1. 打开您的iOS工程,选择 View → Navigators → Show Breakpoint Navigator。

2. 在面板左下角,点击 + 按钮并选择Add Symbolic Breakpoint。

enter image description here

3. 在 Symbol 输入区内输入 UIApplicationMain 。

4. 点击 Add Action 按钮, 确认 Action 被设置为 Debugger Command。

5. 将以下内容拷贝到 Action 的输入区内:

For iOS targets:

expr (Class)NSClassFromString(@”IBARevealLoader”) == nil ? (void )dlopen(“/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib”, 0x2) : ((void)0)

For tvOS targets:

expr (Class)NSClassFromString(@”IBARevealLoader”) == nil ? (void )dlopen(“/Applications/Reveal.app/Contents/SharedSupport/tvOS-Libraries/libReveal-tvOS.dylib”, 0x2) : ((void)0)

Note: If necessary, update the path to Reveal.app above to the correct location for your Mac.

6. 选中 Automatically continue after evaluating actions 选项。

enter image description here

7. 右击刚才新创建的断点,选择 Move Breakpoint To → User.

enter image description here

您可以像其他断点一样,禁用或启用此断点。用户级别断点在所有的Xcode工程中都可以使用。

8. 在iOS模拟器上构建并运行您的应用。

enter image description here

如果一切正常运行,请切换到Reveal应用,此时您的应用应会出现在应用选择器的下拉列表当中。选中您的应用,确认可以看到此时正在模拟器中运行的应用界面截图。

参考:http://support.revealapp.com/kb/getting-started/integrating-reveal-load-reveal-without-changing-your-xcode-project

chmod的使用

发表于 2016-03-09   |  

常用命令:mkdir的使用

发表于 2016-03-09   |  

mkdir用来创建文件夹。如mkdir temp会在当前目录创建名为temp的文件夹。
虽然mkdir是个很常用的命令,我个人对它的参数却不熟悉,很少用到。因此写此文总结一下。

用法

mkdir [-pv] [-m mode] directory_name …

题外话:上面的中括号标识可选参数。-pv也是两个可选参数,不必同时出现。

参数解释

-p: 距离来说在创建a/b/c这样的目录时候,加入文件夹b不存在,默认情况是是会报错“mkdir: a/b: No such file or directory”的。但加入-p参数则能自动创建路径中不存在的文件夹并成功运行。

-v: 在文件夹成功创建后,给出文字提示。示例如下:

mkdir -v a
mkdir: created directory ‘a’

-m: 由于对chmod命令的使用还不熟悉,这部分解释待日后补充。

Set the file permission bits of the final created directory to the specified mode. The mode argument can be in any of the formats specified to the chmod(1) command. If a symbolic mode is specified, the operation characters “+” and “-“ are interpreted relative to an initial mode of ``a=rwx’’.

unity5整合admob实践

发表于 2016-03-08   |   分类于 unity   |  

分为iOS和安卓两部分

公共部分

  1. 下载unity-admob插件,并引入unity工程。下载地址
  2. 下载unity-admob示例代码,将samples/HelloWorld/Assets路径下文件引入工程。下载地址
  3. 更换GoogleMobileAdsDemoScript内的广告id。

iOS

Enable Modules(C and Objectvie-C)设置为YES
使用“工程名.workspace”打开工程,如有需要则pod install,也可在谷歌直接下载admob依赖库,并引入工程。

安卓

Done

12
Ryan Ma

Ryan Ma

I want to ...

12 日志
4 分类
8 标签
github weibo zhihu
© 2016 Ryan Ma
由 Hexo 强力驱动
主题 - NexT.Mist