feed

2020年03月19日, 編集履歴

ノブなしNSSliderでシークバーを作る

久しぶりにアプリをリリースしました。「Silver Baton」という、Music.appで再生中の曲の情報表示や再生・一時停止等の操作ができるmacOSアプリです。

上記画像のようなコントロールパネルをトラックパッドの3/4本指タップやマウスの右ダブルクリック、ミドルクリックで呼び出せるところがミソです。

さて、Silver Batonでは曲の進行具合の表示と変更のためにシークバーを実装しています(上記画像のウィンドウ最下部の青いバー部分)。

NSProgressIndicatorは何らかの進捗具合を表示するにはうってつけですが、「Indicator」の示すとおり、「表示」に特化していてマウス操作は受け付けません。

そこで、マウス操作を受け付けるNSSliderを利用しました。素のNSSliderには大きなノブが付いています(上記画像のシークバー上部の音量調節NSSliderの白丸)。ノブは邪魔なので、表示させなくするためにNSSliderCellをサブクラス化しました。

import AppKit

class KnoblessSliderCell: NSSliderCell {
  override func knobRect(flipped: Bool) -> NSRect {
    return NSRect.zero
  }
}

let slider1 = NSSlider(target: nil, action: nil)
slider1.doubleValue = 0.5

let slider2 = NSSlider(target: nil, action: nil)
slider2.cell = KnoblessSliderCell()
slider2.doubleValue = 0.5

slider1が通常のスライダ、slider2がノブなしスライダです。NSSliderCellのfunc knobRect(flipped: Bool) -> NSRectをオーヴァライドしてサイズゼロのNSRectを返すことで、ノブを描画しないようにしました。ノブが描画されなくても、通常通りマウスのクリックやドラッグに反応してくれます。

欲を言えば、マウスオーヴァ時だけノブを出したりバーを太くしたりしたほうが良さげですが、今回はここまで。

2016年06月07日, 編集履歴

YAMAHA YAR24 EVAレインポンチョ

原付スクータでの通勤用にYAMAHAから出ているレインポンチョを購入、なかなか良かったので紹介。

全体的な使用感

ふつうのしっかりとした袖が付いているので、ポンチョというよりは前が開かないレインコート的な形。素材は薄く、ややラバーっぽい触り心地。

170cm、55kgの体型で膝下くらいまでの丈がある。サイズに余裕があり、ジャケットを着てメッセンジャバッグを背負った上からでも着用可能。鞄が濡れなくて良い。

裾の前面がゴムで絞られており、そこが膝に引っかかる形になっている。走行中はその状態で安定し、強風の日にも着用していたが巻き上がってくることはなかった。しかし、停車時に地面に下ろた方の膝は露出し、そのまま足をステップに戻しても膝は隠れてくれない。両足を同時に地面に下ろせば膝は隠れたままで使える。

袖口はキツ目のゴムで絞られており、雨水が入りづらくなっているものの、手首には跡が残るほど。

短時間で小雨程度ならばこれひとつでやりくりできるだろうが、やはり別途レインパンツが必要だろう。私はそれまで使っていたものを流用している。ふつうのレインスーツ+レインパンツの構成では、股の間に貯まる雨水が浸水してお漏らししたみたいになっていたのだが(それまで使用していたのが、よく解らんしょぼい奴だったせいもある)、このレインポンチョ+レインパンツに替えてからはズボンが濡れなくなった。

丈がもう少し長ければ、停車時の膝露出問題が解決するし、レインパンツの代わりに長めのブーツカバーを着用して膝下と靴の防水を兼ねられたんじゃないかと思う。そこは残念。

高い襟の角が顎下に刺さってチクチクすることがあるのも残念ポイント。

ポケット、フード、収納袋

前面左側にポケットがひとつ付いている。ボタンで留められるフラップ付き。水抜き用の穴が開いている。

着脱可能なフードが付属しているが、私は完全に原付でしか使わないので、取り外してポケットの中に突っ込んでいる。

本体と同じ素材の収納袋が付属しているが、綺麗に折りたたんでジャストサイズなので使いづらい。私の場合はレインパンツも併用するのでなおさら使えない。レインポンチョとレインパンツを適当に丸めて突っ込めるサイズの布袋を100均で購入して使用している。

おわりに

価格は3000円前後。スクータ乗りにはおすすめ。

2016年05月03日, 編集履歴

Siriを使ってすべてのアラームをオン/オフする

私のように寝起きの悪いひとはiPhoneのアラームを何個も設定しているのではないだろうか。

ここで問題になるのは、たとえば五個のアラームを設定していて、四個目以前で完全に目を覚ました場合に、残りを手動でオフにしておかないと、もう目を覚ましているのにアラームが何回も鳴ってしまうことである。ぽちぽちと残りのアラームをすべてオフにするのも、就寝前にひとつずつオンにするのもめんどくさい。

そこでSiriを使う。

「アラーム全部オンにして」「アラーム全部オフにして」と言えば、設定済みのアラームをすべてオン/オフにしてくれる。これなら小さいスウィッチを何個もタップしなくても良い。

2016年01月12日, 編集履歴

iOS標準メールの通知音設定は二種類存在する

 iOS標準メールの通知音設定は、

の二種類存在する。前者は全体的な設定で、後者はアカウントごとの個別設定である。

 全体設定を変更すると、登録している全アカウントの通知音も連動して変更されるが、一度でも個別設定を行ったアカウントは連動されなくなる。個別設定の画面には「全体設定に合わせる」のような選択肢はなく、個別設定を全体設定と同じものに変更しなおしても、もはや連動されることはない。

 仮に登録しているすべてのアカウントで一度以上個別に通知音を変更した場合、「設定→サウンド→新着メール」の設定項目はほぼ意味をなさなくなってしまう。過去に個別に通知音を設定したことを忘れていると、全体設定のみを変更して「通知音が変わらない」と勘違いをする可能性が大いにあるのだ。

 混乱の原因は通知音を設定する画面が二種類存在し、さらに場所が離れていることである。標準メールは組み込みとは言え、数ある中のいちアプリケーションに過ぎず、代替となるサードパーティ製品も存在するのだから、システム全体のサウンド設定を行う「設定→サウンド」からは除外すべきではないだろうか。「設定→通知→メール」以下で全体設定とアカウントごとの個別設定を行えるようにすると良いだろう。

2016年01月10日, 編集履歴

固定ヘッダでスクロールが飛んでしまうアレな実装

 最初は通常配置されているヘッダメニュー等が、ページのスクロールにより固定配置に変化するウェブページを最近良く見かける。
 そもそも固定配置させる必要があるのかどうかは別問題として(関連記事:固定配置(position: fixed)を使う前によく考えよう)、ヘッダ要素のスタイルのpositionプロパティをfixedに変えているだけのアレな実装が多いことが問題なのである。このアレな実装のために、positionプロパティ切り替えの前後でスクロールが飛んだように見える(スクロール位置が急に動いたように見える)のだ。

 なぜスクロールが飛ぶのか。
 position: fixedとすると、その要素は他の要素からは存在しないのと同様の扱いになる。最初は通常配置だった要素が固定配置になると、その要素はなくなったものとして後続要素の位置が上に詰められてしまうのだ。固定配置から通常配置へ戻るときも同様である。急に新しい要素が増えて、後続要素の位置は下へズレてしまう。その結果スクロールが飛んだように見えるのだ。

 ひとによるだろうが、私の場合、画面に表示されている文章を上から下まで目線を動かしては読まない。目線は一定の位置である程度固定しておき、その目線の場所へ文章をスクロールさせてきて読む。したがって、スクロール位置が急に飛んでしまうと読んでいた文章を見失ってしまう。読みたかった部分が固定配置の下に隠れてしまうこともよくある。

 スクロールが飛ばないようにするには、単純にpositionプロパティを切り替えているだけではダメだ。たとえば、固定配置に切り替えたあとに同じサイズのダミー要素を挿入するとか、直後の後続要素に同じサイズの上マージンを設定するとかしなければならない。

 ある時期からこのアレな実装をよく見かけるようになったと思う。どこかにアレな実装を広めているヤツがいるのだろうか。