我调节具有CGAffineTransformMakeScale一个UIView,但我想保持它固定到它的,因为它的规模目前顶级的中心点。
我看着进入设置view.layer.anchorPoint
但我相信我需要结合设置使用此view.layer.position
以考虑锚点的变化。
如果任何人都可以在正确的方向指向我,我会非常感激!
我调节具有CGAffineTransformMakeScale一个UIView,但我想保持它固定到它的,因为它的规模目前顶级的中心点。
我看着进入设置view.layer.anchorPoint
但我相信我需要结合设置使用此view.layer.position
以考虑锚点的变化。
如果任何人都可以在正确的方向指向我,我会非常感激!
看看我的答案在这里,了解您的看法是移动当你改变锚点: https://stackoverflow.com/a/12208587/77567
所以,开始你的观点的变换设置为身份。 当视图为转化的,发现它的上边缘的中心:
CGRect frame = view.frame;
CGPoint topCenter = CGPointMake(CGRectGetMidX(frame), CGRectGetMinY(frame));
然后锚点顶端边缘的中间:
view.layer.anchorPoint = CGPointMake(0.5, 0);
现在层的position
(或视图的center
)是层的顶边的中心的位置。 如果你停在这里,该层将移动以便其顶部边缘的中心就是其真正的中心是改变锚点之前。 所以改变层的position
,从刚才的顶部边缘的中心:
view.layer.position = topCenter;
现在,该层停留在屏幕上的同一个地方,但它的定位点是它的顶边的中心,所以尺度和旋转将离开固定点。
缩放的UIView的与某个特定的锚点,同时避免错位:
extension UIView {
func applyTransform(withScale scale: CGFloat, anchorPoint: CGPoint) {
layer.anchorPoint = anchorPoint
let scale = scale != 0 ? scale : CGFloat.leastNonzeroMagnitude
let xPadding = 1/scale * (anchorPoint.x - 0.5)*bounds.width
let yPadding = 1/scale * (anchorPoint.y - 0.5)*bounds.height
transform = CGAffineTransform(scaleX: scale, y: scale).translatedBy(x: xPadding, y: yPadding)
}
}
因此,要缩小视图它的大小与它的顶部中央为锚点的一半:
view.applyTransform(withScale: 0.5, anchorPoint: CGPoint(x: 0.5, y: 0))
这是一个老问题,但我面临同样的问题,我花了很多时间来获得所需的行为,扩大一点点从@Rob Mayoff答案(我找到了解决办法多亏了他的解释)。 我不得不表现出浮动视图由用户触摸的点缩放。 根据屏幕COORDS,这可能缩小,左,右,上,从中心。
要做的第一件事情是设置我们的浮动视图的中心,在触摸点(它必须是中心,“事业为罗布说明):
-(void)onTouchInView:(CGPoint)theTouchPosition
{
self.floatingView.center = theTouchPosition;
....
}
接下来的问题是,设置图层的锚点 ,这取决于我们想做的事情(我测量相对于屏幕边框的点,并确定在哪里缩放):
switch (desiredScallingDirection) {
case kScaleFromCenter:
{
//SCALE FROM THE CENTER, SO
//SET ANCHOR POINT IN THE VIEW'S CENTER
self.floatingView.layer.anchorPoint=CGPointMake(.5, .5);
}
break;
case kScaleFromLeft:
//SCALE FROM THE LEFT, SO
//SET ANCHOR POINT IN THE VIEW'S LEFT-CENTER
self.floatingView.layer.anchorPoint=CGPointMake(0, .5);
break;
case kScaleFromBottom:
//SCALE FROM BOTTOM, SO
//SET ANCHOR POINT IN THE VIEW'S CENTER-BOTTOM
self.floatingView.layer.anchorPoint=CGPointMake(.5, 1);
break;
case kScaleFromRight:
//SCALE FROM THE RIGHT, SO
//SET ANCHOR POINT IN THE VIEW'S RIGHT-CENTER
self.floatingView.layer.anchorPoint=CGPointMake(1, .5);
break;
case kScallingFromTop:
//SCALE FROM TOP, SO
//SET ANCHOR POINT IN THE VIEW'S CENTER-TOP
self.floatingView.layer.anchorPoint=CGPointMake(.5, 0);
break;
default:
break;
}
现在,所有这很容易。 根据你想给动画效果(当时的想法是一个反弹从0到100%缩放):
//SETUP INITIAL SCALING TO (ALMOST) 0%
CGAffineTransform t=CGAffineTransformIdentity;
t=CGAffineTransformScale(t, .001, .001);
self.floatingView.transform=t;
[UIView animateWithDuration:.2
delay:0
options:UIViewAnimationOptionCurveEaseInOut
animations:^{
//BOUNCE A LITLE UP!
CGAffineTransform t = CGAffineTransformMakeScale(1.1,1.1);
self.floatingView.transform=t;
} completion:^(BOOL finished) {
[UIView animateWithDuration:.1
animations:^{
//JUST A LITTLE DOWN
CGAffineTransform t = CGAffineTransformMakeScale(.9,.9);
self.floatingView.transform = t;
} completion:^(BOOL finished) {
[UIView animateWithDuration:.05
animations:^{
//AND ALL SET
self.floatingView.transform = CGAffineTransformIdentity;
}
completion:^(BOOL finished) {
//ALL SET
}];
}];
}];
而已。 正如你所看到的,最主要的是要正确设置视图的位置和定位点。 那么,这一切都小菜一碟! 问候,并让代码与你同在!