Translate

2013年11月13日 星期三

No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7s, VALID_ARCHS=armv7 armv6).

1.把Build Active Architecture Only 下面的Debug 设为NO release 设置为YES
2.Valid Architectures 设置为 armv7 armv6 就OK 了。

2013年10月13日 星期日

xcode5 Status bar 問題

最近又遇到升級版本的問題了
在ios6->ios7的狀態列
客戶說在ios6的launch頁面時
預設圖被裁切掉了
但是在ios7上不會有這問題
所以上網找了一下資訊
在xcode5首先先設定

然後在專案的info.plist
在設定
-> "Status bar is initially hidden" = YES
-> "View controller-based status bar appearance" = NO


最後在程式碼

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[UIApplication sharedApplication] setStatusBarHidden:NO]; }

iOS Provisioning Profiles已經新增Devices但是做出來的Ad-Hoc ipa新裝置不能安裝

最近有個客戶遇到這個問題
所以我馬上請教我的好朋友大神連結
原來是Provisioning Profiles不要用編輯的去改設定
要用新增的方式來增加Provisioning Profiles
這樣就不會出現明明已經在Provisioning Profiles加上去新的裝置了
做出來的ipa新裝置卻不能安裝的問題囉

2013年10月7日 星期一

UITabBar appearance setSelectionIndicatorImage does not work on first launch iOS7

UITabBar appearance setSelectionIndicatorImage does not work on first launch iOS7

轉載iphone5跟iphone4的兩種xib快速生成

主要針對有使用xib的開發者
- (id)init { NSString *clssName = NSStringFromClass([self class]); NSString *xibName = is4InchScreen() ?[NSString stringWithFormat:@"%@_4inch", clssName] : clssName; self = [super initWithNibName:xibName bundle:nil]; if (self) {} return self; } http://hufeng825.github.io/2013/08/29/ios6/

iOS6轉iOS7的layout問題

最近被iOS6轉iOS7的layout搞死了
為什麼xcode5沒把這部分給改好
搞得開發者都頭暈了
最後我是看了這個文章的介紹去針對ios7的layout做改變
做起來的確有效^_^
推薦一下給大家囉
使用 Interface Builder 設計 iOS7 Layout 並與 iOS6/iOS5 相容

2013年9月24日 星期二

objective-c TTC to TTF and All iOS6 fonts website

在寫專案的時候美術常常拿很奇怪的字體要我們在App裡面使用
就我自己目前只會使用ttf欓
後來同事上網找到這個好工具
可以把ttc轉ttf
下載鏈結

另外還有個網站很不錯
可以馬上看到內建字型的樣式
website

2013年8月7日 星期三

QuartzCore粒子效果

其實這個demo我很早很早就在網路搜尋到了
一直沒有空也沒有機會用到
當然單方面也覺得應該很難用不好套
但是人ㄚ
在遇到必須會的時候就會去摸索

簡單來說這個demo好用到爆
只是在條參數的時候
可能要多花點心思
至於圖片的素才可以用內建的也可以請美術畫出來

編輯器link

參考link1

參考link2

2013年7月11日 星期四

讓UIView或UIScrollView的動畫暫停跟繼續動畫

-(void)pauseLayer:(CALayer*)layer { CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; layer.speed = 0.0; layer.timeOffset = pausedTime; } -(void)resumeLayer:(CALayer*)layer{ CFTimeInterval pausedTime = [layer timeOffset]; layer.speed = 1.0; layer.timeOffset = 0.0; layer.beginTime = 0.0; CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; layer.beginTime = timeSincePause; }

2013年7月8日 星期一

iOS6 UUID

最近剛好碰到推播註冊
卻讓我自己混入了一團迷思裡面
因為我一直把推播註冊的token跟UUID搞混了
真是個笨蛋ㄚ

參考link

[UIDevice currentDevice].identifierForVendor.UUIDString;
or
NSString *uuid_str = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; uuid_str = [uuid_str stringByReplacingOccurrencesOfString:@"-" withString:@""];

2013年7月1日 星期一

iPad willAnimateRotationToInterfaceOrientation

這幾天再寫個ipad專案
發現有時候willAnimateRotationToInterfaceOrientation沒有被呼叫到
所以上網查了一下資料
參考link
This is expected behavior as I see it. If the UIVC is not on the top of the stack, then willAnimateRotationToInterfaceOrientation shouldn't be called as no rotation is being animated at that time. The way I've been handling this in the app I am working on now is similar to the above poster. Any UIVC that supports all orientations gets a new method

- (void) updateLayoutForNewOrientation: (UIInterfaceOrientation) orientation;

This method is called from two places:

-(void) viewWillAppear: (BOOL) animated { [super viewWillAppear: animated]; [self updateLayoutForNewOrientation: self.interfaceOrientation]; }
-(void) willAnimateRotationToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation duration: (NSTimeInterval) duration { [self updateLayoutForNewOrientation: interfaceOrientation]; }
The new method is simple:

- (void) updateLayoutForNewOrientation: (UIInterfaceOrientation) orientation { if (UIInterfaceOrientationIsLandscape(orientation)) { // Do some stuff } else { // Do some other stuff } }

2013年6月13日 星期四

Xcode 4.6.2常莫名crash

国外有人有解决办法了:
since yesterday's OSX update, every other run on the simulator is crashing on start. It appears to work fine when compiling and running on hardware.

I thought it could be useful for your to warn other developers to hold off from performing the update if they want to work on the simulator."

I've experienced the same issue, but found that switching from LLDB to GDB (on the advice of Tony Arnold from Apple's Dev Forums) seems to fix the problem for the moment.

Update your scheme by selecting Product > Scheme > Edit Scheme, and choose the GDB debugger for your debug scheme.

简单的说,就是把Scheme里的LLDB换成GDB,就解决这个问题了!

2013年6月10日 星期一

如何用NSLog输出NSRange,CGRect等结构体

參考link

使用对应的转换
NSStringFromCGPoint
NSStringFromCGSize
NSStringFromCGRect
NSStringFromCGAffineTransform
NSStringFromUIEdgeInsets
比如

NSLog(@"rect1: %@", NSStringFromCGRect(rect1));

2013年6月4日 星期二

Xcode files ARC setting

To see which files override the ARC setting:

Select your project in the navigator. This will open the project editor.
In the project editor, select your target.
In the project editor, click Build Phases (not Build Settings).
Expand the Compile Sources build phase.
Here, you can see the compiler flags for each file. Files with that set whether or not to use ARC will include either -fno-objc-arc or -fobjc-arc, for specifying MRR or ARC respectively.

How to know Xcode project is using ARC?

Select your target, then Build Settings. Look for Objective-C Automatic Reference Counting in the Apple LLVM Compiler - Language section.

2013年5月14日 星期二

2013年5月8日 星期三

UIButton custom font vertical alignment

我在專案裡面用了客制化的字體
發現我的UIButton的字不在正中間


上網查到許多方法
參考link
參考link
參考link

最後我使用了最簡單的方法
yourButton.contentEdgeInsets = UIEdgeInsetsMake(5, 0, 0, 0);

2013年5月7日 星期二

ios-tips-custom-fonts

參考link

首先先把.ttf檔放進專案裡

確定有勾選Add to targets


Verify the font is in the project. There are two places you can do this.

By selecting the font, and verifying “Target Membership” in the Utilities area.



And By selecting your apps target, selecting the “Build Phases” tab, and verifying that your font is in the “Copy Bundle Resources” section.



And finally, add the font to your Info.plist. Note that most apps change the name of their plist to something like -Info.plist. Add a key of “Fonts provided by application”, and make sure it’s an array, then add your font file name as an item in the array. Make sure you use the exact file name, and that your file name has an all-lowercase extension (.TTF apparently doesn’t work on iPhones, but .ttf does).



Knowing your font
This is where I had some issues. When you add your font you use the file name, but when you use your font you use the font name… The EXACT font name. If you ctrl + click on the .ttf file and select “Get Info”, you can find the “Full Name”. That seems to work with a lot of fonts, but the font I’m using doesn’t work that way. I had to open the .ttf file in the Font Book application, and look at the window header.



Using this name, you can log what font names you have available by using the fontNamesForFamilyName method like so:

NSLog(@"tt0001m_: %@", [UIFont fontNamesForFamilyName:@"Swis721 Lt BT"] ); Which gives the output: 2012-08-24 11:25:10.968 GenericKeychain[7260:c07] tt0001m_: ( "Swiss721BT-Light" )
Using your font programmatically
Say you have a UILabel:

UILabel *myLabel = [[UILabel alloc] init];
[myLabel setText:@"Label Text"];

We set the font of our label by creating a UIFont, and setting it to our label with setFont.
UIFont *swissLight = [UIFont fontWithName:@"Swiss721BT-Light" size:myLabel.font.pointSize]; [myLabel setFont:swissLight];

2013年5月3日 星期五

GCD全称为Grand Central Dispatch dispatch_async

參考link

參考lin2


dispatch_async(dispatch_get_gloabal_queue(0, 0), ^{ //加入耗时操作 //...... dispatch_async(dispatch_get_main_queue(), ^{ //更新UI操作 //..... }); });

ios-ALAssetsLibrary获取系统相簿里边的所有照片

參考link

-(void)getImgs{ dispatch_async(dispatch_get_main_queue(), ^{ NSAutoreleasePool *pool = [[NSAutoreleasePoolalloc] init]; ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror){ NSLog(@"相册访问失败 =%@", [myerrorlocalizedDescription]); if ([myerror.localizedDescription rangeOfString:@"Global denied access"].location!=NSNotFound) { NSLog(@"无法访问相册.请在'设置->定位服务'设置为打开状态."); }else{ NSLog(@"相册访问失败."); } }; ALAssetsGroupEnumerationResultsBlock groupEnumerAtion = ^(ALAsset *result,NSUInteger index, BOOL *stop){ if (result!=NULL) { if ([[result valueForProperty:ALAssetPropertyType]isEqualToString:ALAssetTypePhoto]) { NSString *urlstr=[NSString stringWithFormat:@"%@",result.defaultRepresentation.url];//图片的url /*result.defaultRepresentation.fullScreenImage//图片的大图 result.thumbnail //图片的缩略图小图 // NSRange range1=[urlstr rangeOfString:@"id="]; // NSString *resultName=[urlstr substringFromIndex:range1.location+3]; // resultName=[resultName stringByReplacingOccurrencesOfString:@"&ext=" withString:@"."];//格式demo:123456.png */ [self._dataArray addObject:urlstr]; } } }; ALAssetsLibraryGroupsEnumerationResultsBlock libraryGroupsEnumeration = ^(ALAssetsGroup* group,BOOL* stop){ if (group == nil) { } if (group!=nil) { NSString *g=[NSString stringWithFormat:@"%@",group];//获取相簿的组 NSLog(@"gg:%@",g);//gg:ALAssetsGroup - Name:Camera Roll, Type:Saved Photos, Assets count:71 NSString *g1=[g substringFromIndex:16 ] ; NSArray *arr=[NSArray arrayWithArray:[g1componentsSeparatedByString:@","]]; NSString *g2=[[arr objectAtIndex:0]substringFromIndex:5]; if ([g2 isEqualToString:@"Camera Roll"]) { g2=@"相机胶卷"; } NSString *groupName=g2;//组的name [groupenumerateAssetsUsingBlock:groupEnumerAtion]; } }; ALAssetsLibrary* library = [[ALAssetsLibraryalloc] init]; [libraryenumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:libraryGroupsEnumeration failureBlock:failureblock]; [library release]; [pool release]; }); } //------------------------根据图片的url反取图片----- ALAssetsLibrary *assetLibrary=[[ALAssetsLibraryalloc] init]; NSURL *url=[NSURLURLWithString:urlStr]; [assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) { UIImage *image=[UIImage imageWithCGImage:asset.thumbnail]; cellImageView.image=image; }failureBlock:^(NSError *error) { NSLog(@"error=%@",error); } ];

2013年4月29日 星期一

Master Detail Application for iPad UISplitViewController, MultipleDetailViews with Navigation Controller

重要的link 最近在研究
Master Detail Application for iPad
發現ㄚ
有人也想跟我一樣替換掉Detail的ViewController
發現stackoverflow有人回答了
參考link

The split view controller has a property, viewControllers.
The object at index 1 is the detail controller.
You should just create a mutable copy of viewControllers,
replace the object at index 1 with your new controller,
and set that array to be the split view's arrayControllers.

NextController *next = [[NextController alloc] init..... // or however you get your new controller NSMutableArray *mut = [self.splitViewController.viewControllers mutableCopy]; [mut replaceObjectAtIndex:1 withObject:next]; self.splitViewController.viewControllers = mut; 另外參考link

2013年4月22日 星期一

SLComposeViewController Foursquare

參考網站

UIActivityViewController googleplus

參考link

Shareing Example
NSString *shareString = @"CapTech is a great place to work."; UIImage *shareImage = [UIImage imageNamed:@"Icon.png"]; NSURL *shareUrl = [NSURL URLWithString:@"http://www.captechconsulting.com"]; NSArray *activityItems = [NSArray arrayWithObjects:shareString, shareImage, shareUrl, nil]; UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil]; activityViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; [self presentViewController:activityViewController animated:YES completion:nil]; [activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed) { NSLog(@"Activity is %@", activityType); NSLog(@"Completed Status = %d", completed); if (completed) { } else { } }];

SLComposeViewController

參考1
參考2
參考中文網站

首先先加入Social.framework跟Accounts.framework

有三種可以使用

SLServiceTypeTwitter;
SLServiceTypeFacebook;
SLServiceTypeSinaWeibo;

分享facebook

SLComposeViewController *fbController=[SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook]; if([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) { SLComposeViewControllerCompletionHandler __block completionHandler=^(SLComposeViewControllerResult result){ [fbController dismissViewControllerAnimated:YES completion:nil]; switch(result){ case SLComposeViewControllerResultCancelled: default: { NSLog(@"Cancelled....."); } break; case SLComposeViewControllerResultDone: { NSLog(@"Posted...."); } break; }}; [fbController addImage:[UIImage imageNamed:@"1.jpg"]]; [fbController setInitialText:@"Check out this article."]; [fbController addURL:[NSURL URLWithString:@"http://soulwithmobiletechnology.blogspot.com/"]]; [fbController setCompletionHandler:completionHandler]; [self presentViewController:fbController animated:YES completion:nil]; }

2013年4月16日 星期二

Custom Fonts

參考網站

在專案裡面需要用到ttf的字型
所以記錄一下

加入the .ttf檔案到專案裡



確定Add to targets是勾起來的



點選.ttf檔確定右手邊的Target Memvership是打勾的



在回專案的TARGETS->Build Phases->Copy Bundle Resources



最後在專案的info.plist增加Fonts provided by application並加上.ttf的檔案名稱



然後取得.ttf的全名



使用方法
NSLog(@"vagrounded-bold.ttf is %@", [UIFont fontNamesForFamilyName:@"VAGRounded-Bold"] ); NSLog(@"vagrounded-thin.ttf is %@", [UIFont fontNamesForFamilyName:@"VAGROUNDED-Thin"] ); UILabel *lab = [UILabel new]; [lab setFrame:CGRectMake(50, 50, 100, 30)]; UIFont *swissLight = [UIFont fontWithName:@"VAGRounded-Bold" size:20.0f]; [lab setFont:swissLight]; [lab setText:@"GodCam"]; [self.view addSubview:lab]; UILabel *lab2 = [UILabel new]; [lab2 setFrame:CGRectMake(50, 100, 100, 30)]; UIFont *swissLight2 = [UIFont fontWithName:@"VAGROUNDED-Thin" size:20.0f]; [lab2 setFont:swissLight2]; [lab2 setText:@"GodCam"]; [self.view addSubview:lab2]; 2013-04-17 13:48:20.635 UseTTF[787:c07] vagrounded-bold.ttf is ( "VAGRounded-Bold" ) 2013-04-17 13:48:20.636 UseTTF[787:c07] vagrounded-thin.ttf is ( "VAGROUNDED-Thin" )

2013年4月14日 星期日

objective-c type

今天在查objective-c的資料形態
發現一個網站介紹的很仔細
參考網站
主要是為了要查long long怎麼format
我個人只有用過每個format的第一種方法
另外id的format我是都用%@

2013年4月2日 星期二

iphone5 launch image

現在的專案都要支援iphone5
所以忽然不知道怎麼加入iphone5 launch image
上網查了一下很簡單
只要把圖取名為Default-568h@2x.png
這樣就可以了

2013年4月1日 星期一

UIImageView zoom

專案裡需要一個小功能
針對圖片放大縮小

花了點時間找了些資料
實作的時候卻發現在zoom的時候圖片怪怪的
原來魔鬼藏在細節裡
大致上最重要的一句話就是

//如果不加这句的话
[imageView setFrame:CGRectMake(0, 0, scrollView.frame.size.width, scrollView.frame.size.height)];
//那么正常拖动是可以的,但是如果zoom了 就会有问题

全整的程式碼
scrollViewController.h
記得加上UIScrollViewDelegate
這樣才有拖拉放大縮小的效果
#import @interface scrollViewController : UIViewController { IBOutlet UIScrollView *scrollView; UIImageView *imageView; } @end
scrollViewController.m

- (void)viewDidLoad { [super viewDidLoad]; [scrollView setMinimumZoomScale:1.0]; [scrollView setMaximumZoomScale:5.0]; scrollView.delegate = self; scrollView.bounces = NO; [scrollView setShowsHorizontalScrollIndicator:NO]; [scrollView setShowsVerticalScrollIndicator:NO]; [scrollView setBackgroundColor:[UIColor blackColor]]; imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.jpg"]]; [imageView setContentMode:UIViewContentModeScaleAspectFit]; //如果不加这句的话 [imageView setFrame:CGRectMake(0, 0, scrollView.frame.size.width, scrollView.frame.size.height)]; //那么正常拖动是可以的,但是如果zoom了 就会有问题 //zoom发生后会把frame变成当前显示大小[imageview默认大小 屏幕显示大小 如是全屏则就是全屏大小] zoom变化导致frame同步改变了image的size 大小为frame大小 //image 的size改变后导致self.scrollView.contentSize 变成了frame的大小 从而contentSize变小了 无法实现正常拖动。 //然后根据zoom缩放比例变化。而不是根据实际图片大小。这么导致zoom后就无法拖动了[因为frame大小] scrollView.contentSize = imageView.frame.size; [scrollView addSubview:imageView]; [scrollView setZoomScale:scrollView.minimumZoomScale]; } #pragma mark - UIScrollViewDelegate - (UIView *)viewForZoomingInScrollView:(UIScrollView *)_scrollView { return imageView; }

2013年3月30日 星期六

舊專案不能選模擬器出現My Mac 64-bit

最近在整理電腦裡的專案發現有些舊專案不能跑
也不能選擇模擬器
只有My Mac 64-bit 可以執行
但是按了Run一樣沒反應
這時候只要點專案的PROJECT->Build Settings->Base SDK這邊修改為Xcode有的SDK
這時候再去Run大致上都可以執行了

2013年3月29日 星期五

NSDateFormatter格式化的資料

參考1

參考2

與時間相關
參數 代表意義

a AM/PM (上午/下午)
K 0~11 有0時的12小時制
h 1~12 12小時制
H 0~23 有0時的24小时制
k 1~24 24小時制
m 0~59 分鐘
s 0~59 秒數
s 秒數的個位數
A 0~86399999 一天當中的第幾微秒

v~vvv 一般的GMT時區縮寫
vvvv 一般的GMT時區名稱
z~zzz 具體的GMT時區縮寫
zzzz 具體的GMT時區名稱

與日期相關
參數 代表意義

d 1~31 日期
D 1~366 一年的第幾天
e 1~7 一週的第幾天
c/cc 1~7 一週的第幾天,星期日為第一天

ccc 星期幾縮寫
E~EEE 星期幾縮寫
cccc 星期幾全名
EEEE 星期幾全名

F 1~5 每月第幾周,一周的第一天為周一
w 1~5 每月第幾周,一周的第一天為周日
w 1~53 一年的第幾周,從去年的最後一個周日算起,一周的第一天為周日

L/LL 1~12 第幾個月
M/MM 1~12 第幾個月
LLL 月份縮寫
MMM 月份縮寫
LLLL 月份全名
MMMM 月份全名

q/qq 1~4 第幾季
Q/QQ 1~4 第幾季
qqq 季度縮寫
QQQ 季度縮寫
qqqq 季度全名
QQQQ 季度全名

u 完整年份
y/yyyy 完整年份
Y/YYYY 完整年份,從星期天開始的第一周算起
yy/yyy 兩位數的年份
YY/YYY 兩位數的年份,從星期天開始的第一周算起

特殊用途
參數 代表意義

g Julian Day Number,從4713 BC一月一日算起
G~GGG BC/AD 西元前後縮寫
GGGG 西元前後全名

這裡只有列出幾個常用常用參數,還有一些小技巧並沒有詳述,例如今天是 15 號,輸入參數 d 或是 dd 皆可以得到數值 15,可是輸入 ddd 卻會得到數值 015,而輸入 dddd 又會得到 0015,其他的參數也可以此類推,有興趣的讀者們可以自行實驗。

2013年3月28日 星期四

取得照片拍照时间跟地理位置信息

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
if(picker.sourceType == UIImagePickerControllerSourceTypePhotoLibrary){
//UIImage *image= [info objectForKey:UIImagePickerControllerOriginalImage];

NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL]; 
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:assetURL
resultBlock:^(ALAsset *asset) {
NSDictionary* imageMetadata = [[NSMutableDictionary alloc] initWithDictionary:asset.defaultRepresentation.metadata]; 
NSDictionary *GPSDict=[imageMetadata objectForKey:(NSString*)kCGImagePropertyGPSDictionary];
NSLog(@"%@",GPSDict);
NSLog(@"%@",imageMetadata);
/* GPSDict 里面即是照片的GPS信息,具体可以输出看看*/
}
failureBlock:^(NSError *error) {
}];
} 
}

怎么自定义 视频播放的声音 和 进度条

參考1 
參考2 
參考3 
參考4 

//注册一个通知来观察状态
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackStateDidChange:)
name:MPMoviePlayerPlaybackStateDidChangeNotification
object:[playerViewController moviePlayer]];


- (void)playbackStateDidChange:(NSNotification *)aNote
{
MPMoviePlayerController *moviePlayer = [aNote object];


switch (moviePlayer.playbackState) {
case MPMoviePlaybackStateStopped:
break;
case MPMoviePlaybackStatePlaying:

break;
case MPMoviePlaybackStatePaused:

break;
case MPMoviePlaybackStateInterrupted:

break;
case MPMoviePlaybackStateSeekingForward:

break;
case MPMoviePlaybackStateSeekingBackward:

break;
default:
break;
}



CGFloat playtime = [moviePlayer currentPlaybackTime];//当前时间

}

MKPolyline

stackoverflow
捕获MKMapview的touch事件

2013年3月26日 星期二

Custom UITableViewCell setSelectedBackgroundView

在專案又用到客制化的select時的特效改變
上網查了一下原來不難
最簡單的方法為
cell.selectionStyle = UITableViewCellSelectionStyleGray;

但是這跟我要的顏色不同
所以呢又發現到有這樣的寫法
UIView *bgColorView = [[UIView alloc] init]; [bgColorView setBackgroundColor:[UIColor redColor]]; [cell setSelectedBackgroundView:bgColorView];
如果你的Custom UITableViewCell 使用在groupe樣板
Don't forget to import QuartzCore.
UIView *bgColorView = [[UIView alloc] init]; [bgColorView setBackgroundColor:[UIColor redColor]]; bgColorView.layer.cornerRadius = 10; [cell setSelectedBackgroundView:bgColorView]; [bgColorView release];
另外一種是我沒試過的
在Custom UITableViewCell的.m檔裡作修改
- (void)setSelected:(BOOL)selected animated:(BOOL)animated { UIImage *selectionBackground = [UIImage imageNamed:@"yellow_bar.png"]; UIImageView *iview=[[UIImageView alloc] initWithImage:selectionBackground]; self.selectedBackgroundView=iview; }

2013年3月18日 星期一

AVAudioPlayer AVAudioPlayer Volume too low

本來寫好的AVAudioPlayer跟AVAudioPlayer
卻被抓到bug真是悲傷啊
原來是PM發現錄音的時候播放聲音很正常
可是呢在音效列表播放跟拍照時播放時候
聲音卻非常的小聲
上網查了資料
參考鏈結
Oh! Not!
改得這麼複雜有沒有簡單一點的!
後來我自己回去本來的專案看發現
我有在播放的時候寫了幾行代碼可以讓聲音的音量很正常
所以我就把那幾行代碼全都複製到音效列表跟拍照頁面那
果不其然音量正常了真是太好了
果然是魔鬼就藏在細節當中
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); player.volume = 1.0; [player play];

Singleton sharedInstance

這次在公司的專案有用到Singleton
當然不是我自己想用的拉
是上網找的範例模組有用到只好強迫自己知道這到底有什麼作用
上網找了許多資料有許多人的講法都不一定相同
但是有找到一個我個人覺得算是講得很詳細的

這是為什麼要這樣用
這個 Design Pattern 是用來確保程式中某些物件實體只能有一個、或是數個,不應該被重複性的建立

介紹參考
iOS 单例模式
怎樣用呢
最近在iOS开发中,需要用到单例模式,于是自己动手写了一个,它看起来是这样的:
1.
+ (id)sharedInstance { static id sharedInstance = nil; if (!sharedInstance) { sharedInstance = [[NSObject alloc] init]; } return sharedInstance; }
后来发现许多书上的做法都使用到了BOOL变量作为标值位,它看起来是这样的:
2.
+ (id)sharedInstance { static id sharedInstance = nil; static BOOL token = NO; if (!token) { token = YES; sharedInstance = [[NSObject alloc] init]; } return sharedInstance; } 但是参考了苹果官方的单例模式代码,发现它看起来是这样的:
3.
+ (id)sharedInstance { static id sharedInstance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[NSObject alloc] init]; }); return sharedInstance; } 那么它们究竟有多大区别呢?
原来,它们的区别在于多线程并发时的表现。

使用了一个指针变量作为标志位,这在多线程并发时是不可取的,因为sharedInstance = [[NSObject alloc] init];这行代码的执行本身是需要时间的。很可能有两个线程同时进入到了这行代码,而这将导致内存泄漏。

使用的标志位是一个BOOL变量,当多线程并发时,会出现1线程判断为NO,开始alloc并做赋值操作,但是2线程进入时判断为YES,而1线程赋值操作还没执行结束,这时候2线程会拿到一个nil。尽管它不会造成内存泄漏,但是它会有相当多的线程获取不到对象。

使用了dispatch_once函数。这个函数来自于Grand Central Dispatch (GCD),Apple自Mac OS 10.6 / iOS 4.0引用了它。
该函数接收一个dispatch_once_t用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块。这不仅意味着代码仅会被运行一次,而且还是线程安全的,你不需要使用诸如@synchronized之类的来防止使用多个线程或者队列时不同步的问题。

Apple的GCD Documentation证实了这一点:
如果被多个线程调用,该函数会同步等等直至代码块完成。

所以我又上google查看看其他說法
目前我覺得這是最多人覺得這答案最好

+(id)sharedInstance { static dispatch_once_t pred; static MyClass *sharedInstance = nil; dispatch_once(&pred, ^{ sharedInstance = [[MyClass alloc] init]; }); return sharedInstance; }
釋放掉
- (void)dealloc { // implement -dealloc & remove abort() when refactoring for // non-singleton use. abort(); }
參考
+ (MyClass *)sharedInstance { static MyClass *sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[MyClass alloc] init]; // Do any other initialisation stuff here }); return sharedInstance; }
不建議這樣寫
+ (MyClass *)sharedInstance { static MyClass *sharedInstance = nil; @synchronized(self) { if (sharedInstance == nil) { sharedInstance = [[self alloc] init]; } } return sharedInstance; }

2013年3月14日 星期四

Incompatible pointer type initializing 'CustomCellView *' with an expression of type UITableViewCell

雖然我不是個完美主義者
但是看到錯誤訊息還是想要把問題解決
Incompatible pointer type initializing 'CustomCellView *' with an expression of type UItableViewCell
上網查了一下
很多都是回應關於
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

static NSString *CellIdentifier = @"CustomCell";
CustomCellView *cell =(CustomCellView*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

但是我的問題是卡在
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

本來寫法為
NewsCell *cell = [tableView cellForRowAtIndexPath:indexPath];

改為
NewsCell *cell = (NewsCell*)[tableView cellForRowAtIndexPath:indexPath];
就好了

iOS本地通知和远程通知

參考CocoaChina的文章
iOS本地通知和远程通知

值得好好看的文件解釋的很棒

APNS的推送通知

剛好在找UIAlertView的時候看到這篇文章
樓主發問說如何發佈像這樣APNS裡面還有可愛的圖示
在我之前做過的專案裡面也有用到push notification
所以我也很好奇是如何辦到的
像左圖

原來是用了Emoji圖示字串
Emoji Alerts

stretchableImageWithLeftCapWidth:topCapHeight:

為了要客制化UIAlertView上網查了很多別人已經寫好的程式碼
老是看到這個方法
stretchableImageWithLeftCapWidth:topCapHeight:
很好奇這到底是用來幹嘛的
原來這方法上網看了別人的解釋是這樣的
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight

这个函数是UIImage的一个实例函数,它的功能是创建一个内容可拉伸,而边角不拉伸的图片,需要两个参数,第一个是不拉伸区域和左边框的宽度,第二个参数是不拉伸区域和上边框的宽度。

第一次用这个函数的时候一直搞不懂为什么只要两个参数就行,至少应该指定左上角和右下角,总共四个参数啊。后来读读文档才明白,只需要两个参数就行了。

参数的意义是,如果参数指定10,5。那么,图片左边10个像素,上边5个像素。不会被拉伸,x坐标为11和一个像素会被横向复制,y坐标为6的一个像素会被纵向复制。注意:只是对一个像素进行复制到一定宽度。

其实就是对一个图像做处理,只将中间需要放大的部分进行缩放,而四个角不做拉伸,四个边只做单方向上的拉伸。这种技术通常用于创建可变宽度按钮,包邮相同圆角,但其中心区域的放大和缩小的需要

用该函数设置UIButton的image时, 只对backgroundImage启作用

参数
leftCapWidth
要使用的值上限为左侧的宽度。指定0如果你不希望的形象是横向拉伸。
topCapHeight
要使用的值为顶盖的宽度。指定0如果你不希望的形象是垂直拉伸。

但是在iOS5.0以後就不能用這方法了囧
可以在iOS6.1也沒有報錯.我想應該還是可以繼續使用吧!

參考鏈結裡有更詳細的解釋我覺得很棒
stretchableImageWithLeftCapWidth:topCapHeight:函数用法

2013年3月13日 星期三

NSFileManager creat Folder

最近需要自己創個資料夾
放在app裡的document的資料夾裡面
上網查了資料
發現要使用NSFileManager來創資料夾
通常使用NSFileManager有兩種
NSFileManager* fileMag = [[NSFileManager alloc] init];
或直接使用
[NSFileManager defaultManager]

以下是直接使用[NSFileManager defaultManager]

NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsPath = [paths objectAtIndex:0]; NSString *fileFolder = [documentsPath stringByAppendingPathComponent:@"myRecord"]; // 如果資料夾不存在 if (![[NSFileManager defaultManager] fileExistsAtPath:fileFolder]){ NSError* error; if([[NSFileManager defaultManager] createDirectoryAtPath:fileFolder withIntermediateDirectories:YES attributes:nil error:&error]) { NSLog(@"success"); } else { NSLog(@"[%@] ERROR: attempting to write create MyFolder directory", [self class]); NSAssert( FALSE, @"Failed to create directory maybe out of disk space?"); } } else { // 資料夾存在 } 

主要使用到creat資料夾是用
NSError* error; [[NSFileManager defaultManager] createDirectoryAtPath:fileFolder withIntermediateDirectories:YES attributes:nil error:&error] 

NSMutableDictionary setValue forKey crash

在某次我需要利用相同NSMutableDictionary來做key值的改變
並替換掉原本的NSMutableDictionary卻發現會crash
本來的寫法是
//list_data是陣列裡面包的是NSMutableDictionary
NSMutableDictionary *tag_dic = [list_data objectAtIndex:row];

[tag_dic setValue:[NSString stringWithFormat:@"%d",index_sound + 1] forKey:@"sound_order"];

就這樣crash掉了 囧 too bad!
後來上網找 發現只要這樣寫就可以了
NSMutableDictionary *tag_dic = [[list_data objectAtIndex:row] mutableCopy];

 [tag_dic setValue:[NSString stringWithFormat:@"%d",index_sound + 1] forKey:@"sound_order"]; 真是太神奇了傑克!

2013年3月11日 星期一

NSUserDefaults

引用
http://gibuloto.com/blog/nsuserdefaults/

重點是
在設定完之後記得要
[[NSUserDefaults standardUserDefaults] synchronize];

NSUserDefaults 可以用來儲存使用者的偏好設定(它會被存成一個 .plist 檔案),你可以把它想成是 iOS app 的 localStorage,而且 NSUserDefaults 不只可以儲存字串,還可以儲存任何 Objective-C data type。

使用方法


// 你得先宣告一個 NSUserDefaults 物件,在同一個 app 裡,它是 singleton(單例) NSUserDefaults *userPrefs = [NSUserDefaults standardUserDefaults]; // set [userPrefs setObject:@"a123456789" forKey:@"userID"]; [userPrefs setInteger:24 forKey:@"age"]; [userPrefs setBool:YES forKey:@"isLogin"]; // remove [userPrefs removeObjectForKey:@"debts"]; [userPrefs synchronize]; // get NSString *userID = [userPrefs stringForKey:@"userID"]; BOOL isLogin = [userPrefs boolForKey:@"isLogin"]; 

要注意的是,set 或 remove 之後,記得執行 [userPrefs synchronize],已確保資料被寫入硬碟裡。再保險一點,你還可以:

  - (void)applicationWillEnterForeground:(UIApplication *)application { /* Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. */ [[NSUserDefaults standardUserDefaults] synchronize]; }

2013年3月7日 星期四

FMDB ld: 1 duplicate symbol for architecture armv7s

今天第一次使用FMDB之前都是用舊公司的DB讀取資料
一開始先加入
libsqlite3.0.dylib的資料庫
再加入FMDB的src
FMDatabase.h
FMDatabase.m
FMDatabaseAdditions.h
FMDatabaseAdditions.m
fmdb.m
FMResultSet.h
FMResultSet.m
沒想到在compile的時候報錯
訊息為
duplicate symbol _main in:
    /Users/apple/Library/Developer/Xcode/DerivedData/DogCam-cvhwautedscftlgteittuievolks/Build/Intermediates/DogCam.build/Debug-iphoneos/DogCam.build/Objects-normal/armv7s/main.o
    /Users/apple/Library/Developer/Xcode/DerivedData/DogCam-cvhwautedscftlgteittuievolks/Build/Intermediates/DogCam.build/Debug-iphoneos/DogCam.build/Objects-normal/armv7s/fmdb.o
ld: 1 duplicate symbol for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation)

後來發現只要移除fmdb.m檔就好了
然後引用標題檔
#import "FMDatabase.h"

AVAudioPlayer play mp3 and replay

use
AVAudioPlayer need add AVFoundation.framework!

and
 #import <AVFoundation/AVFoundation.h>
AVAudioPlayer Notification issue: delegate- audioPlayerDidFinishPlaying:successfully

AVAudioPlayer *player;

播放mp3



NSString *fileName = @"test"; NSURL *url = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource:fileName ofType:@"mp3"] isDirectory:NO]; NSError* error = nil; player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; player.delegate = self; if (!url || error) { } player.volume = 1; player.numberOfLoops = -1;// -1 = repeat forever [player prepareToPlay]; [player play]; pause if([player isPlaying]) { [player pause]; player = nil; } #pragma mark - #pragma mark AVAudioPlayer delegate - (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *)aPlayer successfully: (BOOL)flag { if (flag == YES) { NSLog(@"audioPlayerDidFinishPlaying"); } }

DMCircularScrollView Crash

在新公司用需要用到一各比較特別的UI
上網查了查發現這個很適合專案要的感覺
沒想到用了四五個小時卻一直當掉
找不出原因
只好把整個網址上網google沒想到


真的是太蝦了拉  
原來要ARC的專案
可是我的專案沒有支援ARC
上網找了一下發現在
[iOS筆記]部份檔案使用/不使用ARC
借我引用一下重點
在專案的TARGETS->Bulid Phases->Compile Sources
選擇不要的.m在Compile Flags設定-fobjc-arc
搞定可以運行了


引用一下
1. 你的專案使用 ARC, 但希望部份檔案不使用,則使用 -fno-objc-arc。
2. 如果你的專案不使用 ARC, 但部份檔案使用,則用 -fobjc-arc。













os x10.8 找不到Library資料夾

原來發現是被系統所隱藏了起來
在終端機上
chflags nohidden ~/Library/

如果想要在隱藏起來就輸入
chflags hidden ~/Library/