2015年5月22日 星期五

UIPageControl 使用心得

這個元件用起來真方便, 一般的情況下, 就是設個總筆數, 目前筆數, 給他就做完了. 進階一點點需要修改, 作用中 indicatore 顏色, 非作用中的顏色, 還有設定其大小.

在 Mac App 的 xcode 裡, 預設沒有這個元件, 但有很多人做了類似的元件, 可以直接拿來用.



修改顏色, 最佳解法參考看看:
Create a UIColor from a hex string
http://ios-imaxlive.blogspot.tw/2015/04/create-uicolor-from-hex-string.html



2015年5月11日 星期一

Ineligible Devices section appeared in Xcode 6.3

之前用的好好的 Device (iPad), 在 xcode 升級到 v6.3.1後, 居然顯示為不能用(ineligible device), 如下圖:



Step 1: 重開 Mac, 還有 iPad, 結果一樣.
Step 2: 升級 iPad 裡的 iOS 版本到最新版, 結果一樣.
Step 3: Go to the Product Menu > Destination and select your device. It will be listed under "Ineligible", but you will still be able to select it. After doing this, I was able to build and deploy to my device.



這個部驟, 應該可以解決大多的情況, 但我還是不行.

結果, 拿掉 device (iPad), 單純按 Command+B, 來 build build 看, 發現是因為在實作了 FileProvider, 所以有額外的2個 code signing 還要去設定, 一次要設定3組 target (主程式一組, FileProvder 有2組), 都設定為讓 xcode automatic 去 select 就OK了.



相關文章:

Ineligible Devices section appeared in Xcode 6.x.x
http://stackoverflow.com/questions/24039010/ineligible-devices-section-appeared-in-xcode-6-x-x/29538173#29538173

Xcode 6.3 showing Ineligible Device
http://stackoverflow.com/questions/29667752/xcode-6-3-showing-ineligible-device

2015年5月3日 星期日

How to get app's product name at runtime

由於經常需要修改App名稱, 而且在程式裡多處都需要顯示 App Product name, 在程式裡動態取得Product name 方法如下, 比較懶的人, 可以使用一行的這個版本:


[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"];

分解開來的版本:
    NSBundle *bundle = [NSBundle mainBundle];
    NSDictionary *info = [bundle infoDictionary];
    NSString *prodName = [info objectForKey:@"CFBundleDisplayName"];



2015年4月20日 星期一

Create a UIColor from a hex string

UI 設計師給的 design guideline 都給 hex string 色碼,



如果是要寫 code 去控制, 比較好的解法, 我想是用這個別人寫好的 class 來用.
https://github.com/mRs-/HexColors

Example iOS

// with hash
UIColor *colorWithHex = [UIColor colorWithHexString:@"#ff8942" alpha:1];

// without hash
UIColor *secondColorWithHex = [UIColor colorWithHexString:@"ff8942" alpha:1];

// short handling
UIColor *shortColorWithHex = [UIColor colorWithHexString:@"fff" alpha:1];



相關文章:





2015年3月23日 星期一

How to deselect a selected row when selecting the new row in a tableview

想設計一個類似 Radio 多選一的 table row 效果, 當選擇某一筆時, 其他被選擇的會取消選取.

範例:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  for (int i = 0; i < [tableView numberOfRowsInSection:0]; i++) {
      [tableView deselectRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
  } 
   UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
   cell.backgroundColor =[UIColor colorWithPatternImage:[UIImage imageNamed:@"white_cell_check.png"]];   

}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
      UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

     cell.backgroundColor =[UIColor colorWithPatternImage:[UIImage imageNamed:@"white_cell.png"]]; 

}

這個寫法, 似乎可行, 但還有問題, 當資料筆數多時, 要記得處理 cell 重覆使用時, 初始化預設值的部份.

在 TableView的屬性裡設定 "Selection" 值為 "Multiple Section".

當某一例不希望被 deselect 時, 要加入回 selected status, 請使用 selectRowAtIndexPath:
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [[self tableView] reloadData];

    int isPage = [_delegate returnPageNumber];

    NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:(isPage) inSection:0];
    NSLog(@"viewDidAppear scrollIndexPath is %@",scrollIndexPath);

    [[self tableView] selectRowAtIndexPath:scrollIndexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
}

2015年3月18日 星期三

學習 UICollectionView

我在承接了前人的code,  在要加入新功能時發現有趣的東西, 一開始以為是使用 TableView , 看了 code 發現是 collection view, 使用起來和 tableview & table cell 差不多, 但功能比較少.


相關文章:


2015年3月16日 星期一

[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] may only be called from the main thread

遇到這個 Error, 在使用 Notification 傳遞事件時. 解法就是把 keyboard 或 alert 相關 UI 的 code, 要放回去 main thread 裡執行.

Swift example:
The main issue is that your error message is reporting that "... may only be called from the main thread". So you presumably have invoked this code from within a background thread (perhaps a completion block for network request or something like that). So you have to dispatch this code back to the main queue:
dispatch_async(dispatch_get_main_queue()) {
    let vc = self.storyboard.instantiateViewControllerWithIdentifier(viewID) as UIViewController
    showViewController(vc, sender: self)
}

obj-c example:
dispatch_async(dispatch_get_main_queue(), ^{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:...
    [alertView show];
});


Facebook 留言