如何从左到右和向后缩放 UIView?
How to scale a UIView from left to right and back?
我想让 UIView 在我按下按钮时从左向右缩放显示。如果我再次点击按钮,视图应该从右向左缩小。
我找到了如何从左到右执行此操作的说明,但即使是此解决方案也只能使用一次。如果我隐藏视图并再次播放动画,它会再次从中心缩放它。
从右向左缩放它也不起作用,因为它会立即消失而没有任何动画。
到目前为止,这是我的代码:
if(!addQuestionaryView.isHidden)
{
//Reset input if view is hidden
addQuestionaryInput.text = ""
self.addQuestionaryView.isHidden = false
let frame = addQuestionaryView.frame;
let rect = CGRect(x: frame.origin.x, y: frame.origin.y, width: frame.width, height: frame.height)
let leftCenter = CGPoint(x: rect.minX, y: rect.minY)
addQuestionaryView.layer.anchorPoint = CGPoint(x:1,y: 0.5)
addQuestionaryView.layer.position = leftCenter
UIView.animate(withDuration: 0.6,
animations: {
self.addQuestionaryView.transform = CGAffineTransform(scaleX: 0, y: 1)
},
completion: { _ in
self.addQuestionaryView.isHidden = true
})
}
else
{
self.addQuestionaryView.isHidden = false
let frame = addQuestionaryView.frame;
let rect = CGRect(x: frame.origin.x, y: frame.origin.y, width: frame.width, height: frame.height)
let leftCenter = CGPoint(x: rect.minX, y: rect.midY)
addQuestionaryView.layer.anchorPoint = CGPoint(x:0,y: 0.5);
addQuestionaryView.layer.position = leftCenter
addQuestionaryView.transform = CGAffineTransform(scaleX: 0, y: 1)
UIView.animate(withDuration: 0.6,
animations: {
self.addQuestionaryView.transform = CGAffineTransform(scaleX: 1, y: 1)
},
completion: nil)
}
如前所述,出现的部分工作一次,然后再次从中心开始。消失的部分根本不起作用
删除这个:
addQuestionaryView.layer.anchorPoint = CGPoint(x:0,y: 0.5);
addQuestionaryView.layer.position = leftCenter
addQuestionaryView.transform = CGAffineTransform(scaleX: 0, y: 1)
然后在你的 animate with duration 块中使用下面的代码而不是 CGAfflineTransform
addQuestionaryView.frame = CGRect(0,0,500,100)
将 500 宽度替换为您想要的任何宽度。
要关闭它,请执行以下操作:
addQuestionaryView.frame = CGRect(0,0,0,100);
我不知道 "to scale it so it has a little look like Android reveal animations" 是什么意思(我希望我永远不会知道;我从未见过 Android phone,我从不希望看到一个)。
但是你的意思是这样的吗?这是通过在视图前面设置一个 mask 动画来完成的,从而显示然后隐藏它:
这是该示例中使用的代码:
class MyMask : UIView {
override func draw(_ rect: CGRect) {
let r = CGRect(x: 0, y: 0, width: rect.width/2.0, height: rect.height)
UIColor.black.setFill()
UIGraphicsGetCurrentContext()?.fill(r)
}
}
class ViewController: UIViewController {
@IBOutlet weak var lab: UILabel!
var labMaskOrigin = CGPoint.zero
var didAddMask = false
override func viewDidLayoutSubviews() {
if didAddMask {return}
didAddMask = true
let mask = MyMask()
mask.isOpaque = false
let w = self.lab.bounds.width
let h = self.lab.bounds.height
mask.frame = CGRect(x: -w, y: 0, width: w*2, height: h)
self.lab.mask = mask
self.labMaskOrigin = mask.frame.origin
}
var labVisible = false
func toggleLabVisibility() {
labVisible = !labVisible
UIView.animate(withDuration: 5) {
self.lab.mask!.frame.origin = self.labVisible ?
.zero : self.labMaskOrigin
}
}
}
我想让 UIView 在我按下按钮时从左向右缩放显示。如果我再次点击按钮,视图应该从右向左缩小。
我找到了如何从左到右执行此操作的说明,但即使是此解决方案也只能使用一次。如果我隐藏视图并再次播放动画,它会再次从中心缩放它。 从右向左缩放它也不起作用,因为它会立即消失而没有任何动画。
到目前为止,这是我的代码:
if(!addQuestionaryView.isHidden)
{
//Reset input if view is hidden
addQuestionaryInput.text = ""
self.addQuestionaryView.isHidden = false
let frame = addQuestionaryView.frame;
let rect = CGRect(x: frame.origin.x, y: frame.origin.y, width: frame.width, height: frame.height)
let leftCenter = CGPoint(x: rect.minX, y: rect.minY)
addQuestionaryView.layer.anchorPoint = CGPoint(x:1,y: 0.5)
addQuestionaryView.layer.position = leftCenter
UIView.animate(withDuration: 0.6,
animations: {
self.addQuestionaryView.transform = CGAffineTransform(scaleX: 0, y: 1)
},
completion: { _ in
self.addQuestionaryView.isHidden = true
})
}
else
{
self.addQuestionaryView.isHidden = false
let frame = addQuestionaryView.frame;
let rect = CGRect(x: frame.origin.x, y: frame.origin.y, width: frame.width, height: frame.height)
let leftCenter = CGPoint(x: rect.minX, y: rect.midY)
addQuestionaryView.layer.anchorPoint = CGPoint(x:0,y: 0.5);
addQuestionaryView.layer.position = leftCenter
addQuestionaryView.transform = CGAffineTransform(scaleX: 0, y: 1)
UIView.animate(withDuration: 0.6,
animations: {
self.addQuestionaryView.transform = CGAffineTransform(scaleX: 1, y: 1)
},
completion: nil)
}
如前所述,出现的部分工作一次,然后再次从中心开始。消失的部分根本不起作用
删除这个:
addQuestionaryView.layer.anchorPoint = CGPoint(x:0,y: 0.5);
addQuestionaryView.layer.position = leftCenter
addQuestionaryView.transform = CGAffineTransform(scaleX: 0, y: 1)
然后在你的 animate with duration 块中使用下面的代码而不是 CGAfflineTransform
addQuestionaryView.frame = CGRect(0,0,500,100)
将 500 宽度替换为您想要的任何宽度。
要关闭它,请执行以下操作:
addQuestionaryView.frame = CGRect(0,0,0,100);
我不知道 "to scale it so it has a little look like Android reveal animations" 是什么意思(我希望我永远不会知道;我从未见过 Android phone,我从不希望看到一个)。
但是你的意思是这样的吗?这是通过在视图前面设置一个 mask 动画来完成的,从而显示然后隐藏它:
这是该示例中使用的代码:
class MyMask : UIView {
override func draw(_ rect: CGRect) {
let r = CGRect(x: 0, y: 0, width: rect.width/2.0, height: rect.height)
UIColor.black.setFill()
UIGraphicsGetCurrentContext()?.fill(r)
}
}
class ViewController: UIViewController {
@IBOutlet weak var lab: UILabel!
var labMaskOrigin = CGPoint.zero
var didAddMask = false
override func viewDidLayoutSubviews() {
if didAddMask {return}
didAddMask = true
let mask = MyMask()
mask.isOpaque = false
let w = self.lab.bounds.width
let h = self.lab.bounds.height
mask.frame = CGRect(x: -w, y: 0, width: w*2, height: h)
self.lab.mask = mask
self.labMaskOrigin = mask.frame.origin
}
var labVisible = false
func toggleLabVisibility() {
labVisible = !labVisible
UIView.animate(withDuration: 5) {
self.lab.mask!.frame.origin = self.labVisible ?
.zero : self.labMaskOrigin
}
}
}