【问题标题】:How to set a UIView's origin reference?如何设置 UIView 的原点参考?
【发布时间】:2012-04-18 05:41:18
【问题描述】:

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

我总是使用 0 作为 origin.y

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

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

【问题讨论】:

  • 你不能在 IB 中移动那个红色的东西吗?
  • 是的,但重点是How can I change the reference point in code ?

标签: ios xcode cocoa uiview


【解决方案1】:

在阅读了这些答案和您的 cmets 之后,我不太确定您的意思是什么。

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

  • 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 – 你看,它没有明确表示“中心”,所以它可能不是中心!
  • anchorPointCGPoint 的值在 0..1(包括)范围内,指定视图 inside 点。默认值为 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。

注意:当您旋转图层/视图时,它将围绕anchorPoint 旋转,默认为中心。

不过,既然你只是问如何做具体的事情,而不是什么你想实现,我现在不能再帮你了。

【讨论】:

  • 当我问这个的时候我很困惑。简而言之,Xcode 的 IB 功能您可以使用有用的面板设置 UIView 的指标,设置像素值,但您也可以将参考点从中心更改为中上、右上、左下等...这让我觉得我可以在代码中以某种方式做到这一点,但它只是一个有用的 UI,如果不是混淆 Apple 的 Xcode 的补充......
  • 我记得重点是通过将原点设置为右中心,然后将值设置为父视图的宽度,以更简单快捷的方式将子视图向右对齐。这意味着绕过需要做数学计算宽度减去子宽度等
  • 您可以使用frameBorderLeftframeOrigin 等属性轻松地在UIView 上创建一个cetagory,并手动实现这些访问器。然后你就更容易了。
  • anchorPoint 是纯粹的魔法,非常感谢!有一个稍微不同的问题,我正在缩放锚定在底部的视图。 anchorPoint 属性使这完全没有问题 - 删除了大约 20 行代码...
【解决方案2】:

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

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

【讨论】:

  • 您好,问题不是如何改变框架,而是如何改变原点的参考点。当前设置 y=0 意味着视图的中心放在 y=0,而不是顶部
  • 当你说起源时,你说的是哪个起源?框架的 origin.y 偏移量是其顶部在超级视图中的位置。视图有一个“中心”属性,但我不知道视图中有任何可移动的参考点。
  • 原点可能不是描述我的意思最好的词,你在 IB 中看到,你可以从左上角更改原点参考点,说中心,或中下,或右中.. . 看我附上的图片。好吧,我在代码中添加了一个视图,我想将原点(坐标)设置到父视图的顶部,所以说我会有 y=0。但是,似乎我的视图的原点参考点没有设置为默认设置的左上角,而是设置为中心(见图)。因此,当我设置 y=0 时,视图仅显示它的下半部分,因为该视图的中心设置为 y=0
  • @Daniel 您是否将此标记为已解决?我不认为它回答了你的问题。您找到解决方案了吗?
  • 你有同样的问题吗?这是因为 Xcode 的界面构建器在视觉上更容易布局事物。其实原点就是中心……
【解决方案3】:

如果我对您的理解正确,您需要设置您有兴趣移动的图像视图的框架。这可以在这样的简单情况下完成:

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

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

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

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];

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

【讨论】:

  • 您好问题是原点设置为该视图的绝对中心,我需要将其更改为左上角。
  • 如上所述,您只需将图像视图的 x 和 y 设置为 0, 0。这会将其放置在其父视图的 0, 0 处。
  • 我真正需要的是将视图的原点设置为已知点,而不用担心视图的大小。
  • 感谢 jmstone。这对我有帮助。
【解决方案4】:

我想我会在 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 坐标,那么您可以自己进行简单的更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多