0

Я работаю над приложением, которое изменяет размеры фигур. Например, я использую представления.Создать Ограничения для изменения положения кнопки в представлении, измененного программно

Я обратил мое мнение:

enter image description here

И программно создал кнопку и добавил UIPanGestureRecognizer:

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet var rect: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let rectFrame = rect.frame 
     let selectorColor = UIColor(red: 0.000, green: 0.000, blue: 0.000, alpha: 0.700) 

     let resizeTopLeft = UIButton(frame: CGRect(x: rectFrame.size.width - 20, y: rectFrame.size.height - 20, width: 20, height: 20)) 
     resizeTopLeft.backgroundColor = selectorColor 

     let panTopLeft = UIPanGestureRecognizer(target: self, action: "panTopLeft:") 
     resizeTopLeft.addGestureRecognizer(panTopLeft) 

     rect.addSubview(resizeTopLeft) 
    } 

    func panTopLeft(gesture: UIPanGestureRecognizer){ 
     let location = gesture.locationInView(rect) 
     rect.frame.size = CGSize(width: location.x + 20, height: location.y + 20) 
    } 
} 

Во время выполнения, оно представлено следующим образом:

enter image description here

При перемещении по кнопке экрана вид изменяется так, как ожидалось. Но кнопка все еще находится в одном месте.

И это проблема: Мне нужно, чтобы вы изменяли размер изображения, когда кнопка позиционируется как ограничения. Я пытался сделать несколько ограничений, ни в чем не работал, как ожидалось.

Мой вопрос: Как создать ограничения для изменения положения кнопки на вид, измененный программно?

+0

Какой у вас UIButton? Cnat посмотрим, что ... Также не создавайте размеры ячеек UIButton, вы должны использовать ограничения. – Sana

+0

Кнопка была создана кодом. И это в моем коде, и пусть resizeTopLeft. – James

+0

Ах! Виноват! Я вижу, что вы позиционируете кнопку в верхнем левом углу, а затем хотите перенести ее с помощью координат 'location'? – Sana

ответ

1

Здесь вы должны использовать автоматическую компоновку. В противном случае вы должны установить положение кнопки также в селекторе т жесты.

Вот мое решение с автоматической компоновкой.

Этап 1: Добавить ограничения на верх, ширину и высоту для вашего вида. Как enter image description here

Шаг 2: Соедините ограничения ширины и высоты с помощью IBOutlet. как

@IBOutlet weak var rectHeightConstraint: NSLayoutConstraint! 
@IBOutlet weak var rectWidthConstraint: NSLayoutConstraint! 

Шаг 3: Добавить кнопку с Автокомпоновкой ограничениями

//Create UIButton 
    let selectorColor = UIColor(red: 0.000, green: 0.000, blue: 0.000, alpha: 0.700) 
    let resizeTopLeft = UIButton() 
    resizeTopLeft.backgroundColor = selectorColor 
    resizeTopLeft.translatesAutoresizingMaskIntoConstraints = false 

    //Add gesture recognizer 
    let panTopLeft = UIPanGestureRecognizer(target: self, action: "panTopLeft:") 
    resizeTopLeft.addGestureRecognizer(panTopLeft) 

    rect.addSubview(resizeTopLeft) 

    //Add auto layout constraints for the button 
    let views = ["resizeTopLeft" : resizeTopLeft] 

    let horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("H:[resizeTopLeft(20)]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views) 
    self.rect.addConstraints(horizontalConstraints) 

    let verticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:[resizeTopLeft(20)]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views) 
    self.rect.addConstraints(verticalConstraints) 

Шага 4: Высота обновления и шириной ограничений в кастрюле метода жеста.

func panTopLeft(gesture: UIPanGestureRecognizer) { 
    let location = gesture.locationInView(rect) 
    //To avoid zero sized view. 
    if (location.y < 0) || (location.x < 0) { 
     return 
    } 
    rectHeightConstraint.constant = location.y + 20 
    rectWidthConstraint.constant = location.x + 20 
} 
Смежные вопросы