Ios 如何在swift的tableview中使图像循环
在funcIos 如何在swift的tableview中使图像循环,ios,uiimageview,calayer,Ios,Uiimageview,Calayer,在func单元格中,单击“行”: userCell.img.layer.cornerRadius = userCell.img.frame.size.width / 2.0 userCell.img.layer.borderWidth = 3.0 我试过这种方法,但图像不是完美的圆形。有两个问题: cellForRowAt中图像视图的大小通常与当前的大小不同。您希望响应图像视图的大小调整,最好由 子类化UIImageView 在布局子视图方法中应用拐角半径;及 将此类指定为单元格中图像视图的
单元格中,单击“行”:
userCell.img.layer.cornerRadius = userCell.img.frame.size.width / 2.0
userCell.img.layer.borderWidth = 3.0
我试过这种方法,但图像不是完美的圆形。有两个问题:
cellForRowAt
中图像视图的大小通常与当前的大小不同。您希望响应图像视图的大小调整,最好由
- 子类化
UIImageView
李>
- 在
布局子视图
方法中应用拐角半径
;及
- 将此类指定为单元格中图像视图的“基类”。
例如:
@IBDesignable
class RoundedImageView: UIImageView {
override func layoutSubviews() {
super.layoutSubviews()
layer.cornerRadius = min(bounds.width, bounds.height) / 2
layer.borderWidth = 3
}
}
上述方法具有一定的简单性,但仅在调整大小的图像视图正好为正方形时才有效。如果不是,你会得到一个药丸状的边框
您也可以实现一个格式副本,该格式副本将在图像视图的边界内应用圆形遮罩,然后将圆形边界添加为一个单独的子层,例如
@IBDesignable
class CircularImageView: UIImageView {
@IBInspectable var borderWidth: CGFloat = 3 { didSet { setNeedsLayout() } }
private var borderLayer: CAShapeLayer?
override func layoutSubviews() {
super.layoutSubviews()
let maskRadius = min(bounds.width, bounds.height) / 2
let borderRadius = maskRadius - borderWidth / 2
let center = CGPoint(x: bounds.midX, y: bounds.midY)
let mask = CAShapeLayer()
mask.path = UIBezierPath(arcCenter: center, radius: maskRadius, startAngle: 0, endAngle: 2 * .pi, clockwise: true).cgPath
mask.fillColor = UIColor.white.cgColor
layer.mask = mask
borderLayer?.removeFromSuperlayer()
let border = CAShapeLayer()
border.path = UIBezierPath(arcCenter: center, radius: borderRadius, startAngle: 0, endAngle: 2 * .pi, clockwise: true).cgPath
border.lineWidth = borderWidth
border.strokeColor = UIColor.black.cgColor
border.fillColor = UIColor.clear.cgColor
layer.addSublayer(border)
self.borderLayer = border
}
}
显然,如果您的图像视图不是很正方形,这将遮罩图像视图中心的圆,但即使在基础图像视图不是很正方形的情况下也能达到所需的效果
这两种方法的优点都是让您的cellForRowAt
方法不再需要配置图像视图的细节。而且,不用说,尽管上面的屏幕快照不在表视图中,但只要您相应地设置了基类,基本思想就可以在任何有图像视图的地方工作