//
|
// NSArray+MASAdditions.m
|
//
|
//
|
// Created by Daniel Hammond on 11/26/13.
|
//
|
//
|
|
#import "NSArray+MASAdditions.h"
|
#import "View+MASAdditions.h"
|
|
@implementation NSArray (MASAdditions)
|
|
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block {
|
NSMutableArray *constraints = [NSMutableArray array];
|
for (MAS_VIEW *view in self) {
|
NSAssert([view isKindOfClass:[MAS_VIEW class]], @"All objects in the array must be views");
|
[constraints addObjectsFromArray:[view mas_makeConstraints:block]];
|
}
|
return constraints;
|
}
|
|
- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))block {
|
NSMutableArray *constraints = [NSMutableArray array];
|
for (MAS_VIEW *view in self) {
|
NSAssert([view isKindOfClass:[MAS_VIEW class]], @"All objects in the array must be views");
|
[constraints addObjectsFromArray:[view mas_updateConstraints:block]];
|
}
|
return constraints;
|
}
|
|
- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block {
|
NSMutableArray *constraints = [NSMutableArray array];
|
for (MAS_VIEW *view in self) {
|
NSAssert([view isKindOfClass:[MAS_VIEW class]], @"All objects in the array must be views");
|
[constraints addObjectsFromArray:[view mas_remakeConstraints:block]];
|
}
|
return constraints;
|
}
|
|
- (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType withFixedSpacing:(CGFloat)fixedSpacing leadSpacing:(CGFloat)leadSpacing tailSpacing:(CGFloat)tailSpacing {
|
if (self.count < 2) {
|
NSAssert(self.count>1,@"views to distribute need to bigger than one");
|
return;
|
}
|
|
MAS_VIEW *tempSuperView = [self mas_commonSuperviewOfViews];
|
if (axisType == MASAxisTypeHorizontal) {
|
MAS_VIEW *prev;
|
for (int i = 0; i < self.count; i++) {
|
MAS_VIEW *v = self[i];
|
[v mas_makeConstraints:^(MASConstraintMaker *make) {
|
if (prev) {
|
make.width.equalTo(prev);
|
make.left.equalTo(prev.mas_right).offset(fixedSpacing);
|
if (i == self.count - 1) {//last one
|
make.right.equalTo(tempSuperView).offset(-tailSpacing);
|
}
|
}
|
else {//first one
|
make.left.equalTo(tempSuperView).offset(leadSpacing);
|
}
|
|
}];
|
prev = v;
|
}
|
}
|
else {
|
MAS_VIEW *prev;
|
for (int i = 0; i < self.count; i++) {
|
MAS_VIEW *v = self[i];
|
[v mas_makeConstraints:^(MASConstraintMaker *make) {
|
if (prev) {
|
make.height.equalTo(prev);
|
make.top.equalTo(prev.mas_bottom).offset(fixedSpacing);
|
if (i == self.count - 1) {//last one
|
make.bottom.equalTo(tempSuperView).offset(-tailSpacing);
|
}
|
}
|
else {//first one
|
make.top.equalTo(tempSuperView).offset(leadSpacing);
|
}
|
|
}];
|
prev = v;
|
}
|
}
|
}
|
|
- (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType withFixedItemLength:(CGFloat)fixedItemLength leadSpacing:(CGFloat)leadSpacing tailSpacing:(CGFloat)tailSpacing {
|
if (self.count < 2) {
|
NSAssert(self.count>1,@"views to distribute need to bigger than one");
|
return;
|
}
|
|
MAS_VIEW *tempSuperView = [self mas_commonSuperviewOfViews];
|
if (axisType == MASAxisTypeHorizontal) {
|
MAS_VIEW *prev;
|
for (int i = 0; i < self.count; i++) {
|
MAS_VIEW *v = self[i];
|
[v mas_makeConstraints:^(MASConstraintMaker *make) {
|
make.width.equalTo(@(fixedItemLength));
|
if (prev) {
|
if (i == self.count - 1) {//last one
|
make.right.equalTo(tempSuperView).offset(-tailSpacing);
|
}
|
else {
|
CGFloat offset = (1-(i/((CGFloat)self.count-1)))*(fixedItemLength+leadSpacing)-i*tailSpacing/(((CGFloat)self.count-1));
|
make.right.equalTo(tempSuperView).multipliedBy(i/((CGFloat)self.count-1)).with.offset(offset);
|
}
|
}
|
else {//first one
|
make.left.equalTo(tempSuperView).offset(leadSpacing);
|
}
|
}];
|
prev = v;
|
}
|
}
|
else {
|
MAS_VIEW *prev;
|
for (int i = 0; i < self.count; i++) {
|
MAS_VIEW *v = self[i];
|
[v mas_makeConstraints:^(MASConstraintMaker *make) {
|
make.height.equalTo(@(fixedItemLength));
|
if (prev) {
|
if (i == self.count - 1) {//last one
|
make.bottom.equalTo(tempSuperView).offset(-tailSpacing);
|
}
|
else {
|
CGFloat offset = (1-(i/((CGFloat)self.count-1)))*(fixedItemLength+leadSpacing)-i*tailSpacing/(((CGFloat)self.count-1));
|
make.bottom.equalTo(tempSuperView).multipliedBy(i/((CGFloat)self.count-1)).with.offset(offset);
|
}
|
}
|
else {//first one
|
make.top.equalTo(tempSuperView).offset(leadSpacing);
|
}
|
}];
|
prev = v;
|
}
|
}
|
}
|
|
- (MAS_VIEW *)mas_commonSuperviewOfViews
|
{
|
MAS_VIEW *commonSuperview = nil;
|
MAS_VIEW *previousView = nil;
|
for (id object in self) {
|
if ([object isKindOfClass:[MAS_VIEW class]]) {
|
MAS_VIEW *view = (MAS_VIEW *)object;
|
if (previousView) {
|
commonSuperview = [view mas_closestCommonSuperview:commonSuperview];
|
} else {
|
commonSuperview = view;
|
}
|
previousView = view;
|
}
|
}
|
NSAssert(commonSuperview, @"Can't constrain views that do not share a common superview. Make sure that all the views in this array have been added into the same view hierarchy.");
|
return commonSuperview;
|
}
|
|
@end
|