2016-01-27 3 views
0

Я рассмотрел другие вопросы по поводу этой проблемы, и мой код, похоже, соответствует предоставленным решениям, поэтому я не знаю, где я ошибаюсь. I ma пытается сбросить положение изображения при загрузке экрана. размер будет зависеть от базового изображения.IOS Cant Reposition UIImageView во время выполнения

Изображение всегда остается там, где оно было размещено в построителе интерфейса. На изображении нет ограничений.

Имеет ли значение, где я называю это From? я попробовал 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 

Но он остается неподвижным.

+0

Можете ли вы добавить вышеуказанный код в viewDidLayoutSubviews()? –

+0

@ Vishnugondlekar Спасибо за ввод, но это не сработало, единственный эффект, который у него был, был вызван код дважды. – Lonergan6275

ответ

2

Вы используете автоматическую компоновку? Затем измените ограничения, а не напрямую манипулируйте фреймом. После изменения ограничений, вам необходимо

view.setNeedsLayout() 
view.layoutIfNeeded() 

Если вы не используете автоматическую раскладку, это должно работать, кроме старого кадра соответствие новый кадр или выход держит другой вид, чем вы ожидаете.

Edit:

Пожалуйста, обратите внимание на how autolayout works. Есть хорошие видео WWDC, объясняющие это.

+0

Честно говоря, я ничего не знаю об автомаркете (это мой первый проект ios). Я знаю, что родительский вид помещается в раскадровку, используя ограничения, а дочерний элемент (вид изображения) просто помещается в родительские без ограничений. – Lonergan6275

+0

Затем вы используете автоматическую компоновку. Попытайтесь добавить ограничения, которые позиционируют представление в построителе интерфейса (применительно к другому представлению) - никакого кода не требуется. – SmokeDispenser

+0

Я делал это в коде, поскольку я должен быть тем же самым в предварительном просмотре, что и когда я использую объединенные/объединенные изображения (родительский и дочерний). если я установлю его с помощью ограничений, я смогу разместить его так же? 'width = half parent width',' x = halh parent width - half child width', 'y = 1/3 parent height' – Lonergan6275

Смежные вопросы