2016-10-18 6 views
0

私のボタンの位置を変更して、アプリに正しく配置されるように少し調整しています。これまでのところ、以前のバージョン(最小10.8)で、それが働いていますが、右側の最新のMacリリース(10.12シエラ)で、それは何らかの形でその枠や位置を変更しません。..macOS Sierra(setFrameOrigin/setFrame)メソッドがNSButtonフレームを設定していません

サンプル:

-(void)awakeFromNib 
{ 
    [self.mybutton setFrameOrigin:NSMakePoint(0,0)]; // not working... 
    [self.mybutton setFrame:NSRectFromCGRect(CGRectMake(0,0,100,100)]; // also not working... 
} 

何か不足していますか?それはフレームのまっすぐ前方設定でなければなりません。

+0

古いXcode(バージョン7.3)を使用していたため、setFrameOriginが動作しなくなったため、最新のXcodeバージョンで新しいアプリケーションをパッケージ化していたためです。 – reneboi

答えて

0

私は同じ問題に直面しました。

私はにNSImageViewを持っています。ユーザがそれを押した後に移動する必要があります(これは、一種の較正ウィンドウです)。 NSImageViewは、Xcode 6.2 IBによって作成されます。

しかし、他の理由のために、私は(マーベリックス6.2、)その古いXcodeのバージョンで私のアプリをコンパイルするが必要ので、Xcodeの8〜I することはできません更新中OPにより示唆されるように質問のコメント。私はOPのソリューションを試してみませんでした。

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でのテストでは、動作が正しくても(setFrameOriginmyViewを移動します)、コンソールで多くの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で正しく動作します。

関連する問題