【问题标题】:How to programmatically change a UIView's "origin" (as labeled in Xcode)?如何以编程方式更改 UIView 的“原点”(在 Xcode 中标记)?
【发布时间】:2012-10-23 18:06:24
【问题描述】:

您会注意到所附屏幕截图中的红色“+”/“箭头”字形。在 Xcode 中改变这个“原点”很容易。是否有一种以编程方式执行此操作的方法,或者这完全是 Xcode 抽象?

例如,我想以编程方式创建一个 UILabel 并通过计算右下角坐标来定位它。在 Xcode 中,我只需确保红色的“+”位于右下角的网格点上,并根据该“原点”定义 X、Y、Width 和 Height 参数。

【问题讨论】:

    标签: ios xcode uiview uikit


    【解决方案1】:
    myObject.origin = CGPointMake (0.0,0.0);
    

    【讨论】:

    • 不幸的是,这只是设置原点的“坐标”。我想改变“原点”实际引用的内容。见罗布的回答。默认情况下,“原点”指的是左上角,因此“原点”点为 0,0 且宽度为 35 意味着控件将向右延伸 35 个像素。那不是我想要的。我希望它扩展到 LEFT 35 像素。为此,“原点”本身必须指向右下角,而不是默认的左上角。在 Xcode IB 中尝试使用实际的 XIB,您就会明白我的意思。移动那个“+”号,观察 X、Y、宽度和高度值的变化。
    【解决方案2】:

    如果您不使用自动布局,您可以通过设置标签(或任何视图)的中心来定位代码中的标签(或任何视图)。所以如果你知道你希望标签的右下角在哪里,你可以减去标签的宽度和高度的一半来计算它的中心应该在哪里:

    CGPoint lowerRight = somePoint;
    CGRect frame = label.frame;
    label.center = CGPointMake(lowerRight.x - frame.size.width / 2,
        lowerRight.y - frame.size.height / 2);
    

    我建议这样做。

    但是,如果您愿意,您可以改为转到较低的级别。每个视图都有一个核心动画层,它实际上管理视图的屏幕外观。图层有一个anchorPoint 属性,默认为(0.5, 0.5),代表图层的中心。您可以将右下角的anchorPoint 设置为 (1, 1):

    label.layer.anchorPoint = CGPointMake(1, 1);
    

    现在标签的center实际上控制了它的右下角的位置,所以你可以直接设置:

    label.center = somePoint; // actually sets the lower right corner
    

    您需要将QuartzCore 框架添加到您的目标并导入<QuartzCore/QuartzCore.h> 以修改anchorPoint 属性。

    【讨论】:

    • 完美! “layer.anchorPoint”是我要找的。​​span>
    • 顺便说一下,当您更改红色原点定位器时,Interface Builder(Xcode 的 XIB/Storyboard 编辑器部分)实际上并没有修改视图层的锚点。无论原点定位器的设置如何,您的视图将始终以 (0.5,0.5) 的锚点从笔尖出来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多