2016年11月27日 星期日

swift 裝置判別,判別iphone跟ipad 跟手機方向(直向橫向)

當我們有時要開發一個專案兩個種裝置時勢必會需要用到裝置判別,

而最爛最笨的判別方式不外戶就是判別畫面的寬或高,

可是這種笨方法在很多地方容易出現問題。

而官方所提供的原生方法是:

if ( UI_USER_INTERFACE_IDIOM() == UIUsesrInterfaceIdiom.pad ) {
//如果是pad就可會印出來
print("ipad")
}
或是UIUsesrInterfaceIdiom.phone

這樣就能夠判安裝app的裝置是iphone還是ipad了。

並不需要使用型號判別,因為那樣太多型號了。

如果是使用OC的話後面只要將點運算拿掉把P改成大寫即可

至於判斷手機方向只要短短一段即可
 if UIDeviceOrientationIsLandscape(UIDevice.current.orientation){
            print("橫")
        }else{
            print("直")

        }

2016年11月20日 星期日

swift3 AppDelegate 判斷UserDefaults資料後指定頁面

剛好遇到一個算是一次性顯示頁面的功能,又與之前所說的盼斷是否第一次開起有些許差異。

這次是判斷UserDefaults內的某個質如果是空就到起始頁面,如果有資料就跳到另一個頁面。

一開始產生兩種想法:

一是寫在起始頁面的viewdidload判斷,然後在跳轉。缺點是用戶會在瞬間看到起始頁面的畫面,必須用其他方式解決。

二是寫在AppDelegate,判斷有資料就直接跳轉到指定的頁面,好處是不管任何APP第一運行的一定是AppDelegate所以就不會發生第一個想法的問題。

於是最後我選擇了二來做,但發生了沒跳轉的問題。
原本寫法如下:
 if(UserDefaults.standard.string(forKey: "email") != nil){
            let stroyboard = UIStoryboard(name: "Main", bundle: nil);
            let HomeVc = stroyboard.instantiateViewController(withIdentifier: "Home")
            self.window?.rootViewController?.present(HomeVc, animated: true, completion: nil)

        }
並會出現錯誤訊息,大致上是說明層級不同會找不到此頁面之類的

所以上網找了幾個方法後改成這樣:
if(UserDefaults.standard.string(forKey: "email") != nil){
            let stroyboard = UIStoryboard(name: "Main", bundle: nil);
            let HomeVc = stroyboard.instantiateViewController(withIdentifier: "Home")
            let appDelegate = UIApplication.shared.delegate as! AppDelegate;
            appDelegate.window?.rootViewController = HomeVc

        }

經過測試後改寫的方法就是我想要的,希望有遇到相同問題的人有得到幫助喔!

如果你只是要盼斷是否第一次開起的話請參考:

2016年11月14日 星期一

swift3 擷取特定字串 (更:Swift4)

Swift4
原本swfit3的方法雖然笨,但至少有得到所想要的效果。但是在swift4那方法會出現警告,沒意外是即將停用。所以就改寫成以下方法

let Bitrh = "2017-09-21 09:17:07 +0000"
        let year = Bitrh.prefix(4)//取得字串到第幾字元 Bitrh.prefix(Int)
        print("這是年:\(year)")
        
        let Monthstart = Bitrh.index(Bitrh.startIndex, offsetBy: 5)//從第幾字元開始算起
        let Monthend = Bitrh.index(Monthstart, offsetBy: 2)//在Monthstart中從頭取自第幾字元
        let month = Bitrh[Monthstart..<Monthend]//利用rang的方式取出該字元Monthstart是起始至Monthend,因Monthend只要求兩個字元所以month就會印出兩字元
        print("這是月:\(month)")

        let Daystart = Bitrh.index(Bitrh.startIndex, offsetBy: 8)//同月份做法
        let Dayend = Bitrh.index(Daystart, offsetBy: 2)
        let Day = Bitrh[Daystart..<Dayend]

        print("這是日:\(Day)")
打印出來結果就跟swift3是一樣的效果


Swift3
因為某些原因用到了擷取字串,下面所有"111"是用來計算字元用的所以隨便輸入皆可


let date = "2016-11-15"
        
        let dateString = String(describing: date)
        
        print(dateString)
        取出前四個字元使用.substring(to:String.Index)
        let year = dateString.substring(to: "1111".endIndex)
        
        print("年:\(year)")
        從第幾字元開始取用使用.substring(form:String.Index)
        let birthmonth = dateString.substring(from: "11111".endIndex);
        因為只要月份兩字元所以在做一次第一步驟
        let month = birthmonth.substring(to: "11".endIndex)
        
        print("月:\(month)")
        再來第二步驟已經從月開始所以直接在呼叫第二步驟宣告的值在做一次第二步驟
        let birthday = birthmonth.substring(from: "111".endIndex)
        最後再重複一次第一步驟
        let day = birthday.substring(to: "11".endIndex);
        

        print("日:\(day)")

這樣print出來會是這樣,如下圖:

Constraints 直向與橫向(xcode8)

這篇主要以圖片做解析,只坐直向與橫向檢視,不做基本的constraints解說
下圖為直向的constraints


做好後將所有constraints選取起來




 接下來如下圖,在右邊欄最下方有個Installed 的左邊有個+號點下去,如下圖
並按下Add Variation加入一個新的群組



加入後將原本的Installed勾掉





勾掉後轉成橫向左邊所有的Constraints會變半透明,表示它存在,但在此畫面無作用



然後在照做一次直向的動作(注意Constraints是全新的要重做)


然後因為5.5寸跟4.7寸已下在橫向大小在官方設定有些不同所以要做兩次不同的群組
4.7以下我們選的是wChC 但5.5要選的是wRhC
如果沒做wRhC的話在5.5寸是會跑版的


完成後全選所有的 Constraints 會呈現這樣


選任一直向Constraints檢查群組

選任意橫向檢查群組


這樣就完成了直向與橫向不同的Constraints了
希望能夠幫助到大家喔!!!


swift 指定某個子頁能夠作翻轉

因為部分功能需求關系,原本APP預設只限制直向

但在特定指定頁面時怎麼辦呢???
程式碼如下:
在APPDelegate裡面加入

var shouldRotate:Bool = false

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        if shouldRotate{
            return .all
        }else{
            return .portrait
        }
    }
由於上方的func屬於強制轉向,所以我使用了.all而非.landscape

然後在你要翻轉的viewcontroller中加入
let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.shouldRotate = true

這樣就能夠在指定的頁面翻轉了,但注意如果storyborad有做constraints
請記得做好直向跟橫向的constraints。要不然畫面轉了也不會有動作喔!