@implementation TouchLayer
- (id) init
{
if ((self = [super init])) {
touchSpriteA_ =[CCSprite spriteWithFile:@"Icon.png"];
[self addChild:touchSpriteA_];
touchSpriteB_ =[CCSprite spriteWithFile:@"Icon.png"];
[self addChild:touchSpriteB_];
}
return self;
}
- (void) dealloc
{
[super dealloc];
}
- (void) onEnter
{
[super onEnter];
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
}
- (void) onExit
{
[[CCTouchDispatcher sharedDispatcher] removeDelegate:self];
[super onExit];
}
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
return YES;
}
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event;
{
CGPoint begen = [touch locationInView: [touch view]];
NSSet *allTouches = [event allTouches];//获得所有触摸点
int count = [[allTouches allObjects] count];//当前触摸点数量,单点触摸为1.
if (count == 1) {//单点触摸
UITouch *touch1 = [[allTouches allObjects] objectAtIndex:0];//获得第一个触摸点
switch ([touch1 tapCount]) {//判断是单击还是双击
case 1:
if (begen.y<550) {
}
NSLog(@"单击\n");
break;
case 2:
#pragma mark 这里可以执行动画
NSLog(@"双击\n");
break;
}
}else if (count == 2) {//多点触摸
CGPoint touch0_point = [[[allTouches allObjects] objectAtIndex:0] locationInView: [touch view]];
CGPoint touch1_point = [[[allTouches allObjects] objectAtIndex:1] locationInView: [touch view]];
touchSpriteB_.position = touch0_point;
touchSpriteA_.position = touch1_point;
NSLog(@"两点触摸\n%f---%f",touch0_point.x,touch1_point.x);
}
}
这个基本的封装控件类,基于WinCE的,所以他的入口自然是int APIENTRY WinMain,首先是Creat,创建窗口,封装的类包括
1、SubClass 子类化窗口
2、ShowModal 窗口模态化
3、CPaintManagerUI 绘制管理者 这个类中封装了很多UI的函数,比如GetClientSize,获取工作区域的宽和高,MessageHandler写了很多消息响应函数,对鼠标的操作, 等于自己重写了几乎所有的消息响应,另外很对地方用到了CControlUI
4、CControlUI 控件类
等等控件在原来MFC的基础上封装了,使用起来更加方便。
如何使用呢,我们需要建一个WinCE工程,比如建立一个像360一样的页面,我们写好XML文件后,接下来就是如何去解析了,我们需要通过Create函数建立窗口,而在这个函数中我们要将写好的XML文件解析出来
tString tstrSkin = CPaintManagerUI::GetSkinPath() + _T("skin.xml");
CControlUI* pRoot = builder.Create(tstrSkin.c_str(), (UINT)0, &cb, &m_pm);
ASSERT(pRoot && _T("Failed to parse XML"));
这样就可以了,然后通过消息函数响应WM_CREATE、WM_CLOSE、WM_DESTROY、WM_NCPAINT、WM_GETMINMAXINFO(重载最小化函数)、WM_SIZE(窗口变化函数)、WM_SYSCOMMAND、WM_NCACTIVATE、WM_NCCALCSIZE、WM_NCHITTEST,这些函数可以帮助我们解析XML上的控件,实现消息的对应。
而在底层封装的一些消息,我们通过 msg.sType == _T("click")的方式与之匹配,以下是封装的消息
1、“click” 属于CButtonUI类,Activate()函数,实现判断按钮是否活跃,如活跃则发送通知
2、“selectchanged” 属于COptionUI类,Activate()函数,若复选框处于选中状态,激活并发送通知
3、“link” 属于CTextUI,Event()函数,若鼠标弹起,发送link通知
4、“valuechanged” 属于CSliderUI,Event()函数,点击滑块弹起,发送通知
5、“textchanged”属于CEditUI,SetText()函数,设置文本时发送通知
6、“itemselect”属于CComboUI(组合控件),SelectItem()函数中响应WM_KEYDOWM,发送通知
7、“itemselect”又属于ClistUI(列表控件),SelectItem()函数中,发送通知
8、“Headclick”属于CListUI(列表控件),Event()函数中,鼠标按在列表头的位置,发送通知
9、“itemactivate”属于CListElementUI(列表元素),Activate()函数中,双击时发送通知
10、“itemclick”属于CListLabelElementUI,Event()函数,单击某一片区域,发送通知
11、“windowinit”属于CPaintManageUI,WM_PAINT消息中,第一次绘制时发送通知
12、“setfocus”和“Killfocus”,属于CPaintManageUI,获取焦点和失去焦点
最近有一个需求,要求iPhone定制UIAlertView的窗口,没用多长时定制的UIAlertView出炉了
但是有一个问题:
定制的UIAlertView显示时,在iPhone设备上的效果是整个窗口上下抖动两下才停止,好奇怪的问题???
我们把这个定制的UIAlertView单独做了一个效果,结果发现没出现抖动,可见是其它东西影响了它的显示。
在定制的UIAlertView显示之前,会有一个UIActionSheet弹出来供我们选择,而UIActionSheet的动画效果影响了UIAlertView的显示。
分析原因是UIActionSheet消失的动画时间还没执行完成,UIAlertView就弹出来的原因。
解决办法:
定制的UIAlertView延时0.3s显示,问题就这样解决了。