skip to Main Content

I have a UILabel that I am animating the constraints for so that it drop down into view. I am using layer.cornerRadius to give the view rounded corners, but for whatever reason after the animation completes the corner radius is removed.

enter image description here

[UIView animateWithDuration:0.3 delay:0 usingSpringWithDamping:0.7 initialSpringVelocity:0.4 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        
        if (shouldShow) {
            
            self.labelOverMapTopConstraint.constant = 16;
            
        } else {
            
            self.labelOverMapTopConstraint.constant = -40;
            
        }
        
        [self.view layoutIfNeeded];
        
} completion:nil];

cornerRadius is set in viewDidLoad.

Is there a way to prevent this from happening?

2

Answers


  1. You also need to set the corner radius on viewDidLayoutSubviews

    override func viewDidLayoutSubviews() {
    
        super.viewDidLayoutSubviews()
        label.layer.cornerRadius = yourValue
    }
    
    Login or Signup to reply.
  2. I suspect you’re subclassing UILabel here since it looks like you have padding in there, is that correct?

    There could be something going awry with any custom drawing/calculations you’re doing in there, so it would probably be helpful to post that code for inspection as well.

    A few questions:

    • Do you have masksToBounds set to YES?
    • If you’re not using a custom UILabel subclass, are you wrapping the label in a view?
    • How is the animation being triggered? Is it by a button? A callback from a NSURLRequest? If it’s triggered by an async callback are you jumping back on the main queue to perform the animation?
    • If the animation is triggered automatically within the lifecycle, which lifecycle method is it triggered in?

    I wasn’t able to reproduce the issue in a test project with a vanilla UILabel. I then tried it with a UILabel subclass which includes additional padding and still wasn’t able to reproduce it there.

    I’ve included example code snippets below:

    #import "ViewController.h"
    #import "R4NInsetLabel.h"
    
    @interface ViewController ()
    @property BOOL showingToast;
    @property (strong, nullable) IBOutlet R4NInsetLabel *toastLabel;
    @property (strong, nullable) IBOutlet NSLayoutConstraint *toastLabelTopConstraint;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor whiteColor]};
        self.showingToast = NO;
        // start with the label pushed off the top of the screen
        self.toastLabelTopConstraint.constant = -40.0f;
        self.toastLabel.layer.cornerRadius = 6.0f;
        self.toastLabel.layer.masksToBounds = YES;
    }
    
    - (IBAction)toggleToast:(id)sender {
        [UIView animateWithDuration:0.3 delay:0 usingSpringWithDamping:0.7 initialSpringVelocity:0.4 options:UIViewAnimationOptionCurveEaseInOut animations:^{
                if (self.showingToast == NO) {
                    self.toastLabelTopConstraint.constant = 16;
                    self.showingToast = YES;
                } else {
                    self.toastLabelTopConstraint.constant = -40;
                    self.showingToast = NO;
                }
                [self.view layoutIfNeeded];
        } completion:nil];
    }
    
    @end
    
    #import "R4NInsetLabel.h"
    
    IB_DESIGNABLE
    @interface R4NInsetLabel()
    @property IBInspectable CGFloat contentPadding;
    @property (nonatomic) UIEdgeInsets contentInsets;
    - (CGSize)_addInsetsToSize:(CGSize)size;
    @end
    
    @implementation R4NInsetLabel
    
    - (UIEdgeInsets)contentInsets {
        return UIEdgeInsetsMake(self.contentPadding, self.contentPadding, self.contentPadding, self.contentPadding);
    }
    
    - (CGSize)_addInsetsToSize:(CGSize)size {
        CGFloat width = size.width + self.contentInsets.left + self.contentInsets.right;
        CGFloat height = size.height + self.contentInsets.top + self.contentInsets.bottom;
        return CGSizeMake(width, height);
    }
    
    - (void)drawTextInRect:(CGRect)rect {
        CGRect insetRect = UIEdgeInsetsInsetRect(rect, self.contentInsets);
        [super drawTextInRect:insetRect];
    }
    
    - (CGSize)intrinsicContentSize {
        CGSize baseSize = [super intrinsicContentSize];
        return [self _addInsetsToSize:baseSize];
    }
    
    - (CGSize)sizeThatFits:(CGSize)size {
        CGSize baseSize = [super sizeThatFits:size];
        return [self _addInsetsToSize:baseSize];
    }
    
    @end
    

    And here’s what it looks like:

    Toast_Animation_With_Corner_Radius

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search