【问题标题】:position of a CALayer after change bounds size更改边界大小后 CALayer 的位置
【发布时间】:2017-01-24 20:51:00
【问题描述】:

我有一个带有一些 CGAffineTransform 的 CATextLayer。边界与父边界相同。 如果我将边界大小更改为文本大小,则图层的位置也会更改。 红色文本是没有改变边界的层。 更改边界大小后如何计算位置? (绿色文字)

这是来自 Playground 的代码:

import Cocoa

let frame = CGRect(origin: .zero, size: CGSize(width: 1200, height: 800))
let transform = CGAffineTransform(a: 0.811281, b: 0.584656, c: -0.484656, d: 0.611281, tx: 420.768, ty: -170.049)

func text(with color: NSColor, apply: Bool = false) -> CATextLayer {
    let layer = CATextLayer()
    let text = NSAttributedString(string: "valami", attributes: [NSForegroundColorAttributeName : color , NSFontAttributeName : NSFont.boldSystemFont(ofSize: 180)])
    layer.string = text
    layer.frame = frame
    layer.bounds = frame


    if apply {
        layer.bounds.size = text.size()

//      let translate = CGAffineTransform(translationX: -408.5, y: -12.8)
//      let concate = transform.concatenating(translate)
//      layer.setAffineTransform(concate)
        layer.setAffineTransform(transform)
    }

    let border = CAShapeLayer()
    border.path = CGPath(rect: layer.bounds, transform: nil)
    border.fillColor = nil
    border.strokeColor = color.cgColor
    layer.addSublayer(border)

    return layer
}


let background = CAShapeLayer()
background.path = CGPath(rect: frame, transform: nil)
background.fillColor = NSColor.white.cgColor
background.strokeColor = nil

let textLayer1 = text(with: .red)
let textLayer2 = text(with: NSColor.green.withAlphaComponent(0.5), apply: true)

let group = CALayer()
group.addSublayer(textLayer1)
group.bounds = frame
group.frame = frame
group.setAffineTransform(transform)



let view = NSView(frame: frame)
view.wantsLayer = true
view.layer = CALayer()
view.layer?.addSublayer(background)
view.layer?.addSublayer(group)
view.layer?.addSublayer(textLayer2)


view

【问题讨论】:

    标签: ios swift macos transform calayer


    【解决方案1】:

    好的,我想通了! 这是工作应用块:

    if apply {
        let textSize = text.size()
        let widthChange = layer.bounds.width - textSize.width
        let heightChange = layer.bounds.height - textSize.height
        let anx = ((transform.c / 2) * heightChange) - ((transform.a / 2) * widthChange)
        let any = ((transform.d / 2) * heightChange) - ((transform.b / 2) * widthChange)
    
        let translate = CGAffineTransform(translationX: anx, y: any)
        let concate = transform.concatenating(translate)
        layer.setAffineTransform(concate)
    
        layer.bounds.size = textSize
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多