将CGRect标准化为0到1

时间:2013-04-16 15:51:22

标签: ios objective-c

CGRect值标准化以使它们在0和1(单位坐标系)之间的最佳方法是什么?

3 个答案:

答案 0 :(得分:14)

这样做的一个非常简洁的方法是:

CGAffineTransform t = CGAffineTransformMakeScale(1.0 / parentRect.size.width, 1.0 / parentRect.size.height);
CGRect unitRect = CGRectApplyAffineTransform(rect, t);

答案 1 :(得分:9)

这应该可以解决问题。您只需要按父视图或图层的宽度/高度划分所有内容。

CGFloat parentWidth = parentView.bounds.size.width;
CGFloat parentHeight = parentView.bounds.size.height;

CGRect rectToConvert = ...;

rectToConvert.origin.x /= parentWidth;
rectToConvert.origin.y /= parentHeight;
rectToConvert.size.width /= parentWidth;
rectToConvert.size.height /= parentHeight;

我们说这些种类和点都在“单位坐标系”中。您可以在Core Animation Programming Guide

中详细了解相关信息

答案 2 :(得分:0)

这个怎么样:

CGRect rectToConvert;
NSAffineTransform *n = [NSAffineTransform transform];
[n scaleXBy:rectToConvert.size.width 
        yBy:rectToConvert.size.height];
[n invert];

CGRect normalizedRect;
normalizedRect.origin = [n transformPoint:rectToConvert.origin];
normalizedRect.size   = [n transformSize: rectToConvert.size];

CGPoint anyPointINeedToConvert;
CGPoint convertedPoint = [n transformPoint:anyPointINeedToConvert];

我认为如果你必须这样做,这会让你更清楚发生什么,让你以明显的方式处理翻译。