代码之家  ›  专栏  ›  技术社区  ›  schmidt9

在边界内旋转图像

  •  0
  • schmidt9  · 技术社区  · 7 年前

    我尝试在超视图中旋转图像视图,以便在旋转时此图像视图始终接触超视图的边界,而不会与它们交叉,并进行适当的调整。我如何实现这一点?图像视图应能旋转360度。

    这里我使用基于三角形公式的计算,考虑到初始图像视图的对角线。

    也许我应该考虑图像视图旋转后的新边框(它的X和Y坐标为负,转换后的边框尺寸也变大)。

    到目前为止还没有成功,我的图像视图被缩小得太快太多。所以我的目标是,根据我的理解,为 CGAffineTransformScale . 也许还有其他方法可以做到这一点。

    // set initial values
    
        _planImageView.layer.affineTransform = CGAffineTransformScale(CGAffineTransformIdentity, 1, 1);
    
        _degrees = 0;
    
        _initialWidth = _planImageView.frame.size.width;
        _initialHeight = _planImageView.frame.size.height;
        _initialAngle = MathUtils::radiansToDegrees(atan((_initialWidth / 2) / (_initialHeight / 2)));
    
    // rotation routine
    
    - (void)rotatePlanWithDegrees:(double)degrees
    {
        double deltaDegrees = degrees - _degrees;
        _initialAngle -= deltaDegrees;
        double newAngle = _initialAngle;
        double newWidth = (_initialWidth / 2) * tan(MathUtils::degreesToRadians(newAngle)) * 2;
        double newHeight = newWidth * (_initialHeight / _initialWidth);
    
        NSLog(@"DEG %f DELTA %f A %f W %f H %f", degrees, deltaDegrees, newAngle, newWidth, newHeight);
    
        double currentScale = newWidth / _initialWidth;
    
        _planImageView.layer.affineTransform = CGAffineTransformScale(CGAffineTransformIdentity, currentScale, currentScale);
        _planImageView.layer.affineTransform = CGAffineTransformRotate(_planImageView.layer.affineTransform, (CGFloat) MathUtils::degreesToRadians(degrees));
    
        _degrees = degrees;
    
        self->_planImageView.center = _center;
    
    //    NSLog(@"%@", NSStringFromCGRect(_planImageView.frame));
    }
    

    example 编辑

    由于答案,我改写了程序,现在它开始工作了!

    - (void)rotatePlanWithDegrees:(double)degrees
    {
        double newWidth =
                _initialWidth  * abs(cos(MathUtils::degreesToRadians(degrees))) +
                _initialHeight * abs(sin(MathUtils::degreesToRadians(degrees)));
        double newHeight =
                _initialWidth  * abs(sin(MathUtils::degreesToRadians(degrees))) +
                _initialHeight * abs(cos(MathUtils::degreesToRadians(degrees)));
    
        CGFloat scale = (CGFloat) MIN(
                self.planImageScrollView.frame.size.width / newWidth,
                self.planImageScrollView.frame.size.height / newHeight);
    
        CGAffineTransform rotationTransform = CGAffineTransformMakeRotation((CGFloat) MathUtils::degreesToRadians(degrees));
        CGAffineTransform scaleTransform  = CGAffineTransformMakeScale(scale, scale);
        _planImageView.layer.affineTransform = CGAffineTransformConcat(rotationTransform, scaleTransform);
    
        self->_planImageView.center = _center;
    }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Yves Daoust    7 年前

    旋转矩形时 W X H ,边界框采用尺寸 W' = W |cos Θ| + H |sin Θ| , H' = W |sin Θ| + H |cos Θ| .

    如果你需要把它放在 W" X H" 矩形,比例因子是 W"/W' H"/H' .