• iOS 5设备下UINavigationbar的背景修改

    最近我突然发现UINavigationbar背景修改的方法不起作用了,代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @implementation UINavigationBar (CustomImage)

    -(void)drawRect:(CGRect)rect
    {
        UIImage *image = [UIImage imageNamed:@"navigationbar.png"];
        [image drawInRect:CGRectMake(0,0,self.frame.size.width,self.frame.size.height)];
    }

    @end

    发现原来是iOS 5的原因,如果运行在iOS 5以下的版本就没有问题了。经过实验以下方法适合iOS 5(放在ViewDidLoad中):

    1
    2
    3
        if ([self.navigationController.navigationBar respondsToSelector:@selector( setBackgroundImage:forBarMetrics:)]){
            [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigationbar.png"] forBarMetrics:UIBarMetricsDefault];
        }

    第一条if语句的作用是防止程序在iOS 5以下的版本中崩溃。

    这样,依靠这两段代码,我的UINavigationbar的背景问题在iOS 5及以下版本中得到了完美的解决。

     
  • 创建iOS 5 News Stand应用程序之一 – 外观

    iOS 5提供了一个新的framework – Newsstand framework,它允许把应用程序运行于News Stand中。实际上,News Stand相当于一个特制的文件夹专门放置报纸,杂志类应用程序。由于时间有限,这里我分几个部分介绍这一技术。


    首先介绍的就是怎样把一个应用程序改变成一个News Stand程序,这实际上有两步工作,一是让程序运行于News Stand,二是改变程序的图标。
    读文章 »

     
  • 强迫UIView以某种方向显示的秘诀

    我有一个项目其中某些UIView必须以特定的方向(Portrait或者Landscape)显示。这个看似简单的问题,困惑了我很久,直到今天我才完全找到解决的方法。
    读文章 »

     
  • 无法正确加载@2x的解决办法

    为使用retina显示,我们一般把图片的高分辨率版本存为@2x的形式,但是iOS 4.1以前的版本,如果使用imageWithContentsOfFile是无法保证@2x文件正确加载的。我使用如下方法解决此问题:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    // UIImage+Extras.h
    @interface UIImage (Extras)

    - (id)initWithContentsOfResolutionIndependentFile:(NSString *)path;
    + (UIImage*)imageWithContentsOfResolutionIndependentFile:(NSString *)path;

    @end

    // UIImage+Extras.m
    - (id)initWithContentsOfResolutionIndependentFile:(NSString *)path {
        if ( [[[UIDevice currentDevice] systemVersion] intValue] >= 4 && [[UIScreen mainScreen] scale] == 2.0 ) {
            NSString *path2x = [[path stringByDeletingLastPathComponent]
                                stringByAppendingPathComponent:[NSString stringWithFormat:@"%@@2x.%@",
                                                                [[path lastPathComponent] stringByDeletingPathExtension],
                                                                [path pathExtension]]];
           
            if ( [[NSFileManager defaultManager] fileExistsAtPath:path2x] ) {
                return [self initWithCGImage:[[UIImage imageWithData:[NSData dataWithContentsOfFile:path2x]] CGImage] scale:2.0 orientation:UIImageOrientationUp];
            }
        }
       
        return [self initWithData:[NSData dataWithContentsOfFile:path]];
    }

    + (UIImage*)imageWithContentsOfResolutionIndependentFile:(NSString *)path {
        return [[[UIImage alloc] initWithContentsOfResolutionIndependentFile:path] autorelease];
    }
     
  • presentModalViewController显示半透明UIView

    很多时候我们需要使用presentModalViewController来显示Modal View。如果需要显示半透明的Modal View应该怎么办呢?当然可以自己创建一个半透明的UIView,然后模拟presentModalViewController的动画效果。

    不过iOS 4以后的版本再也不需要怎么麻烦了,有一个非常简单的方法,示例如下(这段代码运行于一个View Controller中):

    1
    2
    3
    4
    5
    6
        UIViewController* transparentView = [[UIViewController alloc] init];           

           UIViewController* controller = self.view.window.rootViewController;
           transparentView.view.backgroundColor = [UIColor clearColor];
           controller.modalPresentationStyle = UIModalPresentationCurrentContext;        
           [controller presentModalViewController:transparentView animated:YES];

    其要点就是使用iOS特有的rootViewController来显示Modal View。

     
  • 不需重新编译而更改app资源内容的简单方法

    有的时候,我们需要把做好的项目以另外的程序名和内容重新打包,当然我们可以使用建立一个新的target的方法,不同的情况用不同的target表示。我一位朋友luckywr分享了一种更为简单的方法,特别适合于只需少量更改了项目的内容(比如,更改程序的图标)。其思路也非常简单,就是在更改内容后使用命令行对app重新进行数字签名,而不需要再次对整个程序进行编译了。

    下面是他使用的方法:

    codesign -f -vv -s [Identity] [appPath]

    Identity 是授权文件,是在keychain里使用的私钥的名字。

    比如:codesign -f -vv -s “luckywr” /Users/luckywr/Desktop/xxxx.app

    在此感谢luckywr朋友。

     
  • 分享一小段代码

    我们经常会遇到这种情况,某个按钮太小很难按到,又不想把按钮图片做得太大。我把它作成了一个Class Method,放在了我的Utils类中。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    +(void)resizeTouchableAreaForButton:(UIButton* )button withNewSize:(CGSize)size
    {
        // increase margin around button based on width
        const CGFloat margin_h = 0.5f * ( size.width - button.frame.size.width );
        const CGFloat margin_v = 0.5f * ( size.height - button.frame.size.height );
       
        // add margin on all four sides of the button
        CGRect newFrame = button.frame;
        newFrame.origin.x -= margin_h;
        newFrame.origin.y -= margin_v;
        newFrame.size.width  += 2.0f * margin_h;
        newFrame.size.height += 2.0f * margin_v;
       
        button.frame = newFrame;
    }

    这段代码把按钮的可按区域扩大到新的尺寸。不过有一个前提是使用UIButton的setImage而不是setBackgroundImage来设置按钮图片。

     
  • pdf渲染的小窍门

    我们都知道,在iPhone/iPad显示pdf的基本方法有两个,一个是使用UIWebView直接加载pdf文件,另一个是使用Core Graphics进行渲染(姑且称之为CGPDF方法)。UIWebView的方法是简单,只需加载pdf,其他诸如放大翻页等问题通通交给UIWebView去头痛吧。但其缺点是性能较慢,功能有限,比如要实现搜索,添加笔记等功能就比较难。而使用CGPDF方法,功能就没有限制(虽然pdf解析方面,苹果提供的文档实在有限),使用Core Graphics进行渲染,性能上也比UIWebView要提高许多,只不过翻页,放大缩小等功能都需要自己实现。

    读文章 »

     
  • Cocos2d实现简单动画

    最近实在很忙,没有时间写整篇文章,就分享一下一些简单的实例吧。

    首先介绍一篇博客文章:cocos2d HOWTO系列之:如何创建帧动画。我初学cocos2d时就发现这篇文章,不过里面的一些内容已经过时了,所以自己又写了一个动画的例子。

    我把要点说一下:

    1. 制作动画需要的一系列动画图片(比如png文件)。要制作动画png,可根据上面介绍的文章使用Adobe Flash将fla转换为png。也可以使用一些免费软件,将swf转换为png。这里有一些软件:SpriteSheetCreator,SWFSheet,SWFToPNG。大家可以网上搜索一下。
    2. 生成png动画系列后,要将其整合成一个png(也就是所谓的sprite sheet)。这里使用的软件就是Zwoptex。使用此软件生成一个png和一个plist,plist记录了每个sprite的x,y,高,宽数据。Cocos2d支持Zwoptex生成的plist格式。不过遗憾的是最近Zwoptex开始收费了。这里提供以前的一个版本,也可以满足我们的要求。Zwoptex-0.4b10.app下载
    3. 我的程序就是播放一个电扇的动画,按一下就进行动画,再按一下动画就停止。我是修改了HelloWorld程序,添加了一个Object类进行动画处理。唯一要说明的是addSpriteFramesWithFile中要使用的路径是相对路径,我开始一直遇到问题就是因为使用了绝对路径。

    源代码下载

     
  • Xcode 4闲谈

    Xcode 4终于千呼万唤发布了,诚然它有太多亮点,不过目前还是感觉不够稳定,还有很多功能都不会用。举个简单的例子,在Xcode 3下,使用Analyze时有非常多的误报,但Xcode 4似乎又走了另一个极端,几乎没有什么报告。我有一个程序明显有memory leak(因为我安装了状态条可以显示内存的软件),但Analyze的结果是没有potential leak,而且使用Instrument也没有发现任何leak,不知是不是我还不太会用。

    另外,还有一些以前比较熟练的事情在Xcode 4下,都不会做了。比如, 当程序出现EXC_BAD_ACCESS时添加NSZombieEnabled环境变量开始都找不到地方。最后终于找到了,在:

    Product -> Edit Scheme…



    4月1日更新:
    今天发现一个有趣的现象。突然发现以前为Xcode项目添加静态库子项目的方法不再适用,添加的项目文件只是一个文件而已。后来经过研究才发现是因为Xcode打开了另外一个项目的缘故。关掉另一个Xcode后,问题解决。