ThinButtonは場所を取るため、RubberBandの大きさによっては重なって使いづらい場合がある。
RubberBand内にボタンが収まらない場合は別の位置に表示させたい。次のルールで位置を決めることにした。
(1) RubberBandの 縦幅または横幅にボタンが収まらない場合は、RubberBandの下にボタンを表示する。
(2) RubberBandの下に表示した場合、画面の外にはみ出してしまう場合は、RubberBandの上に表示する。
(3) ボタンがRubberBandの下または上に表示されている場合、ボタンの左位置は RubberBandの左位置に合わせる。
(4) ボタンの右側が画面の外にはみ出してしまう場合はボタンの左位置を調整して、ボタンすべてが表示できるように調整する。
RubberBand.mに ボタンの位置を決めるメソッドが元々用意されているのでこれに手を加える。上記ルールに従って実装すれば良い。実際には見た目を感覚的なものにする為に、マージンやオフセットで微調整してある。
RubberBand.m
#define SBBF_MARGIN 5.0
#define BUTTON_OFFSET 5.0
-(void)setButtonBarWithFrame:(NSRect)frame
{
NSPoint p;
NSSize button_size = [_button_bar bounds].size;
NSSize view_size = [self bounds].size;
// (1) standard position
p.x = frame.origin.x + frame.size.width - button_size.width - BUTTON_OFFSET;
p.y = frame.origin.y + frame.size.height - button_size.height -BUTTON_OFFSET;
// (2) over height/width
if (button_size.height + SBBF_MARGIN*2 > frame.size.height ||
button_size.width + SBBF_MARGIN*2 > frame.size.width) {
p.y = frame.origin.y + frame.size.height + BUTTON_OFFSET;
if (p.y + button_size.height + SBBF_MARGIN > view_size.height) {
p.y = frame.origin.y - button_size.height - BUTTON_OFFSET;
}
}
// (3) adjust origin.x
if (p.x - SBBF_MARGIN < _rect.origin.x) {
p.x = _rect.origin.x - BUTTON_OFFSET;
}
if (p.x + button_size.width + SBBF_MARGIN > view_size.width) {
p.x = frame.origin.x + frame.size.width - button_size.width + BUTTON_OFFSET;
}
[_button_bar setFrameOrigin:p];
}
実装後の動きをみてみよう。
まずは初期状態。ボタンは RubberBand内の右下に表示される。
縦幅を狭めていくとある時点でボタンが下に表示されるようになる。
横幅も同様。
ボタンが下に表示された状態で、RubberBandを画面下へ持っていくと今度はボタンが上に表示される。
ボタンが RubberBandの下に表示された状態で右端へ持っていくと、ボタンの表示位置が左にづれる(右の表示が切れることがない)。
ソース:RubberBand-18.zip
- - - - -
サイズは今のところスペースバーで消せるのでこのままにしておく。