FLEXArgumentInputSwitchView.m 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. //
  2. // FLEXArgumentInputSwitchView.m
  3. // Flipboard
  4. //
  5. // Created by Ryan Olson on 6/16/14.
  6. // Copyright (c) 2014 Flipboard. All rights reserved.
  7. //
  8. #import "FLEXArgumentInputSwitchView.h"
  9. @interface FLEXArgumentInputSwitchView ()
  10. @property (nonatomic) UISwitch *inputSwitch;
  11. @end
  12. @implementation FLEXArgumentInputSwitchView
  13. - (instancetype)initWithArgumentTypeEncoding:(const char *)typeEncoding {
  14. self = [super initWithArgumentTypeEncoding:typeEncoding];
  15. if (self) {
  16. self.inputSwitch = [UISwitch new];
  17. [self.inputSwitch addTarget:self action:@selector(switchValueDidChange:) forControlEvents:UIControlEventValueChanged];
  18. [self.inputSwitch sizeToFit];
  19. [self addSubview:self.inputSwitch];
  20. }
  21. return self;
  22. }
  23. #pragma mark Input/Output
  24. - (void)setInputValue:(id)inputValue {
  25. BOOL on = NO;
  26. if ([inputValue isKindOfClass:[NSNumber class]]) {
  27. NSNumber *number = (NSNumber *)inputValue;
  28. on = [number boolValue];
  29. } else if ([inputValue isKindOfClass:[NSValue class]]) {
  30. NSValue *value = (NSValue *)inputValue;
  31. if (strcmp([value objCType], @encode(BOOL)) == 0) {
  32. [value getValue:&on];
  33. }
  34. }
  35. self.inputSwitch.on = on;
  36. }
  37. - (id)inputValue {
  38. BOOL isOn = [self.inputSwitch isOn];
  39. NSValue *boxedBool = [NSValue value:&isOn withObjCType:@encode(BOOL)];
  40. return boxedBool;
  41. }
  42. - (void)switchValueDidChange:(id)sender {
  43. [self.delegate argumentInputViewValueDidChange:self];
  44. }
  45. #pragma mark - Layout and Sizing
  46. - (void)layoutSubviews {
  47. [super layoutSubviews];
  48. self.inputSwitch.frame = CGRectMake(0, self.topInputFieldVerticalLayoutGuide, self.inputSwitch.frame.size.width, self.inputSwitch.frame.size.height);
  49. }
  50. - (CGSize)sizeThatFits:(CGSize)size {
  51. CGSize fitSize = [super sizeThatFits:size];
  52. fitSize.height += self.inputSwitch.frame.size.height;
  53. return fitSize;
  54. }
  55. #pragma mark - Class Helpers
  56. + (BOOL)supportsObjCType:(const char *)type withCurrentValue:(id)value {
  57. NSParameterAssert(type);
  58. // Only BOOLs. Current value is irrelevant.
  59. return strcmp(type, @encode(BOOL)) == 0;
  60. }
  61. @end