RCTSliderManager.m 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*
  2. * Copyright (c) Facebook, Inc. and its affiliates.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. */
  7. #import "RCTSliderManager.h"
  8. #import "RCTBridge.h"
  9. #import "RCTEventDispatcher.h"
  10. #import "RCTSlider.h"
  11. #import "UIView+React.h"
  12. @implementation RCTSliderManager
  13. RCT_EXPORT_MODULE()
  14. - (UIView *)view
  15. {
  16. RCTSlider *slider = [RCTSlider new];
  17. [slider addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];
  18. [slider addTarget:self
  19. action:@selector(sliderTouchEnd:)
  20. forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside | UIControlEventTouchCancel)];
  21. return slider;
  22. }
  23. static void RCTSendSliderEvent(RCTSlider *sender, BOOL continuous)
  24. {
  25. float value = sender.value;
  26. if (sender.step > 0 && sender.step <= (sender.maximumValue - sender.minimumValue)) {
  27. value =
  28. MAX(sender.minimumValue,
  29. MIN(sender.maximumValue,
  30. sender.minimumValue + round((sender.value - sender.minimumValue) / sender.step) * sender.step));
  31. [sender setValue:value animated:YES];
  32. }
  33. if (continuous) {
  34. if (sender.onValueChange && sender.lastValue != value) {
  35. sender.onValueChange(@{
  36. @"value" : @(value),
  37. });
  38. }
  39. } else {
  40. if (sender.onSlidingComplete) {
  41. sender.onSlidingComplete(@{
  42. @"value" : @(value),
  43. });
  44. }
  45. }
  46. sender.lastValue = value;
  47. }
  48. - (void)sliderValueChanged:(RCTSlider *)sender
  49. {
  50. RCTSendSliderEvent(sender, YES);
  51. }
  52. - (void)sliderTouchEnd:(RCTSlider *)sender
  53. {
  54. RCTSendSliderEvent(sender, NO);
  55. }
  56. RCT_EXPORT_VIEW_PROPERTY(value, float);
  57. RCT_EXPORT_VIEW_PROPERTY(step, float);
  58. RCT_EXPORT_VIEW_PROPERTY(trackImage, UIImage);
  59. RCT_EXPORT_VIEW_PROPERTY(minimumTrackImage, UIImage);
  60. RCT_EXPORT_VIEW_PROPERTY(maximumTrackImage, UIImage);
  61. RCT_EXPORT_VIEW_PROPERTY(minimumValue, float);
  62. RCT_EXPORT_VIEW_PROPERTY(maximumValue, float);
  63. RCT_EXPORT_VIEW_PROPERTY(minimumTrackTintColor, UIColor);
  64. RCT_EXPORT_VIEW_PROPERTY(maximumTrackTintColor, UIColor);
  65. RCT_EXPORT_VIEW_PROPERTY(onValueChange, RCTBubblingEventBlock);
  66. RCT_EXPORT_VIEW_PROPERTY(onSlidingComplete, RCTDirectEventBlock);
  67. RCT_EXPORT_VIEW_PROPERTY(thumbTintColor, UIColor);
  68. RCT_EXPORT_VIEW_PROPERTY(thumbImage, UIImage);
  69. RCT_CUSTOM_VIEW_PROPERTY(disabled, BOOL, RCTSlider)
  70. {
  71. if (json) {
  72. view.enabled = !([RCTConvert BOOL:json]);
  73. } else {
  74. view.enabled = defaultView.enabled;
  75. }
  76. }
  77. @end