Swift 如何向 UIImageView 添加自定义形状?
How to add a custom shape to an UIImageView in Swift?
我正在尝试向 imageView
添加自定义形状。请检查以下图片。
这是必填项:
这是我目前所做的:
我是 Core Graphics
的新手,到目前为止我已经这样做了:
private func customImageClipper(imageV: UIImageView){
let path = UIBezierPath()
let size = imageV.frame.size
print(size)
path.move(to: CGPoint(x: 0.0, y: size.height))
path.addLine(to: CGPoint(x: 0.8, y: size.height/2))
path.close()
let shape = CAShapeLayer()
shape.path = path.cgPath
imageV.layer.sublayers = [shape]
}
我正在创建一个函数来实现这样的形状,但是每当我将 imageView
传递给这个函数时,我根本看不到任何变化。我知道我必须从一个点移动到另一个点才能达到这个形状,但我从来没有这样做过。任何帮助,将不胜感激。这就是我调用此函数的方式:
imageV.layoutIfNeeded()
customImageClipper(imageV: imageV)
P.S.: 我没有使用 Storyboard
,我是通过编程创建的。
这里是一些路径裁剪的例子。当然path也可以通过参数放,这个可以应用到任何视图,如图。
之前:
之后(灰色背景在 ScrollView 背景下方):
func customImageClipper(imageV: UIView){
let path = UIBezierPath()
let size = imageV.frame.size
path.move(to: CGPoint(x: size.width/3.0, y: 0))
path.addLine(to: CGPoint(x: size.width/3.0 + 50, y: 0))
path.addLine(to: CGPoint(x: size.width/3.0, y: size.height))
path.addLine(to: CGPoint(x: size.width/3.0 - 50, y: size.height))
path.addLine(to: CGPoint(x: size.width/3.0, y: 0))
path.close()
let shape = CAShapeLayer()
shape.path = path.cgPath
shape.fillColor = UIColor.black.cgColor
imageV.layer.mask = shape
}
有很多方法可以使用 UIBezierPaths 创建形状。 This post 此处讨论使用 draw
函数创建形状。
这是在单元格中使用 clip
函数的示例。
func clip(imageView: UIView, withOffset offset: CGFloat) {
let path = UIBezierPath()
//Move to Top Left
path.move(to: .init(x: imageView.bounds.size.width * offset, y: 0))
//Draw line from Top Left to Top Right
path.addLine(to: .init(x: imageView.bounds.size.width, y: 0))
//Draw Line from Top Right to Bottom Right
path.addLine(to: .init(x: imageView.bounds.size.width * (1 - offset), y: imageView.bounds.size.height))
//Draw Line from Bottom Right to Bottom Left
path.addLine(to: .init(x: 0, y: imageView.bounds.size.height))
//Close Path
path.close()
//Create the Shape Mask for the ImageView
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
shapeLayer.fillColor = UIColor.black.cgColor
imageView.layer.mask = shapeLayer
}
在此函数中,偏移量是您希望在形状上的角度量,范围从 0 到 1。(0.4) 似乎可以满足您的要求。
这与 Apseri 的答案有很多相似之处,除了我选择了百分比路线,而不是精确大小。这两种方法都没有错,我只是发现用百分比更容易理解。 :)
最后要指出的一点是,我在 layoutSubviews
函数中使用了这个函数。
override func layoutSubviews() {
super.layoutSubviews()
imageView.layoutIfNeeded()
clip(imageView: self.imageView, withOffset: 0.4)
}
这将输出以下图像:
希望对您有所帮助。
1- 继承你的 UIImageView
2- 使用 UIBezierPath
在 setNeedsLayout 中实现自定义绘图
class MyCustomImageView: UIImageView {
override func setNeedsLayout() {
let path = UIBezierPath()
path.moveToPoint(CGPoint(x: self.frame.size.width/2, y: self.frame.size.height))
path.addLineToPoint(CGPoint(x: self.frame.size.width, y: self.frame.size.height/2))
path.addLineToPoint(CGPoint(x: self.frame.size.width/2, y: 0))
path.addArcWithCenter(CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/2), radius: self.frame.size.width/2, startAngle:-CGFloat(M_PI_2), endAngle: CGFloat(M_PI_2), clockwise: false)
path.moveToPoint(CGPoint(x: self.frame.size.width/2, y: self.frame.size.height))
path.closePath()
UIColor.redColor().setFill()
path.stroke()
path.bezierPathByReversingPath()
let shapeLayer = CAShapeLayer()
shapeLayer.frame = self.bounds
shapeLayer.path = path.CGPath
shapeLayer.fillColor = UIColor.redColor().CGColor
self.layer.mask = shapeLayer;
self.layer.masksToBounds = true;
}
}
我正在尝试向 imageView
添加自定义形状。请检查以下图片。
这是必填项:
这是我目前所做的:
我是 Core Graphics
的新手,到目前为止我已经这样做了:
private func customImageClipper(imageV: UIImageView){
let path = UIBezierPath()
let size = imageV.frame.size
print(size)
path.move(to: CGPoint(x: 0.0, y: size.height))
path.addLine(to: CGPoint(x: 0.8, y: size.height/2))
path.close()
let shape = CAShapeLayer()
shape.path = path.cgPath
imageV.layer.sublayers = [shape]
}
我正在创建一个函数来实现这样的形状,但是每当我将 imageView
传递给这个函数时,我根本看不到任何变化。我知道我必须从一个点移动到另一个点才能达到这个形状,但我从来没有这样做过。任何帮助,将不胜感激。这就是我调用此函数的方式:
imageV.layoutIfNeeded()
customImageClipper(imageV: imageV)
P.S.: 我没有使用 Storyboard
,我是通过编程创建的。
这里是一些路径裁剪的例子。当然path也可以通过参数放,这个可以应用到任何视图,如图。
之前:
之后(灰色背景在 ScrollView 背景下方):
func customImageClipper(imageV: UIView){
let path = UIBezierPath()
let size = imageV.frame.size
path.move(to: CGPoint(x: size.width/3.0, y: 0))
path.addLine(to: CGPoint(x: size.width/3.0 + 50, y: 0))
path.addLine(to: CGPoint(x: size.width/3.0, y: size.height))
path.addLine(to: CGPoint(x: size.width/3.0 - 50, y: size.height))
path.addLine(to: CGPoint(x: size.width/3.0, y: 0))
path.close()
let shape = CAShapeLayer()
shape.path = path.cgPath
shape.fillColor = UIColor.black.cgColor
imageV.layer.mask = shape
}
有很多方法可以使用 UIBezierPaths 创建形状。 This post 此处讨论使用 draw
函数创建形状。
这是在单元格中使用 clip
函数的示例。
func clip(imageView: UIView, withOffset offset: CGFloat) {
let path = UIBezierPath()
//Move to Top Left
path.move(to: .init(x: imageView.bounds.size.width * offset, y: 0))
//Draw line from Top Left to Top Right
path.addLine(to: .init(x: imageView.bounds.size.width, y: 0))
//Draw Line from Top Right to Bottom Right
path.addLine(to: .init(x: imageView.bounds.size.width * (1 - offset), y: imageView.bounds.size.height))
//Draw Line from Bottom Right to Bottom Left
path.addLine(to: .init(x: 0, y: imageView.bounds.size.height))
//Close Path
path.close()
//Create the Shape Mask for the ImageView
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
shapeLayer.fillColor = UIColor.black.cgColor
imageView.layer.mask = shapeLayer
}
在此函数中,偏移量是您希望在形状上的角度量,范围从 0 到 1。(0.4) 似乎可以满足您的要求。
这与 Apseri 的答案有很多相似之处,除了我选择了百分比路线,而不是精确大小。这两种方法都没有错,我只是发现用百分比更容易理解。 :)
最后要指出的一点是,我在 layoutSubviews
函数中使用了这个函数。
override func layoutSubviews() {
super.layoutSubviews()
imageView.layoutIfNeeded()
clip(imageView: self.imageView, withOffset: 0.4)
}
这将输出以下图像:
希望对您有所帮助。
1- 继承你的 UIImageView
2- 使用 UIBezierPath
在 setNeedsLayout 中实现自定义绘图class MyCustomImageView: UIImageView {
override func setNeedsLayout() {
let path = UIBezierPath()
path.moveToPoint(CGPoint(x: self.frame.size.width/2, y: self.frame.size.height))
path.addLineToPoint(CGPoint(x: self.frame.size.width, y: self.frame.size.height/2))
path.addLineToPoint(CGPoint(x: self.frame.size.width/2, y: 0))
path.addArcWithCenter(CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/2), radius: self.frame.size.width/2, startAngle:-CGFloat(M_PI_2), endAngle: CGFloat(M_PI_2), clockwise: false)
path.moveToPoint(CGPoint(x: self.frame.size.width/2, y: self.frame.size.height))
path.closePath()
UIColor.redColor().setFill()
path.stroke()
path.bezierPathByReversingPath()
let shapeLayer = CAShapeLayer()
shapeLayer.frame = self.bounds
shapeLayer.path = path.CGPath
shapeLayer.fillColor = UIColor.redColor().CGColor
self.layer.mask = shapeLayer;
self.layer.masksToBounds = true;
}
}