前提・実現したいこと
現在macOS版で音楽再生アプリケーションを作っています.そこでSliderを用いて音楽再生のシークバーを作成しているのですが,Sliderの持つところが初期状態の丸しかありません.
このスライダーの外観を
下の画像のように変更したいと考えています.
(自分でイラストを使って作りました.)
試したこと
iOSだと画像変更用のメソッドslider.setThumbImage(:for)
があるので簡単に変更することができると思いますが,macOSのSliderにはそのようなメソッドが存在していません.
そこで色々調べた結果
参考文献1 から
NSSliderCellの
(void)drawKnob:(NSRect)knobRect メソッドをオーバーライドすると変更できそうだと思い自分でプログラムを書いてみました.しかし,圧倒的にObjctive-Cを読むことができないため別の記事を参考にしようと考え色々検索すると,
Sliderの色を変えるプログラムを見つけることができました.
参考文献2:Sliderの色を変えるプログラム
このプログラムはSwiftで書かれていたためなんとか解読することができそれを参考にThumbを変更できないかと模索した結果それっぽいものが完成しましたが,問題を抱えています.
###抱えている問題
- スライダの位置がThumbの位置とあっていない
- Thumbの下の形が角丸になっていない.
- できればThumbを参考文献1 を参考にしてImageを使って表したい
- 圧倒的にObjctive-Cを読めない.
###自分なりに書いたソースコード
SliderのSliderCellのカスタムクラスをCustomSliderCellに適応してます.
CustomSliderCell.swift
1CustomSliderCell:NSSliderCell{ 2 3 override func drawKnob(_ knobRect: NSRect) { 4 var knob = knobRect 5 knob.size.height = CGFloat(20) 6 knob.size.width = CGFloat(5) 7 let knobRadius = CGFloat(2.5) 8 let bg = NSBezierPath(roundedRect: knob, xRadius: knobRadius, yRadius: knobRadius) 9 //let bg = NSBezierPath(rect: knob)にすれば角丸ではなく長方形になる.上下 10 NSColor.orange.setFill() 11 bg.fill() 12 13// image = NSImage(named: "bar.png") 14 15 } 16 17 //参考文献2からbarのデザインも変更可能,今回の質問には直接的には関係がないと思われる?ため実際はコメントアウト 18 19 override func drawBar(inside aRect: NSRect, flipped: Bool) { 20 var rect = aRect 21 rect.size.height = CGFloat(7) 22 let barRadius = CGFloat(2.5) 23 let value = CGFloat((self.doubleValue - self.minValue) / (self.maxValue - self.minValue)) 24 let finalWidth = CGFloat(value * (self.controlView!.frame.size.width - 5)) 25 var leftRect = rect 26 leftRect.size.width = finalWidth 27 //長方形の幅の半分より大きい値は、幅の半分に固定される 28 let bg = NSBezierPath(roundedRect: rect, xRadius: barRadius, yRadius: barRadius) 29 NSColor.orange.setFill() 30 bg.fill() 31 32 } 33}
Sliderの描写方法でもっと良い方法があったり,何か些細なことでも構わないのでアドバイスやヒントを教えてください!
よろしければSwiftで解決方法を教えていただきたいです!
(あまり高度なのは理解できないかもしれませんが)Objective-Cのアドバイスでも良いのでよろしくお願いします!!
補足情報
Xcode ver 11.3.1
Swift 5.x
StoryBoard使用
SliderのSliderCellのカスタムクラスをCustomSliderCellに適応
###参考文献1のソースコード
customSliderCell.h
1 2#import "customSliderCell.h" 3@implementation customSliderCell 4//SliderのThumbの話 5 6- (void)drawKnob:(NSRect)knobRect { 7 8 NSImage * knob = knobImage; 9 [[self controlView] lockFocus]; 10 [knob 11 compositeToPoint:NSMakePoint(knobRect.origin.x,knobRect.origin.y+knobRect.size.height) 12 operation:NSCompositeSourceOver]; 13//この一文compositeToPointがよくわからない. 14 15[[self controlView] unlockFocus];//Swiftでは使えなくなってる 16} 17 18//SliderBarのはなし 19- (void)drawBarInside:(NSRect)rect flipped:(BOOL)flipped { 20rect.size.height = 8; 21 22 NSRect leftRect = rect; 23 leftRect.origin.x=0; 24 leftRect.origin.y=2; 25 leftRect.size.width = knobrect.origin.x + (knobrect.size.width); 26 [leftBarImage setSize:leftRect.size]; 27 [leftBarImage drawInRect:leftRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction:1]; 28 29 NSRect rightRect = rect; 30 rightRect.origin.x=0; 31 rightRect.origin.y=2; 32 rightRect.origin.x = knobrect.origin.x; 33 [rightBarImage setSize:rightRect.size]; 34 [rightBarImage drawInRect:rightRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction:1]; 35}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/28 01:43