Ладно, для тех из вас, кого изумляют примитивы, как VA_ARGS ... вот кононический ответ для всех вас. Здесь я представляю категорию на CALayer
, которая принимает переменную длину «список» CAConstraintAttribute
(s) и применяет их к слою
@interface CALayer (VariadicConstraints)
- (void)addConstraintsRelSuper:(CAConstraintAttribute)first,...;
/* REQUIRES NSNotFound termination */
@end
@implementation CALayer (VariadicConstraints)
- (void)addConstraintsRelSuper:(CAConstraintAttribute)first,...{ /* REQUIRES NSNotFound termination */
va_list args; va_start(args, first);
for (NSUInteger arg = first; arg != NSNotFound;
arg = va_arg( args, NSUInteger))
{ [self addConstraint:CAConstRelSuper(arg)]; }
va_end(args);
}
@end
Теперь добавление ограничений слоя упрощено до ...
[layer addConstraintsRelSuper:kCAConstraintMaxX, kCAConstraintHeight, NSNotFound];
NSLOG layer.constraints ➞ "[MaxX = superlayer.MaxX]",
"[Высота = суперслой. Высота]"
... из того, что раньше было бы сотнями персонажей.
И ради полноты .. вот мой Макрос для CAConstRelSuper
...
#define CAConstRelSuper(attr) [CAConstraint constraintWithAttribute: \
attr relativeTo:@"superlayer" attribute:attr]