2017年10月23日 星期一

Swift動畫 -- 矩形按鈕變成圓形按鈕

今天分享如何將矩形的按鈕動畫變成圓形的按鈕,先看原來的畫面,如圖所示按鈕原本是長方形




而我們最後的目標就是將它們變成圓形的按鈕,如下圖所示:




範例中我們用一個Timer來使按鈕3秒過後可以變成圓形的

Timer語法
NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: #selector(ViewController.changeButton), userInfo: nil, repeats: false);

其中的changeButton就是我們要改變Button狀態的方法

程式碼如下
func changeButton(){

        // 設定loginByFB的圖
        var fbButtonImage: UIImage!
        
        fbButtonImage = UIImage(named: "ic__FB_1.png")
        
        self.loginByFB.setImage(fbButtonImage, forState: .Normal)
        
        // 設定loginByGooglePlus的圖
        var googleButtonImage: UIImage!
        
        googleButtonImage = UIImage(named: "ic__G+_1.png")
        
        self.loginByGooglePlus.setImage(googleButtonImage, forState: .Normal)

        // 縮小按鈕的動畫 3.0 = 執行速度 數字越大跑得越慢 ; 這邊是展示縮小放大的動畫
//                UIView.animateWithDuration(3.0 ,
//                                           animations:
//                    {
//                                            // 縮放尺寸
//                                            self.loginByFB.transform = CGAffineTransformMakeScale(0.6, 0.6)
//                                            self.loginByGooglePlus.transform = CGAffineTransformMakeScale(0.6, 0.6)
//                    },
//                                           completion: { finish in
//                                            UIView.animateWithDuration(0.6){
//                                                self.loginByFB.transform = CGAffineTransformIdentity
//                                                self.loginByGooglePlus.transform = CGAffineTransformIdentity
//                                            }
//                })
        

        // 讓按鈕從長方形變成圓形的動畫 -- 用來將FBGoogle+按鈕變成圓形的
        UIView.animateWithDuration(3.0 ,
                                   animations:
            {
             
                // 下面程式如果註解掉的話會直接執行completion的地方
                
                // 重新定義 loginByFB 的位置與frame
//                self.loginByFB.frame = CGRectMake(self.loginByFB.frame.origin.x - 60, self.loginByFB.frame.origin.y - 160, self.loginByFB.frame.size.width, self.loginByFB.frame.size.height)
//                
//                self.loginByFB.layer.cornerRadius = 0.5 * self.loginByFB.bounds.size.width
//                
//                
//                self.loginByFB.layer.borderWidth = 1.0
//                self.loginByFB.clipsToBounds = true
//                
//                
//                // 重新定義 loginByGooglePlus 的位置與frame
//                self.loginByGooglePlus.frame = CGRectMake(self.loginByFB.frame.origin.x - 60, self.loginByGooglePlus.frame.origin.y - 160, self.loginByGooglePlus.frame.size.width, self.loginByFB.frame.size.height)
//                
//                self.loginByGooglePlus.layer.cornerRadius = 0.5 * self.loginByFB.bounds.size.width
//                
//                
//                self.loginByGooglePlus.layer.borderWidth = 1.0
//                self.loginByGooglePlus.clipsToBounds = true
                

            },
                                   completion: { finish in
                                    UIView.animateWithDuration(3.0){
                                        
                                        // 重新定義 loginByFB 的位置與frame
                                        self.loginByFB.imageView?.image = fbButtonImage
                                        
                                        self.loginByFB.bounds.size.width = 60
                                        self.loginByFB.bounds.size.height = 60
                                        
                                        self.loginByFB.frame = CGRectMake(self.loginByFB.frame.origin.x - 70, self.loginByFB.frame.origin.y - 145, self.loginByFB.frame.size.width, self.loginByFB.frame.size.height)
                                        
                                        self.loginByFB.layer.cornerRadius = 0.5 * self.loginByFB.bounds.size.width
                                        
                                        self.loginByFB.layer.borderWidth = 1.0
                                        self.loginByFB.clipsToBounds = true
                                        
                                        // 重新定義 loginByGooglePlus 的位置與frame
                                        self.loginByGooglePlus.imageView?.image = fbButtonImage
                                        
                                        self.loginByGooglePlus.bounds.size.width = 60
                                        self.loginByGooglePlus.bounds.size.height = 60
                                        
                                        self.loginByGooglePlus.frame = CGRectMake(self.loginByGooglePlus.frame.origin.x + 60, self.loginByGooglePlus.frame.origin.y - 200, self.loginByGooglePlus.frame.size.width, self.loginByGooglePlus.frame.size.height)
                                        
                                        self.loginByGooglePlus.layer.cornerRadius = 0.5 * self.loginByGooglePlus.bounds.size.width
                                        
                                        self.loginByGooglePlus.layer.borderWidth = 1.0
                                        self.loginByGooglePlus.clipsToBounds = true
                                    }
        })
        
    }


上面程式碼幾乎都有註解,所以就不在這一一說明,只截取動畫有關的程式碼,片段如下

UIView.animateWithDuration(3.0 ,animations:{},completion: { finish in
                                    UIView.animateWithDuration(3.0){}})


其中數字3.0就是動畫執行的速度,數值越大動畫就跑得越慢,而animations:{}的部份表示動畫開始的地方,這個地方可以空白不寫,沒寫的話則動畫會直接跑finish的部分,同樣的finish的地方也可以空白不寫那就只會跑開使的部分



詳細範例可以從以下網址下載
GitHub分享網址: https://github.com/jenemebo/SquareButtonToCircleButton

2017年10月21日 星期六

Xcode測試的Simulator模擬器鍵盤不見了?

各位如果使用新的Xcode 9.0版測試時應該會發現模擬器的鍵盤不見了,如下圖所示:



而要讓鍵盤出現的方式很簡單,只需要在上方的Simulator工具列選Hardware裡面的Keyboard,然後再選Toggle Software Keyboard就可以了如下圖所示:




現在,我們的鍵盤出現啦~ 



2017年10月19日 星期四

如何解決發布錯誤 ERROR ITMS-90167: "No .app bundles found in the package"

今天分享一下如何解決在發布的時候遇到ERROR ITMS-90167: "No .app bundles found in the package" 的問題,在搜尋網路的解決方法時發現網路上是說這是因為當你用比較舊版的Xcode開發工具時(如7.3.1)在新的Mac OS (Mac OS Sierra 10.12)是無法正常發布的,需用較新的application loader 3.6(含)以上發布才可以,然後就教你去哪裡下載

可是,經我自己測試以後發現不用這麼麻煩,其實用Xcode 7.3.1本身就可以解決這個問題了,方法就是在Run旁邊選擇裝置的地方選擇Build Only Device就可以了~ 如下圖所示:




上述方法就可以解決ERROR ITMS-90167: "No .app bundles found in the package" 的問題,不過..是說現在還會有人跟我一樣在用Xcode 7.3.1嗎?  XDD





參考網址: 

2017年10月17日 星期二

如何解決Xcode indexing paused的問題

今天分享如何解決Xcode在執行測試時遇到的indexing paused的問題,遇到這個問題時會導致Xcode無法順利的執行測試,例如無法順利地利用模擬器或真機做測試而一直卡在那裡,如下畫面:



而在網路上找到的解決方法有: (以下舉例我找到的答案)
  1. Open your Project Folder.
  2. Find ProjectName.xcodeproj file.
  3. Right-Click Copy and Paste to Safe Place.
  4. Right-Click Show Package Contents.
  5. Find project.xcworkspace file and delete that file.
  6. Reopen Your Project and clean and Rebuild.
或是
  1. Deleting "Derived Data" in the Organizer, and re-open and workspace. (fail to fix)
  2. "Show Package Contents" on the .xcodeproj file and deleting .xcworkspace
甚至有附上語法
rm -frd ~/Library/Developer/Xcode/DerivedData/*

rm -frd ~/Library/Caches/com.apple.dt.Xcode/*

不幸的是,上述的方法在我自己嘗試以後都無法解決!

在我折騰一番之後我發現另一個解法,首先去工具列的Product --> Scheme --> Edit Scheme...,如下圖




按下去之後會看到如下畫面




點擊左側的Run,然後在右邊的畫面中找到Launch的地方,這邊預設會是Wait for executable to be launched,將它改成Automatically然後按下Close並且執行,理論上這時候就可以解決indexing paused卡住的問題了





參考網址:
1. https://stackoverflow.com/questions/13831559/xcode-stuck-on-indexing

2. https://stackoverflow.com/questions/26494082/swift-xcode-index-freezing-or-slow

2017年10月15日 星期日

如何邁向iOS APP工程師 & Swift分享 (二)

今天的分享主要是Swift 3的基本宣告與一些基本概念,而這些分享都是以之前完全對iOS與Swift沒有任何概念的基礎之下,所以會從非常基本的層面開始分享~ 讀者可依據自己的需求跳過已知的部分

以下便是這次分享的內容主題
1. 學習Swift 3前的前置作業 (Mac原生環境為例)
2. 如何建立一個Swift專案或是Playground (Playground介紹)
3. 專案結構基本介紹 (vs Objective C)
4. Swift程式風格


一. 學習Swift 3前的前置作業 (Mac原生環境為例)
1. 一台Mac電腦 (Mac Book Pro / Mac Book Air/ Mac Mini..etc)
雖然網路上有提供在非Mac電腦上撰寫Swift的方法,但是這邊是以Mac原生環境為例,所以要
先準備好一台Mac電腦
2. 安裝Xcode
有了電腦以後就是安裝Xcode開發工具,Xcode可以在Apple官方網站下載,網址: https://developer.apple.com/download/ (需有Apple ID)

二. 如何建立一個Swift專案或是Playground
 承上步驟安裝好Xcode以後就是建立一個Swift專案,到應用程式啟動Xcode,然後點選File --> New --> Project,如下圖


然後選左邊的iOS --> Application --> Single View Application --> Next,如下圖


然後在Language的地方下拉選單就可以看到Objective-C / Swift的選項,如下圖


再按下Next以後一個Swift的專案就建好了~ 而要建立Playground則是點選File --> New --> Playground --> Single ViewPlayground最大的特色就是可以即時看到執行的結果


三. Swift的一些程式風格介紹

Swift基本上是一個很自由的程式,例如if敘述句可以不用加(),當然你要加的話也可以,但是它依然有一些限制的風格,例如Var testInt = testInt2 (空格)+1 與  Var testInt = testInt2+1是不一樣的,因為Swift規定你要不是前後都要有空格,不然就是前後都沒有空格不然便會出錯

以上就大概稍微介紹如何建立一個Swift專案以及淺談Swift的一些撰寫風格,下次的分享終將會正式進入Swift的程式語言裡


2017年10月14日 星期六

如何邁向iOS APP工程師 & Swift分享 (一)

目前本身職業是APP開發工程師(iOS, android)早期接觸iOS的時候還只有Objective-C,所以在Swift領域中也算是新手學習當中,想在這就自己邊學的心得邊與大家分享,大家一起來研究Swift

目標打算在分享的過程中漸漸帶領大家做出一些東西,雖然主要是在Swift方面的分享,但當中也可能分享一些Objective的觀念來對照

現在,就開始第一次的分享吧,第一次分享中只大概介紹如何從一個非iOS的工程師踏入這個領域

第一次分享內容
1. 對iOS開發語言有基本認識 (Objective-C, Swift 3.0)
2. 對第三方開發工具有基本認識 (Cocos2d-X, Xamarin)
3. 對iOS開發工具—Xcode有基本認識
4. 如何建立一個新專案並執行專案
5. UI設計介紹(Storyboard, XIB and Hard Code)
6. Swift 3.0 語法開發教學


最終分享目標
可實作出一個簡單的App並執行且可以上架


成為一名iOS工程師的準備    
一定要具備的 (這邊皆是以原生開發來說)
(1)一台Mac電腦(Macbook Pro, Macbook air)最便宜為28,900左右
(2) Xcode開發工具(Apple官方開發工具)免費
(3) Apple開發者帳號(測試與發佈用)最便宜一年3400
結論:  成為一名iOS工程師之前 你要先有$3,6000左右

iOS App 官方原生開發語言
Objective – C : 一個由C語言擴展 內涵SmallTalk訊息傳遞風格,Ojective – C中可以完全用C語言來編寫

Swift : Apple自開發的語言 JavaScript的人對Swift可能會比較容易上手因有些語法很像..例如: var, let… (但意義可能不一樣)


Swift 與 Objective – C 之差異
1.Swift取消了Objective-C的指標 ex:
ObC:  NSString *str = @"hello";
Swift: var str = "hello";
2. Swift不再需要標頭檔(Header files)OBC一定要有hm (除非你只是宣告變數 則只需要h)
3.在switch 的區塊內不需要再使用 break 敘述句
4. Swift支援Playground(一種即時顯示執行結果的工具且只支援Swift語系)
PS: 以上只列出差異較為明顯的部分

如果我沒有上述必備那些 但又真的很想開發iOS Appe該如何?    
ANS: 用非原生的工具和語言
工具: Cocos2d-X(免費), Unity 3D(免費+付費), Xmarine(付費)
語言: C++, C#, Lua, JavaScript, Html5
以上就先為大家稍微介紹一下如何進入iOS的領域,下次的分享中就會開始進入Swift的分享中喔~ 

PS: 上述工具中寫過Unity與Cocos2d-x,所以如果有想一起討論這兩個的也歡迎喔~ 

解決iOS 14上如果更換預設瀏覽器(例如從Safari換成Chrome)時, 用Scheme架構會無法回到上一頁的問題

 如果遇到以下問題時 須在Info裡的LSApplicationQueriesSchemes裡設定多增加https, 如下圖: