Browsing all articles in 代码
Aug
18

kal iphone日历控件

Author laihj    Category 善其事     Tags , ,

不废话,先上图

kal

自带的例子演示了三种数据源的用法:iphone自带日历,json和sqlite.

githut地址:https://github.com/klazuka/Kal

Apr
25

[ios] shareKit,三行代码分享到社交媒体

Author laihj    Category 善其事     Tags , , ,

shareKit是一枚ios上的分享库,支持分享文字,URL,图片和文件(取决于目标媒体是否支持)。

操作相当简单,只要三行代码。

- (void)myButtonHandlerAction
{
	// Create the item to share (in this example, a url)
	NSURL *url = [NSURL URLWithString:@"http://getsharekit.com"];
	SHKItem *item = [SHKItem URL:url title:@"ShareKit is Awesome!"];
 
	// Get the ShareKit action sheet
	SHKActionSheet *actionSheet = [SHKActionSheet actionSheetForItem:item];
 
	// Display the action sheet
	[actionSheet showFromToolbar:navigationController.toolbar];
}

actionSheet.png

详细文档

Mar
24

iTimeLog的输入部分

Author laihj    Category 善其事, 负暄琐话     Tags ,

iTimeLog是为了解决一个问题而出现的,当你晚上躺在床上准备睡觉的时候,你觉得这一天过得怎么样?

这个问题可以分成两个部分:第一,你的都做了哪些事,各花了多少时间?第二,这些时间都是值得的吗,这些事都是需要做的吗

为了回答这两个问题,你必须记录下你的时间花费。

现在app store上已经有几个时间记录的软件了,但我觉得它们有一点做得不够,就是减少输入的复杂性。这也是iTimeLog存在的原因,iTimeLog的设计方向就是不断地减少输入复杂性,让输入尽量简单,减少记录时间的额外花销。

1

为了达到这个目的,iTimeLog的整个输入界面布局设计跟iphone的短信界面差不多,采用界面底部输入框的方式,输入事件后点击add号即可开始一个事件,记录开始时间,完成一件事情后,点击事件上的done即可打上完成时间,并自动算出耗时多少。但点击done的操作方式即不是必需的也不被鼓励,iTimeLog遵循一时一事的原则,开始新的事件的同时,会自动停止上一事件,也就是说,在流式的工作中,只需在开始做一件事的时候,在iTimeLog中输入一个事件即可,其它的工作iTimeLog会自动完成。

人在江湖,总有工作被打断的时候,比如在编码时收到电话说用户又懒得查手册了,这时停下来帮忙查手册已然不舒服,时间紧迫也不能慢悠悠地写事件记录。所以iTimeLog允许不输入任何文字的情况下直接点击add,这相当于先打一个时间戳,之后有时间再回头进行编辑。

对大部分人来说,一天所做的事多是重复的。比如一个标准的码农,一天的事大概就是起床-吃饭-编码-游戏-编码-看书-吃饭-睡-编码-吃饭-看书-游戏-睡。

因此iTimeLog在每一个事件记录上都放了一个redo按钮,如果一个事件在屏幕上显示,只需点击redo就可以开始它,而不需要调出键盘重新输入。比如“编码-游戏-编码”事件串,当玩完游戏重新开始编码的时候,redo它就可以了。

app-store

Jan
23

[iphone] 饼图配色初级

Author laihj    Category 善其事     Tags , , ,

pie3pie1pie2

目前正在进行中的项目需要用到饼图,参考初级的配色教程做了一个初级的配色方案。在使用随机配色的情况下,看上去并不会差到难以忍受的程度,虽然肯定比不上专业设计。上图是相同数据在iphone模拟器上的显示。

做法如下:

1.准备色盘,色盘我直接使用上面提到的教程上那个标准色盘,教程中有八级亮度的色盘可选,当然也可以准备别的色盘。在代码中使用包含12个UIColor的数组。

2.初始色:初始色是指第一个选中的颜色,我取(1-12)的随机数。考虑到用户数据可能不多,饼图的分区可能偏少等因素,不想使用固定的初始值,防止用户每次打开饼图都看到同样的配色。

3.确定分区取色规则。(设定色盘为一个数组)

  • 一个分区:取初始色
  • 两个分区:取初始色和对角色(即初始色+6)
  • 三个分区:初始色,初始色+4,初始色+8

以此类推,设定一到六个分区的取法,七到十一个分区,使用一到一个分区的补集。

即,十一个分区:色盘减去一初始色。

十个分区:色盘减去初始色和其对角色。

其它:整个配色的冷暖明暗,我个人觉得跟最大的扇形区选色有关,我的做法是最大的扇区使用初始色,所以如果我想控制饼图,令整体色调偏暖,可以把初始色的随机值控制在几个暖色上。

Jan
10

[ios]简单的饼图代码推荐

Author laihj    Category 善其事     Tags , , ,

屏幕快照 2011-01-10 上午11.45.25

在iphone上画报表,有收费的方案,一般开源的推荐就是:

不过,如果你只是想画饼图,同时也不想给自己找太多麻烦,或是项目时间太紧,可以试试以下这个简单的方案。

代码来自 cocoachina.com

使用这段代码有常见的两个问题的解决方案

1:阴影

如果你不想要原来代码中的阴影,搜”CGFloat CGGradientCreateWithColorComponents“,把第二个参数改成nil。

CGGradientRef gradient = CGGradientCreateWithColorComponents(colorspace, nil, nil, 2);


2.缺角

当你做了第一步之后,会发现饼缺一个角,这应该是一个Bug.

搜”只有弧度《 3.14 的才会画前面的厚度”把else中的break改成continue.

 

Jan
6

[ios note]实现UITextView的圆角

Author laihj    Category 善其事     Tags , , ,

屏幕快照 2011-01-06 下午06.46.31

UITextView用于显示和输入大段文字,没有设置圆角的属性,跟UITextField不一致,在既有UITextField又有UITextView的界面中显得很突兀。

实现UITextView圆角的方法是借助UITextView的layer.原码如下:

foobar.h

#import <QuartzCore/QuartzCore.h>

foobar.m

note.layer.cornerRadius = 6;

note.layer.masksToBounds = YES;


效果:

屏幕快照 2011-01-06 下午06.45.57

 

Dec
22

[ios note] view

Author laihj    Category 善其事     Tags ,

view是程序与用户交流的主要方式。

  • 布局管理subviews
    • 定义自己的resize行为
    • 管理一系列subviews
    • override  subviews的大小的位置
    • 转化自己的坐标系和window的坐标系
  • 绘图和动画
    • 在矩形区绘图
    • 某些view变化时的直通车
  • 事件处理
    • 接收touch事件
    • 参与responder chain

新建和配置view

用IB或手动创建view,然后加到view hierachies中用。
最简单的做法是在IB中用图型化的方法来处理。
在IB中,你可添加view,分配到hierachies中,配置它们,把view的行为跟代码关联起来。
一般来说,在IB中看到的跟运行时看到的一样。
做完后保存为nib file,这个文件保存对象的状态和配置。
用nib file来保存某个view controller对应的所有view
nib file中最顶级的view用来描述viewcontroller.view
顶级的view应该跟设备屏幕一样大。很少有用nib file来保存部分view的。
nib file跟view controller一起用的时候,需要用nib file的信息来实始化view controller.
系统会在合适的时候载入或去掉你的view。
如果你的nib file并没有跟一个view controller关联,也可以在代码中载入它,通过 NSBundle or UINib 对象。
手动
默认初始化view的方法是initWithFrame: 设定它在父view中的大小和位置。
示列:
CGRect  viewRect = CGRectMake(0, 0, 100, 100);
UIView* myView = [[UIView alloc] initWithFrame:viewRect];

 

然后把它加入父view中,见“Adding and Removing Subviews.”

view的属性
属性控制显示和行为
可以用 view的tag属性做标记,方便在代码中实时地访问view
tag值默认为0
使用UIView的 viewWithTag:方法来检索。
它使用深度优先的算法检索当前view和它的子view(view层级是树状的)

新建和配置view层级
管理view层级是关键动作
包括显示和行为
上图为典型的结构。
还是一样,可以用IB或手动来做层级管理。
添加和删除subview
IB是最方使的方法,所见即所得。拖动扣作。
手动
  • 添加subview  addSubview:
  • 插入subview insertSubView开头三方法  可指定位置
  • 重排subview
  • 移除subview

把subview插入到view时,大小超出view的部分不自动截断。

如果要截断,手动设clipsToBounds

(一堆属性的用法)

转化坐标
很多时候(特别是touch事件处理),程序需要在不同的view frame rect之类的东西之类转换坐标。例如:touch事件向系统报告时使用window坐标系,view处理事件的时候往往要转换成view的本地坐标系统。
UIView中定义了以下方法做转化:
在运行时调整view的大小和位置
一个view的大小变化时,它的subview应该跟着变。
UIView同时支持自动变和手动变。
自动变的情况,需要设定规则。
手动变时,设定具体的大小和位置。
当发生以下事件时,Layout会改变
view的bounds rectangle变化了。
手持设备方向变了
The set of Core Animation sublayers associated with the view’s layer changes and requires layout.
程序调用了view的 setNeedsLayout or layoutIfNeeded
程序调用了view’s underlying layer object的setNeedsLayout
自动处理
autoresizesSubviews subview是否重排
autoresizingMask 控制subview如何重排,这个属性可以组合使用
参考 Table 3-2
手动
当一个view的大小改变时,view的layoutSubview被调用
于是你可以实现layoutSubview方法以实现手工修改布局
通过这一方法可以做到:
直接修改subviews的大小和布局。
增加或移除subviews或Core Animation layers.
使subvewi重绘。
常见的重排subviews的程序是那种有一个非常大的滚动区的程序
当一个程序有非常大的滚动区(N屏)的时候,直接载入一个这么大的view是不合适的,程序一般载入部分可见的view,当滚动动作发生时,即时重排。
写手动重排代码的时候要注意 :
1  设备方向改变
2 有电话呼入的时候,状态栏高度会变化。
两个参考
手动   see the ScrollViewSuite sample.
运行时改动view
程序需要用户输入时,要调整界面响应这个输入(典型的如把当前输入框贴到软键盘上面)
典型的行为如下:
与core animation layers交互
自定义view
自定义一个view的checklist
  • 初始化
  • dealloc 清理
  • drawRect:  绘
  • autoresizingMask  自动重排行为
  • 如果包含subview
    • 初始化时创建 subview
    • 设置subview的  autoresizingMask
    • 如果subview需要自定义layout 重写 layoutSubviews
  • 处理touch-based event
  • 如果要求view的打印版和屏幕上显示的不同,重写 drawRect:forViewPrintFormatter:

Dec
21

[ios note] windows

Author laihj    Category 善其事     Tags , ,

每个ios程序都至少需要一个window, UIWindow类的一个实例,有一些则可以需要更多。

Window有如下职责:
包含可视的内容
把用户操作分发给View和其它对象 这一过程中扮演重要角色
帮助view controller处理位置变化

在iO中,window没有标题状态栏一类的东西,就是个空白的框
同样,程序要改变内容时,也不改变window,改变的是window包含的view中最前面的那几枚。

大部分的程序只用一个window,这个window占据全屏,从main nib file载入(或者纯手工代码实现)。

一般来说,其它的window都是由系统创建的,由特定的event触发,比如有电话接入。

windows相关任务


大部分程序一辈子只动一次window,就是在程序开始时创建一下。
如果需要,也可以用window实现来做一些事情:
重新转换坐标点和rectangle
用notifications来跟踪window相关的变化

建立和配置windows


可以用IB,也可以手动
运行时创建,delegate obejct retain一个window
如果程序用了多于一个winows, 一般做法是用时才加载(另一个)
无论程序是前台还是后台,主window都在launch time(?)创建。
建立和配置的代价并不高。
但如果程序启动直接进后台,最好不要在它进入前台前做window.

用IB
一般不用自己动手,xcode自带一个MainWindow.xib
在application delegate object里面定义outlet,在程序中使用这个outlet操作window
注意
建议使window全屏,如果不这样做,可能有一些touch事件无法收到
这是因为,只有window范围内的touch事件能被识别。view按说是在window中,但iOS并不限制view显示在winows外。即:若不全屏,有可以出现以下情况:看到一个按钮,点击无反应,因为它不在window的rectangle的范围内。
用IB时也要:
使用outlet关联到delegate或file owner,这样代码中才能访问。
如果要用自已的xib替代MainWindow,需要在Info.plist中修改属性。

更多资源 see Interface Builder User Guide.

手动
在delegate的application:didFinishLaunchingWithOptions:中加入如下代码
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
这里假设delegate有一个用来retain window的属性(self.window)
建window确认全屏,不需要为statues bar之类的东西预留空间,这事儿在放view的时候做,view controller会自动处理。
往window里面添加view
每个window都有一个相应的root view obejct (由相应的view controller管理)
使用单一的root view可以简化工作。
[window addSubview:viewController.view];
用nib file来做这事更简单,只要设一个属性。
可以用任何view来做 root view。
配置一个root view时,你需要同时设定它在window中的大小和位置。
改变window Level
每个window都有可配置的 windowLevel 属性,决定其与其它window的关系,上还是下。
监视window改变
使用相关notifications

 

Jun
21

[Android] anTimeLog,记录你的时间

Author laihj    Category 善其事     Tags ,

antimelog

anTimeLog是一枚基于Google Android系统的时间日志软件。就像图标所显示的那样,anTimeLog的目标很简单:把从事一项活动的开始和结束时间记下来。让使用者可以正确地了解自己每天二十四小时时间的消耗情况,从而为个人的时间管理提供参考。

我写了简单的使用指南,欢迎有Android的朋友试用.