【问题标题】:IOS Cant Reposition UIImageView at runtimeIOS无法在运行时重新定位UIImageView
【发布时间】:2016-01-27 13:30:37
【问题描述】:

我已经查看了关于此问题的其他问题,我的代码似乎遵循提供的解决方案,所以我不知道我哪里出错了。 我试图在屏幕加载时重置图像视图的位置。大小将取决于基础图像。

图像始终保留在界面构建器中放置的位置。图像视图没有任何限制。

我在哪里称呼它来自哪里有关系吗?我试过viewDidLoad()viewWillLoad()viewDidAppear()

代码

@IBOutlet weak var cameraPreview: UIView!
@IBOutlet weak var glassesOverlay: UIImageView!

    print("Before")
    print("overlay x: \(glassesOverlay.frame.origin.x)")
    print("overlay y: \(glassesOverlay.frame.origin.y)")
    print("overlay W: \(glassesOverlay.frame.width)")
    print("overlay H: \(glassesOverlay.frame.height)")


    let glassesOrigin = CGPointMake( (cameraPreview.frame.width / 2) - (glassesOverlay.frame.width / 2), cameraPreview.frame.height / 3)

    //let glassesOrigin = CGPointMake( 179.0, 179.0)
    let glassesWidth = cameraPreview.frame.width / 2.0
    let glassesSize = CGSizeMake(glassesWidth, glassesWidth / 4)

    //        glassesOverlay.frame.origin =  CGPointMake( (cameraPreview.frame.width / 2) - (glassesOverlay.frame.width / 2), cameraPreview.frame.height / 3)
    //        glassesOverlay.frame.size = glassesSize

    glassesOverlay.frame = CGRect(origin: glassesOrigin, size: glassesSize)

    //cameraPreview.subviews[0].frame = CGRect(origin: glassesOrigin, size: glassesSize)
    glassesOverlay.layer.borderColor = UIColor.purpleColor().CGColor
    glassesOverlay.layer.borderWidth = 2.0

    cameraPreview.layer.borderColor = UIColor.purpleColor().CGColor
    cameraPreview.layer.borderWidth = 2.0
    print("After")
    print("overlay x: \(glassesOverlay.frame.origin.x)")
    print("overlay y: \(glassesOverlay.frame.origin.y)")
    print("overlay W: \(glassesOverlay.frame.width)")
    print("overlay H: \(glassesOverlay.frame.height)")

如您所见,我已尝试显式设置具有相同结果的值。我正在打印前后的位置和尺寸,它们会打印更改后的值。

打印输出

Before
overlay x: 135.0
overlay y: 382.0
overlay W: 320.0
overlay H: 128.0
After
overlay x: 224.0
overlay y: 296.667
overlay W: 384.0
overlay H: 96.0

但它仍然不为所动。

【问题讨论】:

  • 可以在viewDidLayoutSubviews()中加入上面的代码吗?
  • @Vishnugondlekar 感谢您的输入,但这不起作用,唯一的效果是代码块被调用了两次

标签: ios swift uiimageview position


【解决方案1】:

您是否使用自动布局?然后修改约束而不是直接操作框架。修改约束后,需要

view.setNeedsLayout()
view.layoutIfNeeded()

如果您没有使用自动布局,这应该可以工作,除非旧框架与新框架匹配或插座持有的视图超出您的预期。

编辑

请查看how autolayout works。也有很好的 WWDC 视频来解释它。

【讨论】:

  • 老实说,我对自动布局一无所知(这是我的第一个 ios 项目)。我知道父视图使用约束定位在情节提要中,而子视图(图像视图)只是放置在父视图中,没有约束。
  • 那么你正在使用自动布局。尝试在界面构建器中添加定位视图的约束(与其他视图相关) - 无需代码。
  • 我在代码中执行此操作,因为我在预览中的位置与我看到组合/合并图像(父和子)时的位置相同。如果我使用约束设置它,我能以同样的方式放置它吗? width = half parent width, x = halh parent width - half child width, y = 1/3 parent height
  • 您可以定义相对于 IB 中最多一个其他视图的约束。但是,您可以在viewDidLayoutSubviews 中添加常量前导、顶部、高度和宽度约束并相应地设置它们的常量。
  • 所以你可以在 IB 中设置它们,然后在控制器中重置它们?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多