【问题标题】:Calculating Visible CGRect to crop a UIImageView [duplicate]计算可见 CGRect 以裁剪 UIImageView [重复]
【发布时间】:2019-05-20 21:03:50
【问题描述】:

我有一个 UIView。那个 UIView 里面有一个 UIImageView。 UIImageView 不符合自动布局约束。父 UIView 的边界被剪裁。 现在 UIImageView 的内容模式是 Aspect Fill,但 UIImageView 的大小总是被计算并设置为正在渲染的 UIImage 的大小。所以 UIImageView 的大小将永远等于 UIImage 的大小。

现在可以定位 UIImageView。它应用了平移手势。 UIImageView 正在根据用户的要求在父 UIView 中移动。

我的任务是将 UIImageView 的 UIImage 裁剪为仅父 UIVIew 的可见视口。核心裁剪图像不是问题,但找到可见的矩形是问题。

我不起作用的解决方案是将父 UIView 和子 UIImageView 的框架转换为窗口屏幕。然后找到新转换帧的交集。但这不起作用。这背后应该有一些我无法成功提出的简单数学。

这是我目前的代码。

CGRect imgFrame = [_pageImageView convertRect:_pageImageView.frame toView:nil];
CGRect viewportFrame = [_viewportView convertRect: _viewportView.frame toView:nil];

CGRect visibleRect = CGRectIntersection(imgFrame, viewportFrame);

CGImageRef imageRef = CGImageCreateWithImageInRect([_pageImageView.image CGImage], visibleRect);
UIImage *cropped = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);

我的目标是找到通过裁剪的父 UIVIew 可见的可见矩形,然后根据该可见矩形裁剪 UIImageView。重要提示:UIImageView 可以在父 UIView 中定位和移动。

编辑:由于我的内部原因,我不能像许多其他讨论中使用的那样使用 UIScrollView 进行裁剪。

【问题讨论】:

    标签: ios objective-c uiview cgrect


    【解决方案1】:

    您可以将图像视图放置在 UIScrollView 中而不是 UIView 中,这样可以更轻松地进行平移手势。 我有滚动视图有 UIImageView

    - (CGRect)imageCropRect
    {
        CGSize imageSize = self.image.size;
        CGSize contentSize = self.contentSize;
    
        CGRect cropBoxFrame = self.frame;
        CGPoint contentOffset = self.contentOffset;
        UIEdgeInsets edgeInsets = self.contentInset;
    
        CGRect frame = CGRectZero;
        frame.origin.x = floor((contentOffset.x + edgeInsets.left) * (imageSize.width / contentSize.width));
        frame.origin.x = MAX(0, frame.origin.x);
    
        frame.origin.y = floor((contentOffset.y + edgeInsets.top) * (imageSize.height / contentSize.height));
        frame.origin.y = MAX(0, frame.origin.y);
    
        frame.size.width = ceil(cropBoxFrame.size.width * (imageSize.width / contentSize.width));
        frame.size.width = MIN(imageSize.width, frame.size.width);
    
        frame.size.height = ceil(cropBoxFrame.size.height * (imageSize.height / contentSize.height));
        frame.size.height = MIN(imageSize.height, frame.size.height);
    
        return frame;
    }
    

    【讨论】:

    • 由于一些内部原因,我不能使用 UIScrollView,问题不在于平移手势和移动。他们都工作得很好也很容易。解决方案需要围绕给定的基础。
    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 2021-11-18
    • 2013-09-07
    • 2015-10-28
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多