element-ios/Riot/Views/TableViewCell/TableViewCellWithCheckBoxes.m
Giom Foret 98d2cb21d4 Dark Theme
fix App freeze when user changes the theme
2017-08-11 17:41:22 +02:00

313 lines
15 KiB
Objective-C

/*
Copyright 2016 OpenMarket Ltd
Copyright 2017 Vector Creations Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#import "TableViewCellWithCheckBoxes.h"
// The space between 2 check boxes
#define TABLEVIEWCELLWITHCHECKBOXES_MARGIN 8
@interface TableViewCellWithCheckBoxes ()
{
NSMutableArray *checkBoxesArray;
NSMutableArray *labelArray;
}
@end
@implementation TableViewCellWithCheckBoxes
- (void)setCheckBoxesNumber:(NSUInteger)checkBoxesNumber
{
if (_checkBoxesNumber == checkBoxesNumber)
{
return;
}
// Remove existing items
NSArray *subviews = self.mainContainer.subviews;
for (UIView *view in subviews)
{
[view removeFromSuperview];
}
_checkBoxesNumber = checkBoxesNumber;
if (!_checkBoxesNumber)
{
// Nothing to do
return;
}
checkBoxesArray = [NSMutableArray arrayWithCapacity:checkBoxesNumber];
labelArray = [NSMutableArray arrayWithCapacity:checkBoxesNumber];
CGFloat containerWidth = (self.mainContainer.frame.size.width - ((checkBoxesNumber - 1.0) * TABLEVIEWCELLWITHCHECKBOXES_MARGIN)) / checkBoxesNumber;
UIView *previousContainer = nil;
NSLayoutConstraint *topConstraint, *leftConstraint, *bottomConstraint;
NSLayoutConstraint *widthConstraint, *heightConstraint, *centerYConstraint, *centerXConstraint;
for (NSInteger index = 0; index < checkBoxesNumber; index++)
{
UIView *checkboxContainer = [[UIView alloc] initWithFrame:CGRectMake(index * (containerWidth + TABLEVIEWCELLWITHCHECKBOXES_MARGIN), 0, containerWidth, self.mainContainer.frame.size.height)];
checkboxContainer.backgroundColor = [UIColor clearColor];
[self.mainContainer addSubview:checkboxContainer];
// Add container constraints
checkboxContainer.translatesAutoresizingMaskIntoConstraints = NO;
if (!previousContainer)
{
leftConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:self.mainContainer
attribute:NSLayoutAttributeLeading
multiplier:1
constant:0];
widthConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.mainContainer
attribute:NSLayoutAttributeWidth
multiplier:(1.0 / checkBoxesNumber)
constant:(- ((checkBoxesNumber - 1.0) * TABLEVIEWCELLWITHCHECKBOXES_MARGIN) / checkBoxesNumber)];
}
else
{
leftConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:previousContainer
attribute:NSLayoutAttributeTrailing
multiplier:1
constant:TABLEVIEWCELLWITHCHECKBOXES_MARGIN];
widthConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:previousContainer
attribute:NSLayoutAttributeWidth
multiplier:1
constant:0];
}
topConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.mainContainer
attribute:NSLayoutAttributeTop
multiplier:1
constant:0];
bottomConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.mainContainer
attribute:NSLayoutAttributeBottom
multiplier:1
constant:0];
[NSLayoutConstraint activateConstraints:@[leftConstraint, widthConstraint, topConstraint, bottomConstraint]];
previousContainer = checkboxContainer;
// Add Checkbox and Label
UIImageView *checkbox = [[UIImageView alloc] initWithFrame:CGRectMake(14, 11, 22, 22)];
checkbox.translatesAutoresizingMaskIntoConstraints = NO;
[checkboxContainer addSubview:checkbox];
// Store the new check box unselected by default
checkbox.image = [UIImage imageNamed:@"selection_untick"];
checkbox.tag = 0;
[checkBoxesArray addObject:checkbox];
UILabel *theLabel = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, containerWidth - 60, 31)];
theLabel.translatesAutoresizingMaskIntoConstraints = NO;
[checkboxContainer addSubview:theLabel];
[labelArray addObject:theLabel];
UIView *checkboxMask = [[UIView alloc] initWithFrame:CGRectMake(7, 4, 36, 36)];
checkboxMask.translatesAutoresizingMaskIntoConstraints = NO;
[checkboxContainer addSubview:checkboxMask];
// Listen to check box tap
checkboxMask.tag = index;
checkboxMask.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onCheckBoxTap:)];
[tapGesture setNumberOfTouchesRequired:1];
[tapGesture setNumberOfTapsRequired:1];
[tapGesture setDelegate:self];
[checkboxMask addGestureRecognizer:tapGesture];
// Add switch constraints
leftConstraint = [NSLayoutConstraint constraintWithItem:checkbox
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:checkboxContainer
attribute:NSLayoutAttributeLeading
multiplier:1
constant:14];
widthConstraint = [NSLayoutConstraint constraintWithItem:checkbox
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:22];
centerYConstraint = [NSLayoutConstraint constraintWithItem:checkbox
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:checkboxContainer
attribute:NSLayoutAttributeCenterY
multiplier:1
constant:0.0f];
[NSLayoutConstraint activateConstraints:@[leftConstraint, widthConstraint, centerYConstraint]];
// Add Label constraints
topConstraint = [NSLayoutConstraint constraintWithItem:theLabel
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:checkboxContainer
attribute:NSLayoutAttributeTop
multiplier:1
constant:0];
leftConstraint = [NSLayoutConstraint constraintWithItem:theLabel
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:checkbox
attribute:NSLayoutAttributeTrailing
multiplier:1
constant:9];
centerYConstraint = [NSLayoutConstraint constraintWithItem:theLabel
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:checkboxContainer
attribute:NSLayoutAttributeCenterY
multiplier:1
constant:0.0f];
[NSLayoutConstraint activateConstraints:@[topConstraint, leftConstraint, centerYConstraint]];
// Add check box mask constraints
widthConstraint = [NSLayoutConstraint constraintWithItem:checkboxMask
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:36];
heightConstraint = [NSLayoutConstraint constraintWithItem:checkboxMask
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:36];
centerXConstraint = [NSLayoutConstraint constraintWithItem:checkboxMask
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:checkbox
attribute:NSLayoutAttributeCenterX
multiplier:1
constant:0.0f];
centerYConstraint = [NSLayoutConstraint constraintWithItem:checkboxMask
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:checkbox
attribute:NSLayoutAttributeCenterY
multiplier:1
constant:0.0f];
[NSLayoutConstraint activateConstraints:@[widthConstraint, heightConstraint, centerXConstraint, centerYConstraint]];
}
}
- (NSArray*)checkBoxes
{
return [NSArray arrayWithArray:checkBoxesArray];
}
- (NSArray*)labels
{
return [NSArray arrayWithArray:labelArray];
}
- (void)setCheckBoxValue:(BOOL)isSelected atIndex:(NSUInteger)index
{
if (index < checkBoxesArray.count)
{
UIImageView *checkBox = checkBoxesArray[index];
if (isSelected && !checkBox.tag)
{
checkBox.image = [UIImage imageNamed:@"selection_tick"];
checkBox.tag = 1;
if (!self.allowsMultipleSelection)
{
// Unselect others check boxes
for (NSUInteger k = 0; k < checkBoxesArray.count; k++)
{
if (k != index)
{
checkBox = checkBoxesArray[k];
if (checkBox.tag)
{
checkBox.image = [UIImage imageNamed:@"selection_untick"];
checkBox.tag = 0;
}
}
}
}
}
else if (!isSelected && checkBox.tag)
{
checkBox.image = [UIImage imageNamed:@"selection_untick"];
checkBox.tag = 0;
}
}
}
- (BOOL)checkBoxValueAtIndex:(NSUInteger)index
{
if (index < checkBoxesArray.count)
{
UIImageView *checkBox = checkBoxesArray[index];
return ((BOOL)checkBox.tag);
}
return NO;
}
#pragma mark - Action
- (IBAction)onCheckBoxTap:(UITapGestureRecognizer*)sender
{
if (_delegate)
{
[_delegate tableViewCellWithCheckBoxes:self didTapOnCheckBoxAtIndex:sender.view.tag];
}
}
@end