在 Swift 中为什么这样做?
let button = UIButton()
button.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMinXMinYCorner]
这不行吗?
let corners : [CACornerMask] = [.layerMinXMaxYCorner, .layerMinXMinYCorner]
let button = UIButton()
button.layer.maskedCorners = corners
即显式将数组分配给maskedCorners
很好,但分配数组变量则不然。
错误是:
无法将类型"[CACornerMask]"的值分配给类型"CACornerMask" 按钮.图层.遮罩角 = 角
您的corners
常量是错误的类型。[CACornerMask]
使它成为一个CACornerMask
.您希望它是类型CACornerMask
。它被声明为 type NS_OPTIONS,它被映射到 Swift 选项集。(OptionSet
)
代码[.layerMinXMaxYCorner, .layerMinXMinYCorner]
看起来像数组语法,但事实并非如此。它是语义糖,允许您将不同的位掩码指定到 C 标志变量中(这是 Swift 选项集映射到的内容)。
引用 Apple 的文档:"Swift 还会导入标有 NS_OPTIONS 宏的 C 枚举作为 Swift 选项集">
摘自:Apple Inc. "Using Swift with Cocoa and Objective-C (Swift 4 beta)." iBooks.
你应该试试
let corners : CACornerMask = [.layerMinXMaxYCorner, .layerMinXMinYCorner]
let button = UIButton()
button.layer.maskedCorners = corners
将错误的类型分配给所需的类型
好吧,我为这个问题做了一个解决方案。
创建 UIView 的扩展
extension UIView{
enum RoundCornersAt{
case topRight
case topLeft
case bottomRight
case bottomLeft
}
//multiple corners using CACornerMask
func roundCorners(corners:[RoundCornersAt], radius: CGFloat) {
self.layer.cornerRadius = radius
self.layer.maskedCorners = [
corners.contains(.topRight) ? .layerMaxXMinYCorner:.init(),
corners.contains(.topLeft) ? .layerMinXMinYCorner:.init(),
corners.contains(.bottomRight) ? .layerMaxXMaxYCorner:.init(),
corners.contains(.bottomLeft) ? .layerMinXMaxYCorner:.init(),
]
}
}
现在您可以使用它。
let corners:[UIView.RoundCornersAt] = [.topLeft,.bottomRight]
button.roundCorners(corners: corners, radius: 20)