更改边界大小后CALayer的位置

时间:2017-01-24 20:51:00

标签: ios swift macos transform calayer

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

Example

以下是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

1 个答案:

答案 0 :(得分:0)

好的,我想通了! 这是工作申请区块:

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
}