TL; DR:私にとっては、AutoLayoutの問題でした。 macOS 10.12 Sierraは、MacOS 10.9-10.10-10.11(私のアプリケーションがテストされてサポートされているところ)より厳しいAutoLayoutルールを持っているようです。最適なソリューションを得るには、オプション3に直接進んでください。
オプション1(MacOSの10.9に失敗):
最初の回避策は、単にスーパーに再度追加し、setFrameOrigin
を送信し、そのスーパーからNSView
を除去することである。
NSView *supView = myView.superview;
[myView setFrameOrigin:NSZeroPoint];
[supView addSubview:myView];
これはMacOS 10.12 Sierraでもうまくいきますが、Mavericks myView
のテストは常に(0,0)の位置で止まっています。私は混合手動レイアウトと自動レイアウトのアプローチを使用しています:
それから私はNSWindow
が実際に自動レイアウトが有効になっている、といくつかの制約が他のいくつかのNSView
S(ただし、myView
上)に設定していることを実現しています。
それはこのは、私の場合には動作しないsetFrameOrigin
の根本的な原因であることが判明。
オプション2(簡単な方法):
伝統的な、非自動レイアウトのアプローチからの自動レイアウト1に移行するときに役立ちます魔法のノブがあります:
myView.translatesAutoresizingMaskIntoConstraints = YES;
awakeFromNib
のオーバーロードで設定しました。すべてがMacOS Sierraで正しく動作しています。
残念なことに、Mavericksでのテストでは、動作が正しくても(setFrameOrigin
がmyView
を移動します)、コンソールで多くのAutoLayout警告が出ます。しかし、これは正しい方向への一歩と思われ、誰かの決定的な解決策になる可能性があります。
オプション3(溶液):
次いでスーパー上removeConstraints
とを使用し、IBとmyView
に一部NSLayoutConstraint
Sを定義:
NSView *supView = myView.superview;
[supView removeConstraints:@[self.bottomConstraint, self.rightConstraint]];
[supView addConstraints:@[self.topConstraint, self.leftConstraint]];
[supView layoutSubtreeIfNeeded];
注:layoutSubtreeIfNeeded
は任意です;私の場合のように、更新された値を使ってmyView.frame
を操作する必要がある場合は、それを使用する必要があります。
このコードは、macOS 10.9-10.10-10.11-10.12で正しく動作します。
古いXcode(バージョン7.3)を使用していたため、setFrameOriginが動作しなくなったため、最新のXcodeバージョンで新しいアプリケーションをパッケージ化していたためです。 – reneboi