【问题标题】:UIScrollView zooming and affected CAShapeLayer lineWidthUIScrollView 缩放和影响 CAShapeLayer lineWidth
【发布时间】:2018-06-24 10:30:52
【问题描述】:

我有一堆用 UIBezierPath 构建并存储在 UIScrollView 中的 CAShapeLayers。

我想知道当 UIScrollView 放大 100% 时,是否有任何方法可以使 CAShapeLayer 路径的 lineWidth 远离缩放。我的意思是将 UIScrollView 的转换规则应用于 CAShapeLayer,但保持路径的宽度与以前在 1.0 zoomScale 上的宽度相同。 (所以当1pt路径lineWidth的层被缩放到300%时,@2x设备上层的lineWidth不会变成6px的高度,而是保持2px的高度)

【问题讨论】:

  • 如何根据 scrollView 的缩放设置 lineWidth ? 'scrollViewDidZoom'中的'lineWidth = lineWidthFor@x1Zoom * scrollView.zoomScale'?
  • @GaétanZ lineWidth 值在缩放时似乎没有改变。当我将其输出到日志中时,它会显示其原始值。我猜问题是 UIScrollView 将缩放应用于整个 CAShapeLayer。我需要以某种方式将它们分开。

标签: ios uiscrollview zooming cashapelayer catransform3d


【解决方案1】:
class ViewController : UIViewController, UIScrollViewDelegate {

    private lazy var scrollView = UIScrollView()
    private lazy var contentView = UIView()
    private lazy var shapeLayer = CAShapeLayer()
    private let lineWidth: CGFloat = 1

    override func loadView() {
        view = UIView()
        view.addSubview(scrollView)
        scrollView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        scrollView.addSubview(contentView)
        scrollView.minimumZoomScale = 1.0
        scrollView.maximumZoomScale = 2.0
        scrollView.delegate = self
        contentView.backgroundColor = .red
        let viewSize = CGSize(width: 400, height: 400)
        scrollView.contentSize = viewSize
        contentView.frame = CGRect(x: 0, y: 0, width: viewSize.width, height: viewSize.height)
        setUpShapeLayer(in: viewSize)
    }

    //MARK: - UIScrollViewDelegate

    func scrollViewDidZoom(_ scrollView: UIScrollView) {
        shapeLayer.lineWidth = lineWidth * 1 / scrollView.zoomScale
    }

    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        return contentView
    }

    //MARK: - Private

    private func setUpShapeLayer(in size: CGSize) {
        shapeLayer.fillColor = UIColor.white.cgColor
        shapeLayer.strokeColor = UIColor.black.cgColor
        shapeLayer.lineWidth = lineWidth
        contentView.layer.addSublayer(shapeLayer)
        let shapeSize = CGSize(width: 200, height: 200)
        let shapeBounds = CGRect(origin: .zero, size: shapeSize)
        shapeLayer.bounds.size = shapeSize
        shapeLayer.path = UIBezierPath(ovalIn: shapeBounds).cgPath
        shapeLayer.position = CGPoint(x: size.width / 2, y: size.height / 2)
    }
}

这是你想要的吗?

【讨论】:

  • 并非如此。在这里,整个图层都调整了大小(线宽也是如此)。 1pt lineWidth 在 zoomScale = 4.0 上仍然具有 1pt 的值。然而,由于缩放层,它变得更厚(在 4x 缩放 1pt lineWidth 为 8x8px 对于@2x 设备)。但是,我想将其保持为 2x2px,因此图层将被调整大小,但不会调整其路径的 lineWidth。 stackoverflow.com/questions/30434615/… 这看起来像我需要的,但还不能让它工作。
  • 上面代码中的问题是它不适用于初始 lineWidth 值等于 1.0。至于更高的值,我们总是可以将 lineWidth 减小到更小的尺寸。根据我的经验,1.0 是不可能的,因为它已经是一个最小值。
  • 嗯,是的,你可以。 lineWidth 是点而不是像素。我尝试使用 lineWidth = 1。
  • 嗯,tnx,我试试看
猜你喜欢
  • 2018-07-14
  • 2015-07-23
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
相关资源
最近更新 更多