2016-10-04 13 views
9

10.12にはいくつかの大きな変更がありますが、私の意見では最大の新しい自動レイアウトシステム(または変更/書き直し古いもの...知っています)です。私はこの問題を示す簡単なプロジェクトを準備しました。分割されたビュー項目をボタンで折り畳むことに関連しています。それは10.12でのみ起こります。プロジェクトをコンパイルしてボタンをクリックするだけです。エラーが表示されます:macOS 10.12自動レイアウトの問題

2016-10-04 15:10:28.284296 test-12 [64932:7425277] [レイアウト]が検出されました。サイズと原点を完全に定義するのに十分な制約がないため、配置することはできません。不足している制約を追加するか、translatesAutoresizingMaskIntoConstraints = YESを設定し、制約が生成されます。このビューがmacOS 10.12以降で手動でレイアウトされている場合、オーバーライドから[super layout]を呼び出さないように選択できます。 DETECTED_MISSING_CONSTRAINTSにブレークポイントを設定してデバッグします。このエラーは一度だけ記録されます。

ブレークポイントを設定した後、我々は問題のビューであることを見つけることができます。

(lldb) po $arg1 
<NSSplitDividerView: 0x618000161980> 

は、私は完全に間違っているか、10.12との明確な問題があるのでしょうか?可能であれば、この種のエラーを防ぐ方法をアドバイスしてください。

プロジェクトはもう一度github

からダウンロードすることができますが助けてくれてありがとう。

I.ニコロフ

+2

NSAlert.layout()を呼び出すだけで、このメッセージをトリガすることができます。この場合の提案は一切なく、エラーを回避する明白な方法はないので、私はレーダー(rdar:// 28700495)を提出しました。 – rsfinn

+4

私の 'NSSplitViewController'に' splitView(_ splitView:NSSplitView、shouldHideDividerAt dividerIndex:Int) - > Bool'から 'false'を返すことでこの問題を解決します。 – LShi

+0

@LShi:ありがとう、私は同じ問題を抱えていて、それも私のために働いた。 – mschmidt

答えて

0

私は、同じ自動レイアウトの問題を持っていると私は私のプロジェクトのための回避策を見つけました。 制約を持つサブビューを追加した後、私はウィンドウを「レイアウト」に呼び出します。残念ながら、私はそれぞれの "add"コールの後にそれを行います。そうしないと、システムは醜いメッセージを再び投げます。それは私のために働くと私はinitialistionの間にそれを呼び出すだけです。

// Left Split View 
    [self.scrollviewMain setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.viewMainLeft addSubview:self.scrollviewMain]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeBottom multiplier:1.0 constant:l_floatConstant]]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeTop multiplier:1.0 constant:-l_floatConstant]]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeLeft multiplier:1.0 constant:-l_floatConstant]]; 
    [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeRight multiplier:1.0 constant:l_floatConstant]]; 
    [self.windowMain layoutIfNeeded]; 
    // Right Split View 
    [self.scrollviewDetails setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.viewMainRight addSubview:self.scrollviewDetails]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeBottom multiplier:1.0 constant:l_floatConstant]]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeTop multiplier:1.0 constant:-l_floatConstant-1]]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeLeft multiplier:1.0 constant:-l_floatConstant]]; 
    [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeRight multiplier:1.0 constant:l_floatConstant]]; 
    [self.windowMain layoutIfNeeded]; 
+0

しかし、これはレイアウトを行う正しい方法ではないことに同意する必要があります。間違ったことが間違っている...または少なくとも誤解されています。とにかく - 情報ありがとう。私の意見では効率的でも効率的でもないいくつかの回避策があります。将来的に事態が変わったり、そのような事態を回避するための情報を得ることを願っています。 –