【问题标题】:UICollectionViewCell ShakeUICollectionViewCell 摇一摇
【发布时间】:2012-12-11 03:02:48
【问题描述】:

我创建了一个 UICollectionView 并希望所有单元格都像 iPhone 上跳板的编辑模式一样抖动。我已经创建了我的抖动代码,但不知道如何实现它。我有自定义单元格,所以我假设它在那里,但不知道它是如何实现的。谢谢。

#define degreesToRadians(x) (M_PI * (x) / 180.0)
#define kAnimationRotateDeg 0.5
#define kAnimationTranslateX 1.0
#define kAnimationTranslateY 1.0

//startJiggling

int count = 1;
CGAffineTransform leftWobble = CGAffineTransformMakeRotation(degreesToRadians( kAnimationRotateDeg * (count%2 ? +1 : -1 ) ));
CGAffineTransform rightWobble = CGAffineTransformMakeRotation(degreesToRadians( kAnimationRotateDeg * (count%2 ? -1 : +1 ) ));
CGAffineTransform moveTransform = CGAffineTransformTranslate(rightWobble, -kAnimationTranslateX, -kAnimationTranslateY);
CGAffineTransform conCatTransform = CGAffineTransformConcat(rightWobble, moveTransform);

    self.transform = leftWobble;  // starting point

    [UIView animateWithDuration:0.1
                          delay:(count * 0.08)
                        options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse
                     animations:^{ self.transform = conCatTransform; }
                     completion:nil];

【问题讨论】:

    标签: iphone ios ios6 uicollectionview


    【解决方案1】:

    如果您将代码放在自定义单元格中名为 startJiggling 的方法中,则可以在控制器中调用此方法:

    [self.collectionView.visibleCells makeObjectsPerformSelector:@selector(startJiggling)];

    这样可以确保所有可见的单元格都会开始抖动。

    然后我还会设置一些标志,指示您的单元格应该在collectionView:cellForItemAtIndexPath: 中抖动和测试。如果是,则调用您的方法。

    【讨论】:

    • 除了最后一个单元格之外的所有单元格都在晃动。当我打印出可见单元格计数并且数组将其计数为 1 时。可见单元格计数较低。有任何想法吗? NSLog(@"visibleCellscount %d",self.collectionView.visibleCells.count); NSLog(@"birdscount %d",self.birds.count);
    • 但是所有单元格都可见?还是必须滚动到最后一个?
    【解决方案2】:

    Swift 5 这么简单

    在您的 UICollectionViewCell 中输入这 2 个函数,并在您想要动画/停止时调用它,例如:单元格渲染

    func shake() {
        let shakeAnimation = CABasicAnimation(keyPath: "transform.rotation")
        shakeAnimation.duration = 0.05
        shakeAnimation.repeatCount = 2
        shakeAnimation.autoreverses = true
        let startAngle: Float = (-2) * 3.14159/180
        let stopAngle = -startAngle
        shakeAnimation.fromValue = NSNumber(value: startAngle as Float)
        shakeAnimation.toValue = NSNumber(value: 3 * stopAngle as Float)
        shakeAnimation.autoreverses = true
        shakeAnimation.duration = 0.15
        shakeAnimation.repeatCount = 10000
        shakeAnimation.timeOffset = 290 * drand48()
    
        let layer: CALayer = self.layer
        layer.add(shakeAnimation, forKey:"shaking")
    }
    
    func stopShaking() {
        let layer: CALayer = self.layer
        layer.removeAnimation(forKey: "shaking")
    }
    

    Help Source from Git

    【讨论】:

      【解决方案3】:

      如果有人对如何在 Swift 2.0 中做到这一点感到好奇,那么下面应该是一个很好的起点。

      let animationRotateDegres: CGFloat = 0.5
      let animationTranslateX: CGFloat = 1.0
      let animationTranslateY: CGFloat = 1.0
      let count: Int = 1
      
      func wobble() {
          let leftOrRight: CGFloat = (count % 2 == 0 ? 1 : -1)
          let rightOrLeft: CGFloat = (count % 2 == 0 ? -1 : 1)
          let leftWobble: CGAffineTransform = CGAffineTransformMakeRotation(degreesToRadians(animationRotateDegres * leftOrRight))
          let rightWobble: CGAffineTransform = CGAffineTransformMakeRotation(degreesToRadians(animationRotateDegres * rightOrLeft))
          let moveTransform: CGAffineTransform = CGAffineTransformTranslate(leftWobble, -animationTranslateX, -animationTranslateY)
          let conCatTransform: CGAffineTransform = CGAffineTransformConcat(leftWobble, moveTransform)
      
          transform = rightWobble // starting point
      
          UIView.animateWithDuration(0.1, delay: 0.08, options: [.AllowUserInteraction, .Repeat, .Autoreverse], animations: { () -> Void in
              self.transform = conCatTransform
              }, completion: nil)
      }
      
      func degreesToRadians(x: CGFloat) -> CGFloat {
          return CGFloat(M_PI) * x / 180.0
      }
      

      当我想让我的细胞摇晃时,我会这样做:

      for cell in collectionView.visibleCells() {
              let customCell: MyCustomCell = cell as! MyCustomCell
              customCell.wobble()
          }
      

      【讨论】:

      • 这在我将转换应用于 contentView 时起作用。所以:self.contentView.transform = conCatTransform.
      • 非常适合我!!
      【解决方案4】:

      更新为 swift 3 语法:

      let animationRotateDegres: CGFloat = 0.5
      let animationTranslateX: CGFloat = 1.0
      let animationTranslateY: CGFloat = 1.0
      let count: Int = 1
      
      func wobble() {
          let leftOrRight: CGFloat = (count % 2 == 0 ? 1 : -1)
          let rightOrLeft: CGFloat = (count % 2 == 0 ? -1 : 1)
          let leftWobble: CGAffineTransform = CGAffineTransform(rotationAngle: degreesToRadians(x: animationRotateDegres * leftOrRight))
          let rightWobble: CGAffineTransform = CGAffineTransform(rotationAngle: degreesToRadians(x: animationRotateDegres * rightOrLeft))
          let moveTransform: CGAffineTransform = leftWobble.translatedBy(x: -animationTranslateX, y: -animationTranslateY)
          let conCatTransform: CGAffineTransform = leftWobble.concatenating(moveTransform)
      
          transform = rightWobble // starting point
      
          UIView.animate(withDuration: 0.1, delay: 0.08, options: [.allowUserInteraction, .autoreverse], animations: { () -> Void in
              self.transform = conCatTransform
          }, completion: nil)
      }
      
      func degreesToRadians(x: CGFloat) -> CGFloat {
          return CGFloat(M_PI) * x / 180.0
      }
      

      【讨论】:

      • 例如。将代码放在自定义的 UICollectionViewCell 中,并在需要摇动单元格时调用 wobble 函数。
      • 我在 awakeFromNib 中设置了它,但只调用一次 @user12345625
      • @reza_khalafi 将 .repeat 添加到动画调用中的选项中。
      【解决方案5】:

      将这行代码放在两个地方:

      [self.collectionView.visibleCells makeObjectsPerformSelector:@selector(startJiggling)];    
      
      1. -(void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath

      2. -(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        相关资源
        最近更新 更多