Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在swift的tableview中使图像循环_Ios_Uiimageview_Calayer - Fatal编程技术网

Ios 如何在swift的tableview中使图像循环

Ios 如何在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 在布局子视图方法中应用拐角半径;及 将此类指定为单元格中图像视图的

在func
单元格中,单击“行”:

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
    方法不再需要配置图像视图的细节。而且,不用说,尽管上面的屏幕快照不在表视图中,但只要您相应地设置了基类,基本思想就可以在任何有图像视图的地方工作