如何在应用变换之前计算UIView的框架?

4

问题

我有一个UIView,并对其应用了一个CGAffineTransform。我想知道如果没有应用变换,视图的框架是什么。

我正在寻找一个(简单的)解决方案,可以处理变换为“零变换”的情况(这不可逆)。

我的尝试

以下方法不适用于“零变换”,我猜测。

CGRect result ;

CGAffineTransform transform = self.transform ;

result = CGRectApplyAffineTransform(self.frame, CGAffineTransformInvert(transform)) ;

return result ;

为什么这样做?

我需要为动画做如下设置:

  • 初始设置:我将 transform 设置为“0”。视图已插入,但所有元素的帧似乎没有考虑到该视图。
  • 最终设置:我计算了所有元素的帧,这次考虑了新的视图。我将其transform 设置为“1”。

备注

我的变换是一个比例变换。


CGRectApplyAffineTransform的第一个参数应该是self.frame。 仍然使用CGAffineTransformIdentity而不是self.transform。我无法理解你的问题。 你想检查CGRectApplyAffineTransform是否已应用?如果已应用,你想得到宽度和高度的变化吗? - rahul_send89
2个回答

17

transform不会影响centerbounds

因此,您可以通过这段简单的代码进行计算:

    CGPoint center = view.center;
    CGSize size = view.bounds.size;

    CGRect frameForTransformIdentity = CGRectMake(
        center.x - size.width / 2,
        center.y - size.height / 2,
        size.width,
        size.height
    );

0

Swift 4.1 版本:

extension UIView
{
    var frameWithoutTransform: CGRect
    {
        let center = self.center
        let size   = self.bounds.size

        return CGRect(x: center.x - size.width  / 2, 
                      y: center.y - size.height / 2,
                  width: size.width,
                 height: size.height)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接