游乐场代码:AffineTransform 和 AnchorPoint 无法正常工作

Playground code: AffineTransform and AnchorPoint don't work as I want

我想向下缩小一个三角形如下:

但三角形向上收缩如下:

转换代码如下:

layer.setAffineTransform(CGAffineTransformMakeScale(1.0, 0.5))

我尝试使用锚点,但无法成功。

//: Playground - noun: a place where people can play

import UIKit

let view = UIView(frame: CGRectMake(0, 0, 200, 150))

let layer = CAShapeLayer()
let triangle = UIBezierPath()
triangle.moveToPoint   (CGPointMake( 50, 150))
triangle.addLineToPoint(CGPointMake(100,  50))
triangle.addLineToPoint(CGPointMake(150, 150))
triangle.closePath()
layer.path = triangle.CGPath
layer.strokeColor = UIColor.blueColor().CGColor
layer.lineWidth = 3.0
view.layer.addSublayer(layer)

view

layer.setAffineTransform(CGAffineTransformMakeScale(1.0, 0.5))

view

Anish 给了我一个建议,但效果不佳:

layer.setAffineTransform(CGAffineTransformMakeScale(2.0, 0.5))

T运行sforms 围绕层的 anchorPoint 运行,默认情况下它位于层的中心。因此,你通过向内塌陷而不是向下塌陷来收缩。

如果你想向下缩小,你需要缩小改变视图的位置(或者使用t运行slate t运行sform除了你的比例 t运行sform),或者在执行 t运行sform 之前改变图层的 anchorPoint

您的代码的另一个严重问题是您的图层没有分配大小。这会导致您的 t运行sform 的结果非常具有误导性。

我运行 你的这个版本的代码并得到了你想要的结果。我在我添加的关键行旁边放了一个星号。 (请注意,这是 Swift 3;您真的需要站出来更新这里。)

let view = UIView(frame:CGRect(x: 0, y: 0, width: 200, height: 150))
let layer = CAShapeLayer()
layer.frame = view.layer.bounds // *
let triangle = UIBezierPath()
triangle.move(to: CGPoint(x: 50, y: 150))
triangle.addLine(to: CGPoint(x: 100, y: 50))
triangle.addLine(to: CGPoint(x: 150, y: 150))
triangle.close()
layer.path = triangle.cgPath
layer.strokeColor = UIColor.blue.cgColor
layer.lineWidth = 3
view.layer.addSublayer(layer)
view
layer.anchorPoint = CGPoint(x: 0.5, y: 0) // *
layer.setAffineTransform(CGAffineTransform(scaleX: 1, y: 0.5))
view

之前:

之后: