123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- //
- // 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
|