我想从中心调整标签大小并为该过程设置动画。但是,我可以使用的唯一选项是CGAffineTransformMakeScale,它具有相应CALayer的默认锚点。
[UIView animateWithDuration:0.5 animations:^{
self.title.transform = CGAffineTransformMakeScale(2.0,1.0);
}];
但是它把文本压扁了。我考虑过这个answer,看起来问题在Swift中解决了。
但是,我无法仅修改size
的{{1}}部分内容。如何在Obj C中解决这个问题?
答案 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)
}
}
答案 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)