View+MASAdditions.m 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. //
  2. // UIView+MASAdditions.m
  3. // Masonry
  4. //
  5. // Created by Jonas Budelmann on 20/07/13.
  6. // Copyright (c) 2013 cloudling. All rights reserved.
  7. //
  8. #import "View+MASAdditions.h"
  9. #import <objc/runtime.h>
  10. @implementation MAS_VIEW (MASAdditions)
  11. - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
  12. self.translatesAutoresizingMaskIntoConstraints = NO;
  13. MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
  14. block(constraintMaker);
  15. return [constraintMaker install];
  16. }
  17. - (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *))block {
  18. self.translatesAutoresizingMaskIntoConstraints = NO;
  19. MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
  20. constraintMaker.updateExisting = YES;
  21. block(constraintMaker);
  22. return [constraintMaker install];
  23. }
  24. - (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block {
  25. self.translatesAutoresizingMaskIntoConstraints = NO;
  26. MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
  27. constraintMaker.removeExisting = YES;
  28. block(constraintMaker);
  29. return [constraintMaker install];
  30. }
  31. #pragma mark - NSLayoutAttribute properties
  32. - (MASViewAttribute *)mas_left {
  33. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeft];
  34. }
  35. - (MASViewAttribute *)mas_top {
  36. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTop];
  37. }
  38. - (MASViewAttribute *)mas_right {
  39. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeRight];
  40. }
  41. - (MASViewAttribute *)mas_bottom {
  42. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBottom];
  43. }
  44. - (MASViewAttribute *)mas_leading {
  45. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeading];
  46. }
  47. - (MASViewAttribute *)mas_trailing {
  48. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTrailing];
  49. }
  50. - (MASViewAttribute *)mas_width {
  51. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeWidth];
  52. }
  53. - (MASViewAttribute *)mas_height {
  54. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeHeight];
  55. }
  56. - (MASViewAttribute *)mas_centerX {
  57. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterX];
  58. }
  59. - (MASViewAttribute *)mas_centerY {
  60. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterY];
  61. }
  62. - (MASViewAttribute *)mas_baseline {
  63. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBaseline];
  64. }
  65. - (MASViewAttribute *(^)(NSLayoutAttribute))mas_attribute
  66. {
  67. return ^(NSLayoutAttribute attr) {
  68. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:attr];
  69. };
  70. }
  71. #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
  72. - (MASViewAttribute *)mas_firstBaseline {
  73. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeFirstBaseline];
  74. }
  75. - (MASViewAttribute *)mas_lastBaseline {
  76. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLastBaseline];
  77. }
  78. #endif
  79. #if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000)
  80. - (MASViewAttribute *)mas_leftMargin {
  81. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeftMargin];
  82. }
  83. - (MASViewAttribute *)mas_rightMargin {
  84. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeRightMargin];
  85. }
  86. - (MASViewAttribute *)mas_topMargin {
  87. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTopMargin];
  88. }
  89. - (MASViewAttribute *)mas_bottomMargin {
  90. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBottomMargin];
  91. }
  92. - (MASViewAttribute *)mas_leadingMargin {
  93. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeadingMargin];
  94. }
  95. - (MASViewAttribute *)mas_trailingMargin {
  96. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTrailingMargin];
  97. }
  98. - (MASViewAttribute *)mas_centerXWithinMargins {
  99. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterXWithinMargins];
  100. }
  101. - (MASViewAttribute *)mas_centerYWithinMargins {
  102. return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterYWithinMargins];
  103. }
  104. #endif
  105. #if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 110000) || (__TV_OS_VERSION_MAX_ALLOWED >= 110000)
  106. - (MASViewAttribute *)mas_safeAreaLayoutGuide {
  107. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeBottom];
  108. }
  109. - (MASViewAttribute *)mas_safeAreaLayoutGuideTop {
  110. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeTop];
  111. }
  112. - (MASViewAttribute *)mas_safeAreaLayoutGuideBottom {
  113. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeBottom];
  114. }
  115. - (MASViewAttribute *)mas_safeAreaLayoutGuideLeft {
  116. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeLeft];
  117. }
  118. - (MASViewAttribute *)mas_safeAreaLayoutGuideRight {
  119. return [[MASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeRight];
  120. }
  121. #endif
  122. #pragma mark - associated properties
  123. - (id)mas_key {
  124. return objc_getAssociatedObject(self, @selector(mas_key));
  125. }
  126. - (void)setMas_key:(id)key {
  127. objc_setAssociatedObject(self, @selector(mas_key), key, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  128. }
  129. #pragma mark - heirachy
  130. - (instancetype)mas_closestCommonSuperview:(MAS_VIEW *)view {
  131. MAS_VIEW *closestCommonSuperview = nil;
  132. MAS_VIEW *secondViewSuperview = view;
  133. while (!closestCommonSuperview && secondViewSuperview) {
  134. MAS_VIEW *firstViewSuperview = self;
  135. while (!closestCommonSuperview && firstViewSuperview) {
  136. if (secondViewSuperview == firstViewSuperview) {
  137. closestCommonSuperview = secondViewSuperview;
  138. }
  139. firstViewSuperview = firstViewSuperview.superview;
  140. }
  141. secondViewSuperview = secondViewSuperview.superview;
  142. }
  143. return closestCommonSuperview;
  144. }
  145. @end