动画UILabel从中心调整大小?

时间:2016-03-29 13:28:01

标签: ios objective-c xcode uilabel ios9

我想从中心调整标签大小并为该过程设置动画。但是,我可以使用的唯一选项是CGAffineTransformMakeScale,它具有相应CALayer的默认锚点。

[UIView animateWithDuration:0.5 animations:^{
    self.title.transform = CGAffineTransformMakeScale(2.0,1.0);
}];

但是它把文本压扁了。我考虑过这个answer,看起来问题在Swift中解决了。

但是,我无法仅修改size的{​​{1}}部分内容。如何在Obj C中解决这个问题?

4 个答案:

答案 0 :(得分:1)

这对你有用。你只需要给出宽度和高度的比例(默认为1,这将没有效果)。这将为您的视图框架设置动画并将其重新设置为原始视图。

[UIView animateWithDuration:0.5
                  delay:0
                options:UIViewAnimationOptionBeginFromCurrentState
             animations:(void (^)(void)) ^{
                 self.textLabel.transform=CGAffineTransformMakeScale(3, 1);
             }
             completion:^(BOOL finished){
                 self.textLabel.transform=CGAffineTransformIdentity;
             }];

如果你不想恢复效果,你可以这样做

[UIView animateWithDuration:0.5
                  delay:0
                options:UIViewAnimationOptionBeginFromCurrentState
             animations:(void (^)(void)) ^{
                 self.textLabel.transform=CGAffineTransformMakeScale(3, 1);
             }
             completion:nil];

答案 1 :(得分:0)

根据我的理解,您希望通过动画更改UILabel的大小而不是文本的大小。这可以通过抓取当前标签的框架的副本然后修改它并将其重新设置来实现。

var frame = self.myLabel.frame
// frame modification ...
self.myLabel.frame = frame

解决方案

<强>代码

对于sizeTranformAction:,您可以使用一个简单的按钮并连接它以测试行为。

class SizeTransformViewController: UIViewController {
    var myLabel: UILabel! = nil

    // MARK: - View lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.setupLabel()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Setups

    func setupLabel() {
        self.myLabel = UILabel()
        self.myLabel.center = self.view.center
        self.myLabel.text = "Text"
        self.myLabel.sizeToFit()

        self.myLabel.textAlignment = NSTextAlignment.Center
        self.myLabel.backgroundColor = UIColor.redColor()

        self.view.addSubview(self.myLabel)
    }

    // MARK: - Actions

    @IBAction func sizeTranformAction(sender: AnyObject) {
        var frame = self.myLabel.frame
        let size = frame.size
        frame.size = CGSize(width: 2*size.width, height: size.height)
        frame.origin.x = self.view.center.x - size.width

        UIView.animateWithDuration(0.5, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: { 
            self.myLabel.frame = frame
        }, completion: nil)
    }
}

输出

enter image description here

答案 2 :(得分:0)

我实际上最终得到了2个标签。动画序列如下:

  • 创建一个没有文字的临时标签,属性如bg 颜色,字体,字体大小等应与主标签相同。

  • 将临时标签放在主标签上方。将主标签的文本属性设置为nil

  • 将主标签的框架设置为所需的值
  • 动画完成后,将主标签的文本属性设置为原始值(可能在animateWithDuration:的完成处理程序中)
  • 隐藏临时标签/将其删除

答案 3 :(得分:0)

您可以更改常量以在缩放后补偿新宽度。这会有帮助吗?

layoutIfNeeded()

let scale: CGFloat = 0.72

let consLeft = NSLayoutConstraint(
    item: titleLabel,
    attribute: .left,
    relatedBy: .equal,
    toItem: self,
    attribute: .left,
    multiplier: 1,
    constant: titleLabel.frameWidth * -(1-scale)/2
  )

consLeft.isActive = true

let animations = {
  self.titleLabel.transform = CGAffineTransform(scaleX: scale, y: scale)
  self.layoutIfNeeded()
}
UIView.animate(withDuration: 0.25, delay: 0, options: [.curveEaseOut],
                     animations: animations,
                     completion: nil)