如何设置UIView的原点参考?

时间:2012-04-04 13:46:00

标签: ios xcode cocoa uiview

我正在创建一个UIImageView并将它添加到我的视图循环中,我将初始帧设置为0,0,1,47并且循环的每个段落我改变图像视图的中心以将它们分开。

我总是使用0作为origin.y

问题是原点引用位于图像视图的中心,假设我们在界面构建器中,这相当于下面的图像。

如何更改代码中的参考点?

enter image description here

4 个答案:

答案 0 :(得分:44)

在阅读完这些答案和你的评论后,我不确定你的观点是什么。

使用UIView,您可以通过2种方式设置位置:

  • center - 肯定说它是中心。
  • frame.origin - 左上角,无法直接设置。

如果您希望左下角位于x = 300,y = 300,您可以这样做:

UIView *view = ...
CGRect frame = view.frame;
frame.origin.x = 300 - frame.size.width;
frame.origin.y = 300 - frame.size.height;
view.frame = frame;

但是,如果你更深入到CALayers的魔法世界(不要忘记导入QuartzCore),你就会更强大。

CALayer有以下内容:

  • position - 你看,它没有明确地说'中心',所以它可能不是中心!
  • anchorPoint - CGPoint,其值在范围0..1(包括)中,指定内部视图。默认值为x = 0.5,y = 0.5表示“中心”(并且-[UIView center]采用此值)。您可以将其设置为任何其他值,position属性将应用于该点。

示例时间:

  1. 您的视图尺寸为100x100
  2. view.layer.anchorPoint = CGPointMake(1, 1);
  3. view.layer.position = CGPointMake(300, 300);
  4. 视图的左上角是x = 200,y = 200,右下角是x = 300,y = 300。
  5. 注意:旋转图层/视图时,它将围绕anchorPoint旋转,默认为中心。

    Bu因为你只是要求 HOW 来做特定的事情,而不是你想要实现的 WHAT ,我现在无法帮助你。

答案 1 :(得分:8)

对象的框架包括其在superview中的位置。您可以使用以下内容进行更改:

CGRect frame = self.imageView.frame;
frame.origin.y = 0.0f;
self.imageView.frame = frame;

答案 2 :(得分:2)

如果我理解正确,您需要设置您感兴趣的图像视图的框架。这可以通过以下简单的方式完成:

_theImageView.frame = CGRectMake(x, y, width, height);

显然你需要自己设置x,y,width和height。另请注意,视图的框架是参考其父视图。因此,如果您的视图位于左上角(x = 0,y = 0),并且是320点宽和400点高,并且您将图像视图的帧设置为(10,50, 100,50)然后将其添加为前一个视图的子视图,它将位于父视图坐标空间的x = 10,y = 50,即使图像视图的边界是x = 0,y = 0 。边界是参考视图本身,框架是指父母。

因此,在您的方案中,您的代码可能如下所示:

CGRect currentFrame = _theImageView.frame;
currentFrame.origin.x = 0;
currentFrame.origin.y = 0;
_theImageView.frame = currentFrame;

[_parentView addSubview:_theImageView];

或者,您可以说:

CGRect currentFrame = _theImageView.frame;
_theImageView.frame = CGRectMake(0, 0, currentFrame.size.width, currentFrame.size.height);

[_parentView addSubview:_theImageView];

任何一种方法都会将图像视图设置为您添加到其中的父级的左上角。

答案 3 :(得分:0)

我以为我会在Swift中削减这一点。

如果要通过在X和Y中为该视图指定原点的坐标来设置屏幕上的视图位置,只需一点数学运算,我们就可以确定视图中心应位于以便根据需要定位框架的原点。

此扩展程序使用视图框架获取宽度和高度。

计算新中心的公式几乎是微不足道的。参见下面的扩展名:

extension CGRect {
    
    // Created 12/16/2020 by Michael Kucinski for anyone to reuse as desired
    func getCenterWhichPlacesFrameOriginAtSpecified_X_and_Y_Coordinates(x_Position: CGFloat, y_Position: CGFloat)  -> CGPoint
    {
        // self is the CGRect
        let widthDividedBy2 = self.width / 2
        let heightDividedBy2 = self.height / 2
        
        // Calculate where the center needs to be to place the origin at the specified x and y position
        
        let desiredCenter_X = x_Position + widthDividedBy2
        let desiredCenter_Y = y_Position + heightDividedBy2
        
        let calculatedCenter : CGPoint = CGPoint(x: desiredCenter_X, y: desiredCenter_Y)
        
        return calculatedCenter // Using this point as the center will place the origin at the specified X and Y coordinates
    }
}

如下所示将原点放置在左上角区域:25像素:

// Set the origin for this object at the values specified
maskChoosingSlider.center = maskChoosingSlider.frame.getCenterWhichPlacesFrameOriginAtSpecified_X_and_Y_Coordinates(x_Position: 25, y_Position: 25)

如果您想将CGPoint而不是X和Y坐标传递给扩展名,则可以轻松进行更改。