UIView-NibLoading
UIView-NibLoading copied to clipboard
Constraint IBOutlets
If view class object contains autolayout constraint IBOutlets, they will be set to nil after ARC deallocs nib and initial container view. Quick fix will be something like this:
NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:firstItem attribute:constraint.firstAttribute relatedBy:constraint.relation toItem:secondItem attribute:constraint.secondAttribute multiplier:constraint.multiplier constant:constraint.constant];
[self addConstraint:newConstraint];
// Reconnect outlets
@autoreleasepool
{
unsigned int numberOfProperties = 0;
objc_property_t *propertyArray = class_copyPropertyList([self class], &numberOfProperties);
for (NSUInteger i = 0; i < numberOfProperties; i++)
{
objc_property_t property = propertyArray[i];
NSString *name = [[NSString alloc] initWithUTF8String:property_getName(property)];
id value = [self valueForKey:name];
if (value == constraint)
[self setValue:newConstraint forKey:name];
}
free(propertyArray);
}
I'm not entirely sure, but hasn't #2 already solved the problem with autolayout in the container ?
Hi, I did face the same issue regarding "constraint IBOutlets" today. The solution provided by Codewaves works well. I forked your repository to add the code snipped together with an example view. Are you interested??
Maybe. Given #2, constraints should be ported to the new view. Why/when doesn't it work?
Yes, the constraints are ported by making a hard copy! If I have a IBOutlet for a constraint (not view) defined then this outlet points to the original constraint. The suggested code above reconnects the defined outlet to the copy of the original constraint.
I use IBOutlet for a constraint to modify its constant property at runtime (or design time). See my example here.
Oh, OK. I'd like a solution that doesn't use the objc runtime, will look into it tomorrow. Thanks for the sample code.
@meknil See pull request #9. I’d like your feedback on this, as I’m probably not going to use it anytime soon.
Thanks again for the example. I hadn’t had the opportunity to try IB_DESIGNABLE
and IBInspectable
, it makes NibLoadedView all the more interesting.