March
18th,
2014
CorePlot 是一個相當好用來畫各種條狀圖,折線圖與圓餅圖的library. 要在手機上畫出美美的條狀圖,圓餅圖與長方圖?真的只能靠這套Library了.
以下整理一些在使用上可能會遇到的問題
遇到的問題:
“Undefined symbols for architecture x86_64”
http://stackoverflow.com/questions/18408531/xcode-build-failure-undefined-symbols-for-architecture-x86-64
主要就是你拿到的library太舊了,可以去官方網站去找最新的來用
Cannot find XXX.h
主要要記得改include path,這倒是跟使用其他library不常看到的設定選項.
使用了好用的CorePlot也必須要了解使用最基本的方式來畫圖
以下是一些基本跟UIView 有關的部分,順便複習一下
關於UIView
UIView Constructor 有兩種
(id)initWithCoder:(NSCoder *)aDecoder
(id)initWithFrame:(CGRect)frame
initWithCoder 是給 StoryBoard 上面的UIView 使用,另外一個通常是自定frame大小的時候會用到.
參數定義使用property與synthesize
要畫Label 與畫出有顏色的自定UIView 可以用以下方式
// 畫出UILable
CGRect frame = CGRectMake(20, 45, 140, 21);
UILabel *label = [[UILabel alloc] initWithFrame:frame];
[self.view addSubview:label];
[label setText:@"Number of sides:"];
// 自定UIView但是是個塗滿的黑筐
UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 200, self.view.bounds.size.width, 30)];
lineView.backgroundColor = [UIColorblackColor];
[self.view addSubview:lineView];
參考:
http://greenchiou.blogspot.tw/2011/04/ios-sdk-quartz-2d-0.html
http://www.raywenderlich.com/1768/uiview-tutorial-for-ios-how-to-make-a-custom-uiview-in-ios-5-a-5-star-rating-view
設定動畫 Animation
主要是利用 UIView 的transform 裡面主要有三種 (可以達到放大,縮小,旋轉與Translation)
CGAffineTransformMakeScale
CGAffineTransformMakeRotation
CGAffineTransformMakeTranslation
詳細內容如下:
-(IBAction)startScaleTransform:(id)sender
{
self.view.transform = CGAffineTransformMakeScale(2,2);
[UIViewbeginAnimations:nilcontext:NULL];
[UIViewsetAnimationDuration:1];
self.view.transform = CGAffineTransformMakeScale(1,1);
self.view.alpha = 1.0;
[UIViewcommitAnimations];
}
參考文章:
CorePlot Github: https://github.com/core-plot/core-plot
CorePlot官方設定: https://code.google.com/p/core-plot/wiki/UsingCorePlotInApplications
設定安裝中文: http://www.cnblogs.com/lovecode/archive/2012/02/11/2346389.html
設定安裝英文: http://tech.pro/tutorial/939/using-core-plot-in-an-iphone-application
CorePlot安裝與使用導覽(英文):
Pie Chart http://www.raywenderlich.com/13269/how-to-draw-graphs-with-core-plot-part-1
Bar Chart http://www.raywenderlich.com/13271/how-to-draw-graphs-with-core-plot-part-2
繼續閱讀
March
13th,
2014
聽從一些前輩的建議,決定還是把已經寫到一半卻累到半死的iOS App來上架 這裡記錄一下上架之前會遇到的一些問題: 首先要先連到 iTune Connect 去新增一個App(當然你需要開發者帳號,也就是付每年$99的費用) 詳細流程參考: http://www.minwt.com/ios/4726.html 關於新增資料上面有一些翻譯可以參考: http://www.csdtn.net/article/2011-01-07/289703 資料都新增完了,就會使用Application Loader 去上傳你寫好的App,不過這裡我發生幾次錯誤,分享給大家. _NSSetlogCstringFunction error on Application loader 一開始我以為是NSLog的原因,不過主要的原因是因為跑到debug版本 記得到 [Product] —> [Edit Schema] —> Change run to release. 正確的包裝app方法為: device —> iOS device [Product] —> [Archive] Provisioning missing iOS Apps must contain a provisioning profile in a file named embedded.mobileprovision. Provisioning bundle identifier not match 這三個問題出現的原因其實都一樣,一般而言讓App上架的方式有兩種: 透過Application Loading,然後自己把App包裝起來以後上傳到iTune Connect 透過Xcode Organizer 來做validate 與 上傳… 這也是我推薦的方式,因為比較容易看清楚所有的問題所在. 接下來我會把我上傳的流程寫清楚(原諒都是文字,放圖實在有點懶) 參考: http://stackoverflow.com/questions/5313537/bundle-identifier-and-provisioning-profile http://lamb-mei.com/10/ios-ios-provisioning-portal-certificates/ http://kenobiluh.blogspot.tw/2012/02/certificate-provisioning-file-code.html 使用 XCode Organizer 來遞交App到Store 詳細方式如下: 先到 Xcode 裏面Project Property —> [General] —> 把 Bundle Identifier 抄下來.記得把[team] 也先選擇到你的開發者帳號 ex: com.XXX.youAppName 到 iTune Connect 新增App申請,詳細流程可以參考這裡.注意 Bundle ID要跟XCode裡面的相同(就算寫錯了~可以之後修改) 到Apple iOS Developer 網站的相關處理: [Certificates, Identifiers & Profiles] —>[Identifiers]—> 新增一個 iOS App ID 記得這裡Bundle Identifier 要跟你Xcode設定裡面一樣 ex: com.XXX.youAppName [Certificates, Identifiers & Profiles] —> [Provisioning Profiles] —> 新增一個[Distribution]的 Provisioning 這裡的App ID要使用剛剛申請的,這裡最好是一對一的mapping 比較不會有問題. 下載 Provisioning 並且點兩下安裝 到Xcode 準備打包上傳 先到Project Property —>[Build Setting] 搜尋 [PROVISIONING PROFILE] —> 將它改成你剛剛下載的Provisioning 把device 從模擬器或是手機切換到 [iOS Device] [Product] —> [Archive] 如還是有出現問題請參照以上得問題解答 這時候就可以做App Validation 跟 Distribute ...
繼續閱讀
March
11th,
2014
昨天把NSDate的一些處理稍微研究了一下,有一些處理方式可以整理一下: 1. 比較時間 (NSDate comparison) <code style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;font-family:Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;white-space:inherit;"><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#00008b;" class="kwd">if</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">([</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pln">date1 compare</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">:</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pln">date2</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">]</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">==</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#2b91af;" class="typ">NSOrderedDescending</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">)<br></br></span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">{<br></br></span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#2b91af;" class="typ"> NSLog</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">(@</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#800000;" class="str">"date1 is later than date2"</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">);<br></br></span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">}<br></br></span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#00008b;" class="kwd">else</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#00008b;" class="kwd">if</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">([</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pln">date1 compare</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">:</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pln">date2</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">]</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">==</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#2b91af;" class="typ">NSOrderedAscending</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">)<br></br></span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">{<br></br></span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#2b91af;" class="typ"> NSLog</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">(@</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#800000;" class="str">"date1 is earlier than date2"</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">);<br></br></span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">}<br></br></span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#00008b;" class="kwd">else</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">{<br></br></span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#2b91af;" class="typ"> NSLog</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">(@</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#800000;" class="str">"dates are the same"</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">);<br></br></span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">}</span></code> 可以拿來比較時間的先後,在NSDate大概算是最方便的. 參考: http://stackoverflow.com/questions/5965044/how-to-compare-two-nsdates-which-is-more-recent ** ** 2. 時區的轉換 使用NSDate拿來的時間都是GMT要顯示的時候得轉成當地時區(台灣是TST) -(NSString) transferGMT2TST: (NSDate)inGMT :(NSString*) newTZ { NSDateFormatter *dateFormatter = [[NSDateFormatteralloc] init]; dateFormatter.dateFormat = @”yyyy-MM-dd’T’HH:mm”; NSTimeZone *nTZ = [NSTimeZonetimeZoneWithAbbreviation:newTZ]; ...
繼續閱讀
March
7th,
2014
整理一下最近的關於iOS一些SDK學習心得
FGallery (https://github.com/gdavis/FGallery-iPhone)
自從換掉Three20與 Nimbus 之後,相簿處理的部分就換到這個SDK.其實不錯用只是對於新版本iOS相容性差了點.
優點:
其實整合相當的方便,而且完整相簿得捲動支援(Album scroll view)
缺點:
iOS7 之後,完全一整個不穩定,Git上面也一堆使用者反應.不過作者看起來不maintain 了.
替代方案:
iOS7之後可能還是換成iOS 預設提供的 UICollectionView功能相當的強大,不僅僅可以作為捲動處理,以後要做為更多的功能我想也不是問題.
WWDC 介紹影片: https://developer.apple.com/devcenter/download.action?path=/videos/wwdc_2012__hd/session_219__advanced_collection_views_and_building_custom_layouts.mov
參考介紹文章: http://www.raywenderlich.com/22324/beginning-uicollectionview-in-ios-6-part-12
Nimbus (https://github.com/jverkoey/nimbus)
這個就不詳細介紹了,提供大部分所有app會使用到的相關功能.原開發就是知名的Facebok UI SDK Three20.
最近忽然開始積極更新版本,很久沒繼續使用了.看來會找時間用用看從頭來兜出一個App
MagicalRecord (https://github.com/magicalpanda/MagicalRecord)
這個SDK主要是幫助你處理關於資料的相關處理.CoreData功能很強大,但是一開始的設置跟相關的處理卻相當的麻煩.
而這個不僅僅可以幫助你快速使用CoreData 而不用去管令人討厭的NSManagedObjectContext, NSManagedObjectModel, NSPersistentStoreCoordinator還可以操控不只是CoreData, Plist都可以使用.
如何加入:
把所有檔案加入專案
把這段加到 .pch
#import “CoreData+MagicalRecord.h”
* 建立CoreData資料庫
* AppDelegate 加入 [MagicalRecordsetupCoreDataStackWithStoreNamed:@"CoreData.sqlite”];
* 搞定
* 詳細流程參考[這篇文章](http://www.cnblogs.com/mybkn/p/3328183.html)
Inappsettingskit (http://www.inappsettingskit.com/)
設定App的設定通常都是使用Settings Bundle (參考: 這裡).如果要在app裡面更改設定就得自己都出整個頁面與設定控制,這個SDK可以快速的幫助你建制起來.
流程也簡單到不行:
把InAppSettingsKit資料夾加入你的專案
IASKAppSettingsViewController *IASKAppSettingView;
if(IASKAppSettingView == nil)
{
IASKAppSettingView = [[IASKAppSettingsViewControlleralloc] init];
IASKAppSettingView.delegate = self;
}
UINavigationController *aNavController = [[UINavigationControlleralloc] initWithRootViewController:IASKAppSettingView];
//[viewController setShowCreditsFooter:NO]; // Uncomment to not display InAppSettingsKit credits for creators.
// But we encourage you not to uncomment. Thank you!
IASKAppSettingView.showDoneButton = YES;
[self presentViewController:aNavController animated:YEScompletion:nil];
// [self SwitchPage:PAGE_SETTING];
* 中文的介紹文章: [在這裏](http://blog.csdn.net/artwebs/article/details/8295937)
我是參考這篇文章去找出相關的SDK,把這些SDK都玩過一次之後,又想去翻動我的程式了.一直改來改去~感覺很難上架了~~
繼續閱讀
March
4th,
2014
起因:
主要是因為在Windows Store 上面,需要產生兩個相同的內容的產品
但是版號與產品名稱卻不能相同.
做法:
原本做法
複製一個相同的目錄 (原本稱為ㄓ ProjA 複製出來為 ProjB)
修改 csproj 把每個檔案的鏈結改到原本的 檔案
在搬移的過程中,會出現以下的錯誤
Could not find **.xbf in target folder
查詢過後發現,XAML 的檔案無法去link具有上一層目錄的檔案架構 ( ….XXX)
但是卻可以去link “XXX “
解決方法:
僅僅複製把ProjB 的需要的檔案到ProjA的目錄下
AssemblyInfo.cs (注意要改名)
XXX.csproj
XXX_StoreKey.pfx
XXX_TemporaryKey.pfx
Package_StoreAssociation.xml (注意要改名)
Package.appxmanifest(注意要改名)
這樣下來是有點醜,因為 bin/obj 會共用~這個之後會再仔細觀察是否有任何問題
此外需要改兩個東西
在 csproj 裡面
在 Package.appxmanifest與Package_StoreAssociation.xml 內
這樣就可以產生兩個一樣內容的app 在你的桌面
參考:
http://stackoverflow.com/questions/8162179/how-do-i-install-two-versions-of-my-metro-app
繼續閱讀
February
27th,
2014
這一些主要是為了想學習架設 Jenkins,不過還沒整理完~先把這部分的整理出來….
[問題] 利用command line 的 MSBuild.exe 會發生錯誤 “error MSB8020: The builds tools for v120 (Platform Toolset = ‘v120’) cannot be found.”
我也發現~就算你裝了 VS2013只要你有裝 VS2012 tool set你有可能會按倒 VS2012 command line tool,這時候的版本會出現
msbuild.exe /version
4.0.30319…
解法: 首先要確認你執行是VS2013 command line tool或是執行 msbuild.exe 在 c:Program Fies(X86)MSBuild12.0Bin
參考: http://public.kitware.com/Bug/view.php?id=14369
[問題]MSBuild去開始跑 *.sln 會出現 error MSB3779: The processor architecture of project being build “Any CPU” is not supported by referenced SDK ….
這個問題主要是因為在sln 裡面的設定 有加入當初建立project (專案)的時候的設定 Any CPU, Mixed Platform … etc.
所以解法有以下的方式:
解法: [Build]->[Configuration Manager…] 去把沒需要build的platform 關閉,記得 “Build” 跟 “Deploy” 都要關閉.當然你真的都用不到~其實可以刪除…
參考:
http://stackoverflow.com/questions/1074654/how-do-i-force-msbuild-to-compile-for-32-bit-mode
http://stackoverflow.com/questions/3155492/how-to-specify-platform-for-msbuild
繼續閱讀