1. 程式人生 > >IOS開發小技巧

IOS開發小技巧

如何檢測應用更新?

你可以使用友盟等第三方工具,但如果你只想使用輕量級的方法,只需GET這個介面:http://itunes.apple.com/lookup?id=你的應用程式的ID,解析返回的json字串就行。

我想完全複製一個 UIView 怎麼辦,copy 方法好像用不了

iOS 中並不是所有物件都支援copy,只有遵守NSCopying協議的類才可以傳送copy訊息,當用你試圖使用類似於UIView *v = [_v1 copy]方式複製一個UIView時,會丟擲一個名為Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView copyWithZone:]: unrecognized selector sent to instance 0x7ff163d12060'

的異常。這時候我們可以採取使用物件序列化方式複製物件:

1
2
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_v1];
UIView *v = [NSKeyedUnarchiver unarchiveObjectWithData:data];

如何檢測音訊藍芽是否連線

有個小技巧,檢測一下當前音訊外設是否為 BluetoothA2DPOutput 即可。

1
2
3
4
AVAudioSessionPortDescription *pd = [[AVAudioSession sharedInstance].currentRoute
.outputs firstObject];
if ([pd.portType isEqualToString:@"BluetoothA2DPOutput"]) { // TODO: }

返回高度固定的 tableviewcell (高效能版)

一般我們用來指定 tableviewcell 的高度時使用 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 方法返回一個固定的高度。但這個方法會被 n 多次呼叫,其實你只要這麼指定下高度就可以 self.tableView.rowHeight = 100

我只是想修改導航欄返回按鈕的文字,其他啥都不想幹

你可以嘗試在 viewWillDisappear 方法裡這麼幹:

專案中靜態庫有真機和模擬器兩個版本,可不可以合併為一個

在 Xcode 中建立一個靜態庫檔案,編譯後會生成兩個版本,一個是模擬器版本,一個是真機版本。所以導致後續引入靜態庫非常不方便,因此很有必要把這兩個庫打包成一個。合併以後的靜態庫檔案大小是未合併的兩個靜態庫之和。方法如下:

bash
1
lipo -create "path/to/模擬器專用lib.a" "path/to/真機專用lib.a" -output "path/to/通用lib.a"

我需要一個完全透明的導航欄

So easy.

1
2
3
/// *** 這兩段程式碼可以把導航欄變透明
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
UINavigationBar.appearance().shadowImage = UIImage()    /// 這個是去除導航欄底部的黑色線條

直接使用 16 進位制顏色

使用 16 進位制顏色相對麻煩一點,在 objc 中你可以定義這樣的巨集。在 swift 中建議將它改寫成 UIColor 的擴充套件方法

1
#define UIColorHEX(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

tableviewcell 預設的高亮太醜,如何自定義

1
2
3
4
5
cell?.selectedBackgroundView = {
    let view = UIView(frame: cell!.contentView.bounds)
    view.backgroundColor = UIColor(white: 0.2, alpha: 0.2)
    return view
}()

我想讓 tableviewcell 的 separator 往左靠近邊框,但又不想重寫它怎麼辦

從 iOS 7 開始 tableviewcell 的 separator 遍右移了 27 個畫素左右,下面的 3 行程式碼可以完美解決這個問題。

1
2
3
cell?.separatorInset = UIEdgeInsetsZero
cell?.layoutMargins = UIEdgeInsetsZero
cell?.preservesSuperviewLayoutMargins = false

如何清空其他應用程式在遠端控制介面留下的媒體資訊

1
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

push/pop 導航欄時有黑影

應該來說這是 iOS 7 中遺留的一個 bug,直到 8.3 釋出也沒解決。自己的程式中要修復這個問題也很簡單,設定一下試圖控制器的背景色就可以。

移除導航欄返回按鈕的title

1
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -100) forBarMetrics:UIBarMetricsDefault];

移除subviews

移除 subviews 的常用方法就是遍歷 view 中得所有檢視依次刪除:

1
2
3
for (UIView *items in view.subviews) {
    [items removeFromSuperview];
}

其實還有一個方法也能快速刪除 subviews 而且比 for 迴圈好看的多:

objc
1
[view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

不過這個方法只存在於 objc 中。

Build 版本號自動加1

iOS專案開發中有時需要將 build 次數記錄下來,在專案的TARGETS->Genneral中修改相應的 Build 選項即可,但是如果在Build Phases中的Run Script中新建這樣一個指令碼就可以在每次 build 時自動把 build 次數加1:

1
2
3
4
#!/bin/bash
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"