IOS 无法在运行时重新定位 UIImageView
IOS Cant Reposition UIImageView at runtime
我已经查看了有关此问题的其他问题,我的代码似乎遵循提供的解决方案,所以我不知道我哪里出错了。
我想在屏幕加载时重置图像视图的位置。大小将取决于基础图像。
图像始终保留在界面生成器中的位置。图像视图没有限制。
我从哪里称呼它重要吗?我试过 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
但依旧不为所动
您使用的是自动布局吗?然后修改约束而不是直接操纵框架。修改约束后,需要
view.setNeedsLayout()
view.layoutIfNeeded()
如果您没有使用自动布局,这应该可以工作,除非旧框架与新框架匹配,或者插座的视图与您预期的不同。
编辑:
请看how autolayout works。也有很好的 WWDC 视频解释它。
我已经查看了有关此问题的其他问题,我的代码似乎遵循提供的解决方案,所以我不知道我哪里出错了。 我想在屏幕加载时重置图像视图的位置。大小将取决于基础图像。
图像始终保留在界面生成器中的位置。图像视图没有限制。
我从哪里称呼它重要吗?我试过 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
但依旧不为所动
您使用的是自动布局吗?然后修改约束而不是直接操纵框架。修改约束后,需要
view.setNeedsLayout()
view.layoutIfNeeded()
如果您没有使用自动布局,这应该可以工作,除非旧框架与新框架匹配,或者插座的视图与您预期的不同。
编辑:
请看how autolayout works。也有很好的 WWDC 视频解释它。