123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- //
- // UIView+MASAdditions.m
- // Masonry
- //
- // Created by Jonas Budelmann on 20/07/13.
- // Copyright (c) 2013 cloudling. All rights reserved.
- //
- #import "View+MASAdditions.h"
- #import <objc/runtime.h>
- @implementation MAS_VIEW (MASAdditions)
- - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
- self.translatesAutoresizingMaskIntoConstraints = NO;
- MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
- block(constraintMaker);
- return [constraintMaker install];
- }
- - (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *))block {
- self.translatesAutoresizingMaskIntoConstraints = NO;
- MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
- constraintMaker.updateExisting = YES;
- block(constraintMaker);
- return [constraintMaker install];
- }
- - (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block {
- self.translatesAutoresizingMaskIntoConstraints = NO;
- MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
- constraintMaker.removeExisting = YES;
- block(constraintMaker);
- return [constraintMaker install];
- }
- #pragma mark - NSLayoutAttribute properties
- - (MASViewAttribute *)mas_left {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeft];
- }
- - (MASViewAttribute *)mas_top {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTop];
- }
- - (MASViewAttribute *)mas_right {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeRight];
- }
- - (MASViewAttribute *)mas_bottom {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBottom];
- }
- - (MASViewAttribute *)mas_leading {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeading];
- }
- - (MASViewAttribute *)mas_trailing {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTrailing];
- }
- - (MASViewAttribute *)mas_width {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeWidth];
- }
- - (MASViewAttribute *)mas_height {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeHeight];
- }
- - (MASViewAttribute *)mas_centerX {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterX];
- }
- - (MASViewAttribute *)mas_centerY {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterY];
- }
- - (MASViewAttribute *)mas_baseline {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBaseline];
- }
- - (MASViewAttribute *(^)(NSLayoutAttribute))mas_attribute
- {
- return ^(NSLayoutAttribute attr) {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:attr];
- };
- }
- #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
- - (MASViewAttribute *)mas_firstBaseline {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeFirstBaseline];
- }
- - (MASViewAttribute *)mas_lastBaseline {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLastBaseline];
- }
- #endif
- #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000)
- - (MASViewAttribute *)mas_leftMargin {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeftMargin];
- }
- - (MASViewAttribute *)mas_rightMargin {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeRightMargin];
- }
- - (MASViewAttribute *)mas_topMargin {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTopMargin];
- }
- - (MASViewAttribute *)mas_bottomMargin {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBottomMargin];
- }
- - (MASViewAttribute *)mas_leadingMargin {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeadingMargin];
- }
- - (MASViewAttribute *)mas_trailingMargin {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTrailingMargin];
- }
- - (MASViewAttribute *)mas_centerXWithinMargins {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterXWithinMargins];
- }
- - (MASViewAttribute *)mas_centerYWithinMargins {
- return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterYWithinMargins];
- }
- #endif
- #if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 110000) || (__TV_OS_VERSION_MAX_ALLOWED >= 110000)
- - (MASViewAttribute *)mas_safeAreaLayoutGuide {
- return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeBottom];
- }
- - (MASViewAttribute *)mas_safeAreaLayoutGuideTop {
- return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeTop];
- }
- - (MASViewAttribute *)mas_safeAreaLayoutGuideBottom {
- return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeBottom];
- }
- - (MASViewAttribute *)mas_safeAreaLayoutGuideLeft {
- return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeLeft];
- }
- - (MASViewAttribute *)mas_safeAreaLayoutGuideRight {
- return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeRight];
- }
- #endif
- #pragma mark - associated properties
- - (id)mas_key {
- return objc_getAssociatedObject(self, @selector(mas_key));
- }
- - (void)setMas_key:(id)key {
- objc_setAssociatedObject(self, @selector(mas_key), key, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- }
- #pragma mark - heirachy
- - (instancetype)mas_closestCommonSuperview:(MAS_VIEW *)view {
- MAS_VIEW *closestCommonSuperview = nil;
- MAS_VIEW *secondViewSuperview = view;
- while (!closestCommonSuperview && secondViewSuperview) {
- MAS_VIEW *firstViewSuperview = self;
- while (!closestCommonSuperview && firstViewSuperview) {
- if (secondViewSuperview == firstViewSuperview) {
- closestCommonSuperview = secondViewSuperview;
- }
- firstViewSuperview = firstViewSuperview.superview;
- }
- secondViewSuperview = secondViewSuperview.superview;
- }
- return closestCommonSuperview;
- }
- @end
|