游乐场代码: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
之前:
之后:
我想向下缩小一个三角形如下:
但三角形向上收缩如下:
转换代码如下:
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
之前:
之后: