简体   繁体   English

更改边界大小后CALayer的位置

[英]position of a CALayer after change bounds size

I have a CATextLayer with some CGAffineTransform. 我有一个带有CGAffineTransform的CATextLayer。 The bounds is same to parent bounds. 边界与父边界相同。 If I change the bounds size to text size, then position of a layer is also changed. 如果将边界大小更改为文本大小,则图层的位置也会更改。 The red text is the layer without changing bounds. 红色文本是不更改边界的图层。 How to calculating the position after changing bounds size? 更改边界大小后如何计算位置? (green text) (绿色文字)

例

Here is code from Playground: 这是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

OK, I figured out! 好,我想通了! This is the working apply block: 这是工作中的应用块:

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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM