将框架放在 UIImage 上不起作用

Place frame over UIImage not working

我有一个 UIView 需要放置在 UIImageView 内部的 UIImage 上的特定坐标处。框架的坐标是从左上角引用的,并且具有从原始图像引用的指定宽度和高度。

因此,为了制作框架,我首先使用以下 post 中的类别获取图像的 CGRect:UIImage size in UIImageView

然后我得到一个比例因子来缩小框架的大小,方法是取原始高度,将其除以缩放后的高度,然后将我的所有值除以它。

最后,我获取图像 CGRect 并添加帧的缩放位置值以获得视图的最终 CGRect。但是,框架始终位于所需位置的上方和右侧。谁能看出我做错了什么?

这是代码(新的只是一个具有正确框架参数的自定义对象):

CGRect imageBounds = [self.imageView displayedImageBounds];


        float scaleFactor = AppDelegate.usedImage.size.height / imageBounds.size.height;

        new.height /= scaleFactor;
        new.width /= scaleFactor;
        new.positionX /= scaleFactor;
        new.positionY /= scaleFactor;

        UIView *faceRectView = [[UIView alloc] init];
        faceRectView.tag = idx;
        faceRectView.backgroundColor = [UIColor whiteColor];

      faceRectView.frame = CGRectMake((imageBounds.origin.x + new.positionX), (imageBounds.origin.y + new.positionY), new.width, new.height);


        [self.view addSubview:faceRectView];

你能这样加吗

faceRectView.frame = CGRectMake((0.0), (0.0), new.width, new.height);

CGPoint 是一个 C 结构,用于定义坐标系中的一个点。这个坐标系的原点在iOS的左上角和OSX的左下角。也就是说,它的纵轴方向在iOS和OS X.

CGSize 是另一个简单的 C 结构,它定义了宽度和高度值,CGRect 有一个原始字段,一个 CGPoint 和一个大小字段,一个 CGSize。 origin 和 size 字段一起定义矩形的位置和大小。

在iOS和OSX上,一个应用程序有多个坐标系。例如,在 iOS 上,应用程序的 window 位于屏幕坐标系中,window 的每个子视图位于 window 的坐标系中。换句话说,视图的子视图总是位于视图的坐标系中。

以这个框架为例

并注意它与边界概念的不同之处

CGGeometry Reference 是结构、常量和函数的集合,可以更轻松地处理坐标和矩形。您可能 运行 进入类似于以下的代码片段:

CGPoint point = CGPointMake(self.view.frame.origin.x + self.view.frame.size.width, self.view.frame.origin.y + self.view.frame.size.height);

这段代码不仅难以阅读,而且非常冗长。我们可以使用 CGGeometry 参考中定义的两个方便的函数重写此代码片段。

CGRect frame = self.view.frame; CGPoint 点 = CGPointMake(CGRectGetMaxX(frame), CGRectGetMaxY(frame));

为了简化上面的代码片段,我们将视图的框架存储在一个名为 frame 的变量中,并使用 CGRectGetMaxX 和 CGRectGetMaxY。函数的名称是 self-explanatory.

CGGeometry Reference 将函数定义为 return 矩形的 x- 和 y-coordinates 的最小值和最大值以及位于矩形处的 x- 和 y-coordinates矩形的中心。另外两个方便的 getter 函数是 CGRectGetWidth 和 CGRectGetHeight。

最后总结一下,查看 CGRectMake 的实现。

CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
{
  CGRect rect;
  rect.origin.x = x; rect.origin.y = y;
  rect.size.width = width; rect.size.height = height;
  return rect;
}