不同iOS SDK对事件调用支持不同

问题描述:

今天做AD杂志(iPad)LEGO功能点,需要在UIScrollView中让UIView移动。加了正确代码,结果却不好。

结果是这样的:点击不移动,运行touchesBegan和touchesEnded,一切正常。但是点下移动释放,touchesBegan会100%运行,然后三两个touchesMoved,move效果也跟不上,touchesEnded也没有触发。

在UIView用了如下代码实现:

#pragma mark --

#pragma mark touch

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

NSLog(@"touchesBegan");

UITouch *touch = [touches anyObject];

UIScrollView *parentView = (UIScrollView *)[[[touch view] superview]superview];

parentView.scrollEnabled=NO;

// Calculate and store offset, and pop view into front if needed

CGPoint pt = [[touches anyObject] locationInView:self];

startLocation = pt;

}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

NSLog(@"touchesMoved");

// Calculate offset

CGPoint pt = [[touches anyObject] locationInView:self];

float dx = pt.x - startLocation.x;

float dy = pt.y - startLocation.y;

CGPoint newcenter = CGPointMake(self.center.x + dx, self.center.y + dy);

// Bound movement into parent bounds

float halfx = CGRectGetMidX(self.bounds);

newcenter.x = MAX(halfx, newcenter.x);

newcenter.x = MIN(self.superview.bounds.size.width - halfx, newcenter.x);

float halfy = CGRectGetMidY(self.bounds);

newcenter.y = MAX(halfy, newcenter.y);

newcenter.y = MIN(self.superview.bounds.size.height - halfy, newcenter.y);

// Set new location

self.center = newcenter;

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

NSLog(@"touchesEnded");

UITouch *touch = [touches anyObject];

UIScrollView *parentView = (UIScrollView *)[[[touch view] superview]superview];

parentView.scrollEnabled=YES;

}

问题分析:

最后一段一段检查,应该是parentView.scrollEnabled=NO;这句有问题。

可能是iOS的一个Bug。

问题解决:

在另一台Mac上做了一个Demo,一切OK。细细检查,唯一不同就是SDK版本不一样。出问题的那台是4.1,而做Demo一切OK的那台是4.2.1。把出问题的代码copy给4.2.1,一切安逸了。

不同iOS SDK对缺少文件后缀名图片的调用支持不同

问题描述
今天做AD杂志(iPad)特色点功能,一段相同代码转移到另一台机器,执行结果却不一样。

问题分析
代码、项目检查后完全一样,执行效果却不同,也没有报错。
因为结果是Button图片没有显示,所以一步一步检查,搜索到UIImage在转移后没有图片信息,相关代码如下:

#define PHOTO_NAME @"point"

[UIImage imageNamed:PHOTO_NAME];

以上代码实现了读入项目中point.png图片文件。

问题解决
图片后缀没有给全,改为:

#define PHOTO_NAME @"point.png"

图片出现了,问题解决了。

事后分析,估计是不同SDK对代码的支持不同。所以养成编程好习惯能省许多事情和时间。

PS:
转移前SDK:4.2.1
转移后SDK:4.1

Xcode设置代码提示的左花括号换行单独成行

Xcode代码提示生成源代码程序块默认格式如下,注意左花括号的位置:

if ( condition ) {
do ...
}

因为以前的使用习惯,我想让自动生成的左右花括号都单独成行,变成下面的样子:

if ( condition )
{
do ...
}

在Terminal里面,运行下面命令,然后重启Xcode:

defaults write com.apple.Xcode XCCodeSenseFormattingOptions -dict BlockSeparator "\n"

这个命令修改了~/Library/Preferences/com.apple.Xcode.plist,这是Xcode的配置文件

《爱情公寓》第一季

一幢并不奢华的公寓,两间普普通通的套房,却住着7个不同背景,不同身份,不同梦想的青年男女。无一例外,他们都是有故事的人,就在这栋爱情公寓里,每天都发生这看似平常却又乐趣十足的故事。时而搞笑、时而离奇、时而浪漫、时而感动。他们在一起,用嬉笑怒骂传达新一代年轻人的生活状态和价值观念。他们在一起,用连珠妙语擦出令人捧腹不已的精彩笑料和智慧火花。

《武林外传》

这是一个系列的戏说江湖的轻松喜剧。关中一个普通的小镇——七俠镇,这里有一家同福客栈。就是这间不起眼的江湖客栈,因缘巧合之下汇聚了一群性格各异又活泼搞怪的年轻人:武功高强但初入江湖的郭芙蓉(姚晨 饰)、客栈老板娘佟湘玉(闫妮 饰)、金盘洗手的神偷白展堂(沙溢 饰)、满腹经纶的吕秀才(喻恩泰 饰)、客栈厨师李大嘴(姜超 饰)等等。这群年轻人在同一屋檐下演绎了一幕幕经典的搞笑场面,在欢笑与眼泪中陪伴观众们一起渐渐成长。

NSDictionary读plist文件顺序问题

问题描述
这些天在做AD,NSDictionar读取出来的顺序不是plist文件中的顺序。

问题分析
试了各种库和方法,无效,网上搜了一些不算解决办法的方法 。

问题解决
(1) Keep an array of keys along with the dictionary. Then loop through the array and use the keys to get the values. (You'll have to add your own checks to keep the same key from appearing in the array twice.)
1,简单说来就是,把nsdictionary的所有key组成的nsarray按自己的要求排序,然后根据这个key组成的array来获取对应的value的array。key的array不要扔掉,每次要按顺序获取值的时候都需要它。

(2)You could keep an array of custom objects, one custom object for each pair (give the object .key and .value properites) . That's a very object-oriented way, but you lose the ability to easily find the value for a key (you have to loop through the array.)
2,不直接用nsdictionary,而是用一个nsarray,里面每个object都是一个只有一对key-value的nsdictionary。这个方法的缺点是,找某个value或者key会变得很麻烦,需要遍历。

(3)You could keep two arrays of strings, one for keys and one for values.
to find a value for a key, you just use
keyIndex = [myKeys indexOfObject: keyIWant];
keyValue = [myValues objectAtIndex: keyIndex];
3,不用nsdictionary,而是用两个对应的nsarray。相互调用,分别做key和value。