首页 文章

cornerRadius上的CGAffineTransformMakeScale动画舍入了UIButton

提问于
浏览
5

我正在舍入一个UIBUtton,这很好(自我是一个uibutton子类):

self.layer.cornerRadius = self.frame.size.width/2;
self.layer.masksToBounds = YES;
self.clipsToBounds = YES;

但我也试图动画按钮缩小比例然后返回到原始大小,如下所示:

[UIView animateWithDuration:0.1 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
    self.layer.affineTransform = CGAffineTransformMakeScale(0.0f, 0.0f);
} completion:^(BOOL finished) {
    [UIView animateWithDuration:0.1 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        self.layer.affineTransform = CGAffineTransformMakeScale(1.0f, 1.0f);
    } completion:nil];
}];

收缩/恢复动画应该发生 . 然而,之后我失去了角落半径,按钮又回到了正方形 . 如何在保持圆形按钮的同时动画和更改变换比例?

我也试过以下 . 它会在动画结束时将按钮恢复为圆形状态,但是在动画开始时它会回到正方形并且它看起来非常糟糕:

[UIView animateWithDuration:0.1 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
    self.layer.affineTransform = CGAffineTransformMakeScale(0.0f, 0.0f);
    self.layer.cornerRadius = 0.0f;
    self.layer.masksToBounds = YES;
    self.clipsToBounds = YES;
} completion:^(BOOL finished) {
    [UIView animateWithDuration:0.1 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        self.layer.affineTransform = CGAffineTransformMakeScale(1.0f, 1.0f);
        self.layer.cornerRadius = self.frame.size.width/2;
        self.layer.masksToBounds = YES;
        self.clipsToBounds = YES;
    } completion:nil];
}];

编辑:我需要动画代码和舍入按钮代码,所有发生在子类按钮 . 当触摸按钮时,它需要在按钮类内部发生(即,没有用于舍入按钮或调用动画的代码可以在视图控制器中) .

用澄清的解决方案编辑:我不知道为什么会这样,但以下建议的一部分似乎解决了这个问题 . 我将动画方法添加为UIControlEventTouchDown的自定义按钮上的动作 . 我删除了控件事件操作,而是从子类化按钮类中的 - (void)touchesBegan ....调用动画方法,一切似乎都正常 . 不知道为什么会这样 . 如果有人知道为什么会这样,那么会喜欢在评论或其他内容中进一步澄清/解释 . 再次感谢@Shan的帮助

2 回答

  • 4

    尝试将动画部分放在控制器类中而不是在子类按钮类中 .

    //in customButton.h file
    
     #import <UIKit/UIKit.h>
    
     @interface customButton : UIButton
    
     - (id)initWithFrameOfCustomButton:(CGRect)frame;
     - (void)animate;//this method u need to add and call it from the controller
    @end
    
    
    
    
     //in the subclassed UIButtin class
     //in customButton.m file
    
    
     #import "customButton.h"
     #import <QuartzCore/QuartzCore.h>
    
     @implementation customButton
    
     - (id)initWithFrame:(CGRect)frame
     {
        self = [super initWithFrame:frame];
        if (self) {
         // Initialization code
    
        }
          return self;
     }
    
     - (id)initWithFrameOfCustomButton:(CGRect)frame
      {
        self = [super initWithFrame:frame];
        if(self)
        {
         //hear only set the frame only not incude animation part
         //this is the custom initiliser that initilises the custom button with the given frame and also make it to round
         self.frame = frame;
         self.backgroundColor = [UIColor greenColor];
         self.layer.cornerRadius = frame.size.width/2;
         self.layer.masksToBounds = YES;
        }
         return self;
      }
    
      //add the animation part
     - (void)animate //this method is called within the this class
     {
    
        [UIView animateWithDuration:0.1 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
         self.layer.affineTransform = CGAffineTransformMakeScale(0.0f, 0.0f);
       //edit: comment below lines becz u already made it to round
       //  self.layer.cornerRadius = 0.0f;
       //  self.layer.masksToBounds = YES;
       //  self.clipsToBounds = YES;
    
         //        CATransform3D t = CATransform3DIdentity;
         //        t = CATransform3DMakeScale(0 , 0, 1.0f);
         //        cButton.layer.transform = t;
     } completion:^(BOOL finished) {
         [UIView animateWithDuration:0.1 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            self.layer.affineTransform = CGAffineTransformMakeScale(1.0f, 1.0f);
          //  edit comment below lines  
          //  self.layer.cornerRadius = self.frame.size.width/2;
          //  self.layer.masksToBounds = YES;
          //  self.clipsToBounds = YES;
            //            CATransform3D t = CATransform3DIdentity;
            //            t = CATransform3DMakeScale(1 , 1, 1.0f);
            //            cButton.layer.transform = t;
         } completion:nil];
       }];
    
      }
    
       //implement touch handling methods to call animation 
     - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
      {
         [self animate];
      }
    
      - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
      {
         [self animate];
      }
    
     - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
     {
        // [self animate]; 
     }
    
     - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
     {
        // [self animate];
     }
    

    在控制器类中包括如下的动画部分

    //in the view controller that u are using this custom button 
    
      #import "FirstViewController.h"
      #import "CustomCell.h"
      #import "customButton.h" 
      #import <QuartzCore/QuartzCore.h>
    
      @interface FirstViewController ()
      @end
    
      @implementation FirstViewController
    
      - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
     {
          self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
          if (self) {
           // Custom initialization
          }
         return self;
     }
    
     - (void)viewDidLoad
      {
          [super viewDidLoad];
          // Do any additional setup after loading the view from its nib.
          customButton *cButton = [[customButton alloc]initWithFrameOfCustomButton:CGRectMake(20, 30, 100, 100)]; //hear i am initilising the custom button
          cButton.tag = 100;//assigning tag to access during the animation
          [self.view addSubview:cButton];
         // [self makeAnimation];//i am animation rite after it loads the all views u can place this method call where ever u want 
        //edit: i am commenting the this line so animations of the button in this class won't call
       }
    
    //edit below method is added 
     - (void)viewDidAppear:(BOOL)animated 
     {
         customButton *cButton = (customButton *)[self.view viewWithTag:100];
         //edit->comment this line so that u never call the animation from view controller
        // [cButton animate];//animating the button the code in the subclassed method is called
     }
    
    
    
     - (void)makeAnimation 
     {
          customButton *cButton = (customButton *)[self.view viewWithTag:100];//get the custom button by using the tag 
    
          [UIView animateWithDuration:0.1 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        cButton.layer.affineTransform = CGAffineTransformMakeScale(0.0f, 0.0f);
       // cButton.layer.cornerRadius = 0.0f;
       // cButton.layer.masksToBounds = YES;
       // cButton.clipsToBounds = YES;
    
     //        CATransform3D t = CATransform3DIdentity;
     //        t = CATransform3DMakeScale(0 , 0, 1.0f);
     //        cButton.layer.transform = t;
      } completion:^(BOOL finished) {
            [UIView animateWithDuration:0.1 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            cButton.layer.affineTransform = CGAffineTransformMakeScale(1.0f, 1.0f);
         //   cButton.layer.cornerRadius = cButton.frame.size.width/2;
         //   cButton.layer.masksToBounds = YES;
         //   cButton.clipsToBounds = YES;
     //            CATransform3D t = CATransform3DIdentity;
     //            t = CATransform3DMakeScale(1 , 1, 1.0f);
     //            cButton.layer.transform = t;
            } completion:nil];
       }];
    
    
     }
    

    注意UIButton继承自:UIControl - > UIView - > UIResponder - > NSObject如果您想要使用UIControlers即响应者,请查看文档,然后您需要实现这些方法,您可以获得您想要的事件,

    在您的子类UIButton类中,通过注释触摸处理方法来实现它

    - (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
        {
          return YES;
        }
    
      - (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
        {
    
        }
    
     - (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
       {
    
         return YES;
       }
    
  • 1

    类似于Shankar BS的答案,但使用swift 3.使用反弹动画进行转换:

    myButton.layer.setAffineTransform(CGAffineTransform(scaleX: 0.0, y: 0.0))
    
                UIView.animate(withDuration: 0.7, delay: 1.0,
                                usingSpringWithDamping: 0.7, initialSpringVelocity: 7.0, options: [],
                                animations:  {
                                myButton.layer.setAffineTransform(CGAffineTransform(scaleX: 1.0, y: 1.0))
                },
                               completion: nil
                )
    

相关问题