首页 > 解决方案 > 添加到 Stackview 子视图的 CAShapeLayers 仅在一个子视图上呈现

问题描述

和预计会显示一个黑色圆圈calorieViewtimeView但是distanceView正在显示预期的黑色圆圈。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a
        let allViews: [UIView] = [distanceView, calorieView, timeView]
        let stackView = UIStackView(arrangedSubviews: allViews)
        stackView.frame = view.frame
        stackView.axis = .vertical
        stackView.distribution = .fillEqually
        stackView.spacing = 0
        let y1 = CGFloat(0)
        let y2 = view.frame.height / 3
        let y3 = y2 * 2
        distanceView.frame = CGRect(x: 0, y: y1, width: view.frame.width, height: y2)
        calorieView.frame = CGRect(x: 0, y: y2, width: view.frame.width, height: y2)
        timeView.frame = CGRect(x: 0, y: y3, width: view.frame.width, height: y2)
        distanceView.layer.addSublayer(self.createViewLayer(localView:    distanceView))
        calorieView.layer.addSublayer(self.createViewLayer(localView: calorieView))
        timeView.layer.addSublayer(createViewLayer(localView: timeView))
        view.addSubview(stackView)

    }


    func createCircleLayer(center: CGPoint, radius: CGFloat, clockWise:Bool) -> CAShapeLayer {
        let shapeLayer = CAShapeLayer()

        let path = UIBezierPath
         (arcCenter: center, radius: radius, startAngle: 0,
         endAngle: 2 *     CGFloat.pi, clockwise: clockWise)
        shapeLayer.path = path.cgPath

        return shapeLayer
    }

    func createViewLayer(localView: UIView) -> CAShapeLayer {
        print(localView)
        var viewLayer = CAShapeLayer()
        viewLayer.frame = localView.frame
        let center = localView.center
        print(center)
        let radius = localView.frame.height / 3
        let isClockwise = true
        viewLayer = self.createCircleLayer
        (center: center, radius: radius, clockWise: isClockwise)
        return viewLayer
    }

}

标签: iosswift

解决方案


您做错的是y为您的视图设置坐标,基本上是在做垂直工作UIStackView

使用堆栈视图时,所有视图都应将x坐标y设置为0,0,因为它将根据其设置UIStackView进行定位。arrangedViews

只需将您的框架更改为具有origin = (0,0)或不使用UIStackView并使用计算出的y坐标...


推荐阅读