ios - 更改边界大小后 CALayer 的位置

标签 ios swift macos transform calayer

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

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

最佳答案

好吧,我明白了! 这是工作应用 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
}

关于ios - 更改边界大小后 CALayer 的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41838760/

相关文章:

css - 在 OSX 上的 Chrome 中调试 Sass

java - 是否有可能从 java 获得 os x 中连接显示器的最大支持分辨率?

ios - 带有整页单元格的 UICollectionView VS 带有 subview Controller 的 UIScrollView

ios - drawRect : method of an UIView object do? 到底是什么

ios - 如何禁用删除并移动 UICollectionView 中的第一个单元格?

ios - GCDWebserver 监听 HTTP POST

macos - opencv 用 clang 编译好,用 gcc 编译不行 os x 10.9

ios - 我们可以在代码中使用未初始化的变量吗?或者它们几乎没有用,因为它们在之后就被释放了?

ios - Result.Framework 未在 TrueTime 中找到?

ios - bolt 异步框架方法无法识别