Reposition/resize UIBezierPath
Swift 3 extension (modify it with factorX, factorY if needed) :
extension UIBezierPath
{
func scaleAroundCenter(factor: CGFloat)
{
let beforeCenter = self.bounds.getCenter()
// SCALE path by factor
let scaleTransform = CGAffineTransform(scaleX: factor, y: factor)
self.apply(scaleTransform)
let afterCenter = self.bounds.getCenter()
let diff = CGPoint(
x: beforeCenter.x - afterCenter.x,
y: beforeCenter.y - afterCenter.y)
let translateTransform = CGAffineTransform(translationX: diff.x, y: diff.y)
self.apply(translateTransform)
}
SWIFT 5 UPDATE
extension UIBezierPath {
func scaleAroundCenter(factor: CGFloat) {
let beforeCenter = CGPoint(x: self.bounds.midX, y: self.bounds.midY)
// SCALE path by factor
let scaleTransform = CGAffineTransform(scaleX: factor, y: factor)
self.apply(scaleTransform)
let afterCenter = CGPoint(x: self.bounds.midX, y: self.bounds.midY)
let diff = CGPoint( x: beforeCenter.x - afterCenter.x, y: beforeCenter.y - afterCenter.y)
let translateTransform = CGAffineTransform(translationX: diff.x, y: diff.y)
self.apply(translateTransform)
}
}
Swift version
Here is @hfossli's code for Swift:
// example path
let path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: 100, height: 100), cornerRadius: 4)
// scale it
let scale = CGFloat(0.9)
path.applyTransform(CGAffineTransformMakeScale(scale, scale))
// move it
let translation = CGSize(width: 10, height: 5)
path.applyTransform(CGAffineTransformMakeTranslation(translation.width,
translation.height))
// apply it
self.myLayer.path = path
Update
I've found in actual practice that I just just different initial values when creating a UIBezierPath
rather than transforming it later. I guess it would depend on the purpose.
// example path
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 100, 100) cornerRadius:4];
// scale it
CGFloat scale = 0.9;
[path applyTransform:CGAffineTransformMakeScale(scale, scale)];
// move it
CGSize translation = CGSizeMake(10, 5);
[path applyTransform:CGAffineTransformMakeTranslation(translation.width,
translation.height)];
// apply it
self.myLayer.path = path;