1

動的に生成された NSImage を囲む NSImageView があります。表示される画像を変更するときは、新しい画像を正確にラップするように NSImageView のサイズを動的に変更し、NSImageView とウィンドウの他のすべての部分の間のスペースが一定になるように、囲んでいるウィンドウのサイズを変更したいと考えています。(画像を常に物理的なサイズで表示したいので、画像ビューのスケーリングはなしに設定されていることに注意してください ) それを大きな画像に置き換える場合、他の要素のサイズや間隔に影響を与えることなく、NSImageView と囲んでいるウィンドウの両方のサイズを変更して、それに対応できるようにしたいと考えています。

現在、ステッパーまたは関連するテキスト フィールドを介して倍率レベルが変更されるたびに、次のメソッドを呼び出します。画像を再生成して NSImageView にロードすることは正常に機能しますが、NSImageView のサイズを変更してウィンドウを囲むことはできません。

- (void) updateMagnification:(NSUInteger)newMagnification {
    // Keep values of stepper and associated text field synchronized.
    [self.magnificationStepper setIntegerValue:newMagnification];
    [self.magnificationTextField setIntegerValue:newMagnification];

    // Regenerate image based on newMagnification and display in image view.
    [self.qrGenerator generateWithBlockPixelWidth:newMagnification];
    self.imageView.image = self.qrGenerator.image;

    // Adjust frame size of image view.
    NSLog(@"Old size: frame=%@ image=%@", NSStringFromSize(self.imageView.frame.size), NSStringFromSize(self.imageView.image.size));
    [self.imageView setFrameSize:NSMakeSize(self.imageView.image.size.width, self.imageView.image.size.height   )];
    NSLog(@"New size: frame=%@ image=%@", NSStringFromSize(self.imageView.frame.size), NSStringFromSize(self.imageView.frame.size));

    //[self.window setViewsNeedDisplay:YES];
    //[self.imageView setNeedsDisplay:YES];
    //[self.imageView.superview setNeedsDisplay:YES];
}

倍率の値を増減して画像を小さくしたり大きくしたりしても、NSImageView とウィンドウの両方のサイズは一定のままです。コメントアウトされた3 つのsetNeedsDisplay:呼び出しは、コメントを外しても効果がありません。サイズが調整された後にコントロールが再描画されないことに問題があるかどうかを判断しようとしましたが、呼び出しは効果がありませんでした。不思議なことに、私のNSLog呼び出しは、imageView のフレームが実際に要求されたサイズを取ることを示しています。これは、次の出力が得られるためです。

2012-06-12 11:02:50.651 Presenter[4660:603] Old size: frame={422, 351} image={168, 168}
2012-06-12 11:02:50.651 Presenter[4660:603] New size: frame={168, 168} image={168, 168}

もちろん、実際の表示は変わりません。

興味深いことに、ImageView のフレーム スタイルを Interface Builder で、またはプログラムで を使用して「なし」に変更すると、[self.imageView setImageFrameStyle:NSImageFrameNone]希望する動作に近づくことができます。画像ビューによって切り取られるように画像を大きくすると、実際には画像ビューとウィンドウが大きくなります。ただし、この時点から、画像を小さくしても、それに応じて画像ビューまたはウィンドウのサイズが変更されるわけではありません。「なし」は、このやや正しい動作を示す唯一のイメージ フレーム スタイルです。4 つの縁取りスタイル (つまり、ベベル [デフォルト]、ボタン、溝、および写真) はすべて、上記と同じまったく正しくない動作を示します。

私は似たような問題を抱えている人に出会いました。奇妙なことに、彼は画像ビューのフレーム スタイルが に設定されている場合にのみ、問題のある動作を観察しましたNSImageFrameNone。サイズ変更の前にフレーム スタイルを none 以外の値に変更し、後で none に変更してみました。 .

あなたが提供するどんな助けも大歓迎です。ありがとう!

4

0 に答える 0