を含む最初のiOSアプリを開発していますUISlider
。UISlider
をドラッグしたときに値を取得する方法を知っています。しかし、私のアプリでは、ワンタッチでスライダーの値を取得する必要があります。つまり、のどこかにタッチするとUISlider
、UILabel
正しい値が表示されます。
このようにすることは可能ですか。チュートリアルやコードは非常に役立ちます。
を含む最初のiOSアプリを開発していますUISlider
。UISlider
をドラッグしたときに値を取得する方法を知っています。しかし、私のアプリでは、ワンタッチでスライダーの値を取得する必要があります。つまり、のどこかにタッチするとUISlider
、UILabel
正しい値が表示されます。
このようにすることは可能ですか。チュートリアルやコードは非常に役立ちます。
ここで、 tapCountは、 .hファイルint
で宣言する変数です。
- (void)viewDidLoad
{
tapCount = 0; // Count tap on Slider
UITapGestureRecognizer *gr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sliderTapped:)];
[slider addGestureRecognizer:gr];
}
- (void)sliderTapped:(UIGestureRecognizer *)g
{
/////////////// For TapCount////////////
tapCount = tapCount + 1;
NSLog(@"Tap Count -- %d",tapCount);
/////////////// For TapCount////////////
UISlider* s = (UISlider*)g.view;
if (s.highlighted)
return; // tap on thumb, let slider deal with it
CGPoint pt = [g locationInView: s];
CGFloat percentage = pt.x / s.bounds.size.width;
CGFloat delta = percentage * (s.maximumValue - s.minimumValue);
CGFloat value = s.minimumValue + delta;
[s setValue:value animated:YES];
NSString *str=[NSString stringWithFormat:@"%.f",[self.slider value]];
self.lbl.text=str;
}
Swiftユーザーの場合
override func viewDidLoad()
{
super.viewDidLoad()
tapCount = 0
let gr = UITapGestureRecognizer(target: self, action: #selector(self.sliderTapped(_:)))
slider.addGestureRecognizer(gr)
}
func sliderTapped(_ g: UIGestureRecognizer) {
/////////////// For TapCount////////////
tapCount = tapCount + 1
print("Tap Count -- \(tapCount)")
/////////////// For TapCount////////////
let s: UISlider? = (g.view as? UISlider)
if (s?.isHighlighted)! {
return
}
// tap on thumb, let slider deal with it
let pt: CGPoint = g.location(in: s)
let percentage = pt.x / (s?.bounds.size.width)!
let delta = Float(percentage) * Float((s?.maximumValue)! - (s?.minimumValue)!)
let value = (s?.minimumValue)! + delta
s?.setValue(Float(value), animated: true)
let str = String(format: "%.f", slider.value)
lbl.text = str
}
訂正@ipatel:以前の回答の数学は不完全であり、親指の幅に関する考慮事項が欠落しているためにジッターが発生します。
サブクラス化することを選択した場合、次のようになりますUISlider
。
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
[super beginTrackingWithTouch:touch withEvent:event];
CGPoint touchLocation = [touch locationInView:self];
CGFloat value = self.minimumValue + (self.maximumValue - self.minimumValue) *
((touchLocation.x - self.currentThumbImage.size.width/2) /
(self.frame.size.width-self.currentThumbImage.size.width));
[self setValue:value animated:YES];
return YES;
}
受け入れられた答えのための迅速なバージョン、
@IBAction func sliderTappedAction(sender: UITapGestureRecognizer)
{
if let slider = sender.view as? UISlider {
if slider.highlighted { return }
let point = sender.locationInView(slider)
let percentage = Float(point.x / CGRectGetWidth(slider.bounds))
let delta = percentage * (slider.maximumValue - slider.minimumValue)
let value = slider.minimumValue + delta
slider.setValue(value, animated: true)
}
}
の現在値はUISlider
、以下のようなアクションメソッドで表示できます。
- (IBAction) sliderValueChanged:(UISlider *)sender {
yourLable.text = [NSString stringWithFormat:@"%.1f", [sender value]];
}
これらのチュートリアルと例を参照してくださいUISlider
。
の現在の(最新の)値を表示する例を含むこの2番目のチュートリアルは、たとえば下の画像UISlider
をUILable
参照してください。