123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- //
- // XLFormSegmentedCell.m
- // XLForm ( https://github.com/xmartlabs/XLForm )
- //
- // Copyright (c) 2015 Xmartlabs ( http://xmartlabs.com )
- //
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to deal
- // in the Software without restriction, including without limitation the rights
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- // copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- // THE SOFTWARE.
- #import "XLFormSegmentedCell.h"
- #import "NSObject+XLFormAdditions.h"
- #import "UIView+XLFormAdditions.h"
- @interface XLFormSegmentedCell()
- @property NSMutableArray * dynamicCustomConstraints;
- @end
- @implementation XLFormSegmentedCell
- @synthesize textLabel = _textLabel;
- @synthesize segmentedControl = _segmentedControl;
- #pragma mark - XLFormDescriptorCell
- -(void)configure
- {
- [super configure];
- self.selectionStyle = UITableViewCellSelectionStyleNone;
- [self.contentView addSubview:self.segmentedControl];
- [self.contentView addSubview:self.textLabel];
- [self.textLabel addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:0];
- [self.segmentedControl addTarget:self action:@selector(valueChanged) forControlEvents:UIControlEventValueChanged];
- }
- -(void)update
- {
- [super update];
- self.textLabel.text = [NSString stringWithFormat:@"%@%@", self.rowDescriptor.title, self.rowDescriptor.required && self.rowDescriptor.sectionDescriptor.formDescriptor.addAsteriskToRequiredRowsTitle ? @"*" : @""];
- [self updateSegmentedControl];
- self.segmentedControl.selectedSegmentIndex = [self selectedIndex];
- self.segmentedControl.enabled = !self.rowDescriptor.isDisabled;
- }
- #pragma mark - KVO
- -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
- {
- if (object == self.textLabel && [keyPath isEqualToString:@"text"]){
- if ([[change objectForKey:NSKeyValueChangeKindKey] isEqualToNumber:@(NSKeyValueChangeSetting)]){
- [self.contentView setNeedsUpdateConstraints];
- }
- }
- }
- #pragma mark - Properties
- -(UISegmentedControl *)segmentedControl
- {
- if (_segmentedControl) return _segmentedControl;
-
- _segmentedControl = [UISegmentedControl autolayoutView];
- [_segmentedControl setContentHuggingPriority:500 forAxis:UILayoutConstraintAxisHorizontal];
- return _segmentedControl;
- }
- -(UILabel *)textLabel
- {
- if (_textLabel) return _textLabel;
- _textLabel = [UILabel autolayoutView];
- [_textLabel setContentCompressionResistancePriority:500
- forAxis:UILayoutConstraintAxisHorizontal];
- return _textLabel;
- }
- #pragma mark - Action
- -(void)valueChanged
- {
- self.rowDescriptor.value = [self.rowDescriptor.selectorOptions objectAtIndex:self.segmentedControl.selectedSegmentIndex];
- }
- #pragma mark - Helper
- -(NSArray *)getItems
- {
- NSMutableArray * result = [[NSMutableArray alloc] init];
- for (id option in self.rowDescriptor.selectorOptions)
- [result addObject:[option displayText]];
- return result;
- }
- -(void)updateSegmentedControl
- {
- [self.segmentedControl removeAllSegments];
-
- [[self getItems] enumerateObjectsUsingBlock:^(id object, NSUInteger idex, __unused BOOL *stop){
- [self.segmentedControl insertSegmentWithTitle:[object displayText] atIndex:idex animated:NO];
- }];
- }
- -(NSInteger)selectedIndex
- {
- if (self.rowDescriptor.value){
- for (id option in self.rowDescriptor.selectorOptions){
- if ([[option valueData] isEqual:[self.rowDescriptor.value valueData]]){
- return [self.rowDescriptor.selectorOptions indexOfObject:option];
- }
- }
- }
- return UISegmentedControlNoSegment;
- }
- #pragma mark - Layout Constraints
- -(void)updateConstraints
- {
- if (self.dynamicCustomConstraints){
- [self.contentView removeConstraints:self.dynamicCustomConstraints];
- }
- self.dynamicCustomConstraints = [NSMutableArray array];
- NSDictionary * views = @{@"segmentedControl": self.segmentedControl, @"textLabel": self.textLabel};
- if (self.textLabel.text.length > 0){
- [self.dynamicCustomConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[textLabel]-16-[segmentedControl]-|"
- options:NSLayoutFormatAlignAllCenterY
- metrics:0
- views:views]];
- [self.dynamicCustomConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-12-[textLabel]-12-|"
- options:0
- metrics:0
- views:views]];
-
- }
- else{
- [self.dynamicCustomConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[segmentedControl]-|"
- options:NSLayoutFormatAlignAllCenterY
- metrics:0
- views:views]];
- [self.dynamicCustomConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[segmentedControl]-|"
- options:0
- metrics:0
- views:views]];
-
- }
- [self.contentView addConstraints:self.dynamicCustomConstraints];
- [super updateConstraints];
- }
- -(void)dealloc
- {
- [self.textLabel removeObserver:self forKeyPath:@"text"];
- }
- @end
|