NSLayoutConstraint+MASDebugAdditions.m 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. //
  2. // NSLayoutConstraint+MASDebugAdditions.m
  3. // Masonry
  4. //
  5. // Created by Jonas Budelmann on 3/08/13.
  6. // Copyright (c) 2013 Jonas Budelmann. All rights reserved.
  7. //
  8. #import "NSLayoutConstraint+MASDebugAdditions.h"
  9. #import "MASConstraint.h"
  10. #import "MASLayoutConstraint.h"
  11. @implementation NSLayoutConstraint (MASDebugAdditions)
  12. #pragma mark - description maps
  13. + (NSDictionary *)layoutRelationDescriptionsByValue {
  14. static dispatch_once_t once;
  15. static NSDictionary *descriptionMap;
  16. dispatch_once(&once, ^{
  17. descriptionMap = @{
  18. @(NSLayoutRelationEqual) : @"==",
  19. @(NSLayoutRelationGreaterThanOrEqual) : @">=",
  20. @(NSLayoutRelationLessThanOrEqual) : @"<=",
  21. };
  22. });
  23. return descriptionMap;
  24. }
  25. + (NSDictionary *)layoutAttributeDescriptionsByValue {
  26. static dispatch_once_t once;
  27. static NSDictionary *descriptionMap;
  28. dispatch_once(&once, ^{
  29. descriptionMap = @{
  30. @(NSLayoutAttributeTop) : @"top",
  31. @(NSLayoutAttributeLeft) : @"left",
  32. @(NSLayoutAttributeBottom) : @"bottom",
  33. @(NSLayoutAttributeRight) : @"right",
  34. @(NSLayoutAttributeLeading) : @"leading",
  35. @(NSLayoutAttributeTrailing) : @"trailing",
  36. @(NSLayoutAttributeWidth) : @"width",
  37. @(NSLayoutAttributeHeight) : @"height",
  38. @(NSLayoutAttributeCenterX) : @"centerX",
  39. @(NSLayoutAttributeCenterY) : @"centerY",
  40. @(NSLayoutAttributeBaseline) : @"baseline",
  41. #if TARGET_OS_IPHONE
  42. @(NSLayoutAttributeLeftMargin) : @"leftMargin",
  43. @(NSLayoutAttributeRightMargin) : @"rightMargin",
  44. @(NSLayoutAttributeTopMargin) : @"topMargin",
  45. @(NSLayoutAttributeBottomMargin) : @"bottomMargin",
  46. @(NSLayoutAttributeLeadingMargin) : @"leadingMargin",
  47. @(NSLayoutAttributeTrailingMargin) : @"trailingMargin",
  48. @(NSLayoutAttributeCenterXWithinMargins) : @"centerXWithinMargins",
  49. @(NSLayoutAttributeCenterYWithinMargins) : @"centerYWithinMargins",
  50. #endif
  51. };
  52. });
  53. return descriptionMap;
  54. }
  55. + (NSDictionary *)layoutPriorityDescriptionsByValue {
  56. static dispatch_once_t once;
  57. static NSDictionary *descriptionMap;
  58. dispatch_once(&once, ^{
  59. #if TARGET_OS_IPHONE
  60. descriptionMap = @{
  61. @(MASLayoutPriorityDefaultHigh) : @"high",
  62. @(MASLayoutPriorityDefaultLow) : @"low",
  63. @(MASLayoutPriorityDefaultMedium) : @"medium",
  64. @(MASLayoutPriorityRequired) : @"required",
  65. @(MASLayoutPriorityFittingSizeLevel) : @"fitting size",
  66. };
  67. #elif TARGET_OS_MAC
  68. descriptionMap = @{
  69. @(MASLayoutPriorityDefaultHigh) : @"high",
  70. @(MASLayoutPriorityDragThatCanResizeWindow) : @"drag can resize window",
  71. @(MASLayoutPriorityDefaultMedium) : @"medium",
  72. @(MASLayoutPriorityWindowSizeStayPut) : @"window size stay put",
  73. @(MASLayoutPriorityDragThatCannotResizeWindow) : @"drag cannot resize window",
  74. @(MASLayoutPriorityDefaultLow) : @"low",
  75. @(MASLayoutPriorityFittingSizeCompression) : @"fitting size",
  76. @(MASLayoutPriorityRequired) : @"required",
  77. };
  78. #endif
  79. });
  80. return descriptionMap;
  81. }
  82. #pragma mark - description override
  83. + (NSString *)descriptionForObject:(id)obj {
  84. if ([obj respondsToSelector:@selector(mas_key)] && [obj mas_key]) {
  85. return [NSString stringWithFormat:@"%@:%@", [obj class], [obj mas_key]];
  86. }
  87. return [NSString stringWithFormat:@"%@:%p", [obj class], obj];
  88. }
  89. - (NSString *)description {
  90. NSMutableString *description = [[NSMutableString alloc] initWithString:@"<"];
  91. [description appendString:[self.class descriptionForObject:self]];
  92. [description appendFormat:@" %@", [self.class descriptionForObject:self.firstItem]];
  93. if (self.firstAttribute != NSLayoutAttributeNotAnAttribute) {
  94. [description appendFormat:@".%@", [self.class.layoutAttributeDescriptionsByValue objectForKey:@(self.firstAttribute)]];
  95. }
  96. [description appendFormat:@" %@", [self.class.layoutRelationDescriptionsByValue objectForKey:@(self.relation)]];
  97. if (self.secondItem) {
  98. [description appendFormat:@" %@", [self.class descriptionForObject:self.secondItem]];
  99. }
  100. if (self.secondAttribute != NSLayoutAttributeNotAnAttribute) {
  101. [description appendFormat:@".%@", [self.class.layoutAttributeDescriptionsByValue objectForKey:@(self.secondAttribute)]];
  102. }
  103. if (self.multiplier != 1) {
  104. [description appendFormat:@" * %g", self.multiplier];
  105. }
  106. if (self.secondAttribute == NSLayoutAttributeNotAnAttribute) {
  107. [description appendFormat:@" %g", self.constant];
  108. } else {
  109. if (self.constant) {
  110. [description appendFormat:@" %@ %g", (self.constant < 0 ? @"-" : @"+"), ABS(self.constant)];
  111. }
  112. }
  113. if (self.priority != MASLayoutPriorityRequired) {
  114. [description appendFormat:@" ^%@", [self.class.layoutPriorityDescriptionsByValue objectForKey:@(self.priority)] ?: [NSNumber numberWithDouble:self.priority]];
  115. }
  116. [description appendString:@">"];
  117. return description;
  118. }
  119. @end