nub*_*bel 18 iphone cocoa-touch objective-c ios
假设我有一个图像(例如1024 x 768像素),它以UIImageView(例如300 x 300像素)显示.现在,我想将图像中的一个点(例如人的鼻子的位置(x:500,y:600))转换为UIImageView上的相应点,并考虑其contentMode.
如果在UIViewContentModeScaleToFill中修复了contentMode,转换将很容易.但如果它是UIViewContentModeScaleAspectFit,事情会变得更加复杂.
是否有一种优雅的方式来实现这一目标?我真的不想为每一个contentMode计算出来(我认为超过10个).
谢谢!
nub*_*bel 32
今天,我有一些空余时间来解决这个问题,并将它发布在GitHub上:UIImageView-GeometryConversion
它是UIImageView上的一个类别,它提供了将点和从图像转换为视图坐标并尊重所有13种不同内容模式的方法.
希望你喜欢!
nub*_*bel 10
这是我的快速解决方案:
- (CGPoint)convertPoint:(CGPoint)sourcePoint fromContentSize:(CGSize)sourceSize {
    CGPoint targetPoint = sourcePoint;
    CGSize  targetSize  = self.bounds.size;
    CGFloat ratioX = targetSize.width / sourceSize.width;
    CGFloat ratioY = targetSize.height / sourceSize.height;
    if (self.contentMode == UIViewContentModeScaleToFill) {
        targetPoint.x *= ratioX;
        targetPoint.y *= ratioY;
    }
    else if(self.contentMode == UIViewContentModeScaleAspectFit) {
        CGFloat scale = MIN(ratioX, ratioY);
        targetPoint.x *= scale;
        targetPoint.y *= scale;
        targetPoint.x += (self.frame.size.width - sourceSize.width * scale) / 2.0f;
        targetPoint.y += (self.frame.size.height - sourceSize.height * scale) / 2.0f;
    }
    else if(self.contentMode == UIViewContentModeScaleAspectFill) {
        CGFloat scale = MAX(ratioX, ratioY);
        targetPoint.x *= scale;
        targetPoint.y *= scale;
        targetPoint.x += (self.frame.size.width - sourceSize.width * scale) / 2.0f;
        targetPoint.y += (self.frame.size.height - sourceSize.height * scale) / 2.0f;
    }
    return targetPoint;
}
- (CGRect)convertRect:(CGRect)sourceRect fromContentSize:(CGSize)sourceSize {
    CGRect targetRect = sourceRect;
    CGSize targetSize  = self.bounds.size;
    CGFloat ratioX = targetSize.width / sourceSize.width;
    CGFloat ratioY = targetSize.height / sourceSize.height;
    if (self.contentMode == UIViewContentModeScaleToFill) {
        targetRect.origin.x *= ratioX;
        targetRect.origin.y *= ratioY;
        targetRect.size.width *= ratioX;
        targetRect.size.height *= ratioY;
    }
    else if(self.contentMode == UIViewContentModeScaleAspectFit) {
        CGFloat scale = MIN(ratioX, ratioY);
        targetRect.origin.x *= scale;
        targetRect.origin.y *= scale;
        targetRect.origin.x += (self.frame.size.width - sourceSize.width * scale) / 2.0f;
        targetRect.origin.y += (self.frame.size.height - sourceSize.height * scale) / 2.0f;
        targetRect.size.width *= scale;
        targetRect.size.height *= scale;
    }
    else if(self.contentMode == UIViewContentModeScaleAspectFill) {
        CGFloat scale = MAX(ratioX, ratioY);
        targetRect.origin.x *= scale;
        targetRect.origin.y *= scale;
        targetRect.origin.x += (self.frame.size.width - sourceSize.width * scale) / 2.0f;
        targetRect.origin.y += (self.frame.size.height - sourceSize.height * scale) / 2.0f;
        targetRect.size.width *= scale;
        targetRect.size.height *= scale;
    }
    return targetRect;
}
Run Code Online (Sandbox Code Playgroud)
当它被重构和优化时,我将在github上发布它并在此处发布链接.也许甚至那个片段对某人也有帮助.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           4345 次  |  
        
|   最近记录:  |