2014/05/01

How to resolve "Unable to simultaneously satisfy constraints" error in ios

在 IPhone 4S 以前,螢幕大小是等比放大的,但 IPhone 5/5S 就不是等比放大了。因此工程師們在設計 app 時,為了讓畫面在所有 device 都不跑版,就可能用 code 的方式產生畫面中所有元件,另一種方式就是使用 storyboard 搭配 auto layout,而 constraints 就是 storyboard 搭配 auto layout 時會使用到的一種技術

constraints

  • 在 storyboard 中使用 auto layout 才會出現
  • 元件對齊的條件,包含元件與父容器、元件寬高、元件間對齊等等
  • 可在 storyboard 中設定,也可用 code 設定

Unable to simultaneously satisfy constraints problem

  • 在 storyboard 中設定 constraints 後,為了畫面的顯示,又再 controller 中動態修改,導致部分 constraints 發生衝突
  • 錯誤訊息

2014-04-09 16:03:23.280 kokola[4077:60b] Unable to simultaneously satisfy constraints.
 Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x8d8f340 H:[UILabel:0x100e120(165)]>",
    "<NSLayoutConstraint:0x8d74d20 H:[UILabel:0x1006630(0)]>",
    "<NSLayoutConstraint:0x100a1c0 H:[UIView:0x101c6a0(190)]>",
    "<NSLayoutConstraint:0x8d81620 H:|-(0)-[UILabel:0x100e120]   (Names: '|':UIView:0x101c6a0 )>",
    "<NSLayoutConstraint:0x100e860 H:[UILabel:0x1006630]-(0)-|   (Names: '|':UIView:0x101c6a0 )>",
    "<NSLayoutConstraint:0x10085b0 H:[UILabel:0x100e120]-(0)-[UILabel:0x1006630]>"
)

Will attempt to recover by breaking constraint 


Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in  may also be helpful.

2014-04-14 09:58:01.131 kokola[3511:60b] Unable to simultaneously satisfy constraints.
 Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x8f604d0 V:[UIView:0x8f63e40(88)]>",
    "<NSLayoutConstraint:0x1016af0 V:[UIView:0x8f560a0(0)]>",
    "<NSLayoutConstraint:0x1016b20 V:|-(0)-[UIView:0x8f63e40]   (Names: '|':UIView:0x8f560a0 )>",
    "<NSLayoutConstraint:0x1016be0 V:[UIView:0x8f63e40]-(0)-|   (Names: '|':UIView:0x8f560a0 )>"
)

Will attempt to recover by breaking constraint 

solve

  1. 看懂錯誤訊息
    (1) 方向與 constraint value
    
    "<NSLayoutConstraint:0x8d8f340 H:[UILabel:0x100e120(165)]>"
    
    在上方錯誤訊息中," H " 代表 Horizontal,而 165 代表 constraint value,UILabel 當然就是元件啦!
    由以上訊息可以知道,在 storyboard 中有某個寬度為 165 的 UILabel
  2. 
    "<NSLayoutConstraint:0x8f604d0 V:[UIView:0x8f63e40(88)]>"
    
    看完前一個錯誤訊息後,應該不難猜到上面錯誤訊息中的 " V " 就是 Vertical,所以由這個錯誤訊息可以知道,在 storyboard 中有某個高度為 88 的 UIView

    (2) constraint 對齊
    
    "<NSLayoutConstraint:0x8d81620 H:|-(0)-[UILabel:0x100e120]   (Names: '|':UIView:0x101c6a0 )>"
    
    從前面的錯誤訊息得知 " H " 代表 Horizontal,而 " H: " 後面的 " |-(0)- " 代表對齊方式與 constraint value。其中 " | " 代表對齊的方向;" - " 代表間距;" () " 中的數值代表 constraint value,而後面的 UIView 則代表與 UILabel 對齊的元件。所以上面的錯誤訊息表示,在 storyboard 中有一個 UILabel 與左邊 UIView 間距是 0
    
    "<NSLayoutConstraint:0x1016b20 V:|-(0)-[UIView:0x8f63e40]   (Names: '|':UIView:0x8f560a0 )>"
    
    前面的解說判斷,上面的錯誤訊息代表,在 storyboard 中有一個 UIView 與上面 UIView 間距是 0
2.   根據錯誤訊息找出元件
      (1) 選擇 storyboard 並切換到 " show the version editor " 模式
      (2) 搜尋一下上述 constraint value,然後往上找一下看是哪個元件,並搭配錯誤訊息中元件種類判斷一下可能的元件,接著看看元件的其他屬性,其中 " userLabel " 就是元件在 storyboard 中的名稱

      (3) 再往上看一點,可看到綠色註解,是 xcode 產生的註解,可看出元件再哪個 ViewController


      (4) 切換回 " show the standard editor " ( 檢視 UI )


      (5) 用剛剛的線索找到元件


3.   修正 constraint value
      (1) 選擇 constraint 並切換到 " Interface Builder " 的 " connection inspector ",查看是否與程式碼連結

      (2) 切換回 controller.m,在程式碼中尋找剛剛的連結 ( 有聯結 storyboard 的宣告,前面會有黑點點 ),查詢一下看哪裡會變更這個 constraint value,確認一下計算公式是否正確,constraint value 變更後是否會與其他 constraint value 發生衝突


References

2014/04/30

如何找Mac免費或特價App

Mac有許多不錯的付費App,這些App有時侯會限時特價,甚至是限時免費,網路上已經有一些網站會公佈這一類的資訊,以下是就是我常去看的網站

  • appshopper

http://appshopper.com/mac/

這個網站每天都會更新ios與mac的app動態像是更新、限時降價、限時免費,這是我每天都會看的網站

以上圖為例 UPDATE是指app版本更新, PRICE DROP是指降價,會指出原價多少、降價多少,以及該app的評價與說明,如果您對某個app有興趣的話可進一步點進去看app的詳細內容。

app的詳細介紹會有更多的說明、評價、貼圖、app的動態,以上圖為例,該app的價格大部份時間為590元,但有時侯會特價到150, 60。所以如果覺的590元太貴的話,可以再等看看,不過可能就要每天上網站留意一下。

  • Two Dollar Tuesday

http://twodollartues.com

這個網站每個星期二都會推出3套特價2美元的app,所以我大多都星期二才看這個網站。

以上圖為列,該週推出了3套原價十幾美元到近五十美元的app,限時特價2美元,有興趣的話可以進一步點進去看詳細資訊,不過我在下手買app之前我會先看評價,接著先搜尋看看是否有試用版,等試用後覺的好用才會買,有時我會看一下該app是否會吃掉過多的記憶體與cpu,不然常駐類型的app裝越多只會讓系統跑越慢,千萬不要一時衝動看到特價就買了。

註:appshopper會也發佈這個網站特價的app,不過會比較慢一點點,有時甚至會漏掉,所以這個網站還是每個星期二時可以看一下。

  • stacksocial

https://stacksocial.com

這個網站也會特價一些app,但價格就比較不會像是殺到見骨的2美元,偶而也會有一些0元的app,不同的是這個網站比較不像前2個介紹的app都可以在App Store上購買,是另外在該網站刷卡,購買後會得到app的序號

為了更新app方便,我都是在App Store上買app,App Store預設是會將信用卡號碼存起來,我為了怕被盜帳號,所以我會再購買後將信用卡資訊刪掉,等下次要購買時再填上卡號。

想要買App又不想多花錢,就常上上述網站吧~

2014/04/29

Mac 推薦App

從windows轉到Mac大約有半年時間,如果現在要我轉回Windows,恐怕回不去了,因為Mac上的App實在是太豐富了!無論是工作上還是生活上用的。

有些App是免費的,但有些要付費,從數十元到幾百幾千元都有,以前我都從網路上找破解,但破解會有2個問題,一個是怕被藏病毒,一個是無法更新到新版本。所以如果App不貴的話,我就直接買了,例如1個60元的App,如果我花1小時自已開發也做不完的話,那我就買了。

以下是我推薦的一些App

  • ForkLift(付費)(極力推薦)

https://itunes.apple.com/tw/app/forklift-file-manager-ftp/id412448059?l=zh&mt=12 

將Finder跟SFTP Client整合在一起,方便傳輸檔案,也提供了一些便利功能,例如顯示隱藏檔、建立檔案、資料夾。有了這套就很少在開Finder了,定價590,我是在特價60元買的(我同事當時沒買很後誨)

  • Unclutter(付費)(極力推薦)

https://itunes.apple.com/tw/app/unclutter/id577085396?l=zh&mt=12

任何時侯想看待辦事項、最近剪貼簿的項目,只要將mouse移至最頂端往下scroll即可取得,一個小動作就可得到想要的資訊,非常實用。在特價60元買的。

  • Sublime Text(免費)

這是文字編輯工具,先前是用TextWranger,但後來發生在開大size的log檔時發現行號是錯的,所以後來就改用了Sublime Text,但Sublime Text還是比不上Windows的Emeditor,所以有時侯要特別在查log找bug時我還是得切回windows用Emeditor..

  • SourceTree(免費)。這是Git的Client

  • Microsoft Remote Desktop(免費)。這是遠端連到到windows用的

  • OmniGraffle(付費)。這套是拿來取代Windows上的Visio用的,可以開visio檔,功能比visio強,可以下載一些免費的圖庫來使用。

  • astah professional(付費)。這套是拿來畫UML的工具

  • Navicat Premium(付費)。這是拿來連資料庫的client

  • Timing(付費)

https://itunes.apple.com/tw/app/timing/id431511738?l=zh&mt=12

這套app會記錄你用哪個app花了多少時間,例如今天花多少時間在用safari,也可以細分到看哪個網站花了多少時間。我會用這套來檢核每天花多少時間在工作上。以及查哪一天做了什麼事。特價90元時買的。

  • Mou(免費) mark down的編輯器。

  • Burn(免費) 燒錄軟體

  • AirBridge (免費)

https://itunes.apple.com/tw/app/airbridge-transfer-image-photo/id838825412?l=zh&mt=12

方便跟iphone互傳圖片,iphone上也需裝AirBridge

  • Adium(免費)。拿來當Facebook的messenger

  • ReadKit(付費)

https://itunes.apple.com/tw/app/readkit/id588726889?l=zh&mt=12

先前我是裝免費的Sharky RSS,後來買了ReadKit,因為畫面比較好看

  • oneSafe(付費)(推薦)

https://itunes.apple.com/tw/app/onesafe/id595543758?l=zh&mt=12

用來儲存各個網站的登入帳號密碼。每次只要註冊一個新網站時都會煩惱密碼要設什麼,現在我都用這套工具來亂數產生密碼並存起來,以後密碼忘記時再回來找。特價60元買的。

  • Checkbook HD

https://itunes.apple.com/tw/app/ji-zhang-da-shi-checkbook-hd/id496433528?l=zh&mt=12

方便實用的記帳軟體,可跟iphone用icloud同步

  • MPlayerX(免費) 播放影片用

https://itunes.apple.com/tw/app/mplayerx/id421131143?l=zh&mt=12