【发布时间】:2019-04-10 10:04:01
【问题描述】:
我没有使用普通按钮,而是将UIControl 子类化,因为我需要向它添加渐变。我还有一种方法可以添加阴影和活动指示器(在下图中不可见)作为有状态按钮,以在(例如)进行 API 调用时阻止用户敲击按钮。
尝试让UIControl 旋转真的很棘手,为了能够做到这一点,我将阴影作为单独的视图添加到包含UIControl 的容器视图中,因此可以添加阴影。
现在的问题是控件的行为不像旋转视图 - 让我向您展示上下文的屏幕抓取:
这是中间旋转,但肉眼几乎可以看到 - 图像显示渐变是图像中蓝色UIView 长度的 75%。
https://github.com/stevencurtis/statefulbutton
为了执行这种旋转,我删除了shadowview,然后将渐变框架的框架更改为其边界,这就是问题所在。
func viewRotated() {
CATransaction.setDisableActions(true)
shadowView!.removeFromSuperview()
shadowView!.frame = self.frame
shadowView!.layer.masksToBounds = false
shadowView!.layer.shadowOffset = CGSize(width: 0, height: 3)
shadowView!.layer.shadowRadius = 3
shadowView!.layer.shadowOpacity = 0.3
shadowView!.layer.shadowPath = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: .allCorners, cornerRadii: CGSize(width: 20, height: 20)).cgPath
shadowView!.layer.shouldRasterize = true
shadowView!.layer.rasterizationScale = UIScreen.main.scale
self.gradientViewLayer.frame = self.bounds
self.selectedViewLayer.frame = self.bounds
CATransaction.commit()
self.insertSubview(shadowView!, at: 0)
}
所以这个旋转方法是通过父视图控制器调用的:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: { context in
context.viewController(forKey: UITransitionContextViewControllerKey.from)
//inform the loginButton that it is being rotated
self.loginButton.viewRotated()
}, completion: { context in
// can call here when completed the transition
})
}
我知道这就是问题所在,而且我想这不是在完全正确的时间以与UIView 相同的方式发生。现在的问题是,我已经尝试了很多方法来让它发挥作用,但我最好的解决方案(上图)并不完全存在。
建议使用UIButton,将图像用于渐变(请不要建议使用渐变图像作为 UIButton 的背景,我已经尝试过)或第三个党图书馆。这是我的工作,它可以工作,但对我来说不能接受,我想让它像通常的视图一样工作(或者至少知道为什么不工作)。我也尝试了上面的其他解决方案,并选择了我自己的UIControl。我知道如果有 API 调用,我可以锁定视图,或者使用其他方式来阻止用户多次按下按钮。我正在尝试修复我的解决方案,而不是通过CAGradientLayer 发明解决此问题的方法。
问题:我需要将UIControlView 与CAGradientLayer 作为背景以与UIView 相同的方式旋转,并且不会出现上图所示的问题.
【问题讨论】:
-
你继承 UIControl 的理由有点奇怪。
-
你能向 UIButton 添加渐变吗?有例子吗?
-
是的。您可以将渐变图层添加到任何具有图层的视图,包括按钮。
-
您还可以为 UIButtons 添加阴影,您可以启用/禁用它们以阻止用户向它们发送垃圾邮件。