mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-18 07:28:28 +02:00
Organize views by feature
This commit is contained in:
313
Riot/Modules/Room/Settings/Views/TableViewCellWithCheckBoxes.m
Normal file
313
Riot/Modules/Room/Settings/Views/TableViewCellWithCheckBoxes.m
Normal file
@@ -0,0 +1,313 @@
|
||||
/*
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user