2017-02-21 7 views
0

Я пытаюсь повернуть uiview поверх другого представления, используя ограничения. Вот что я сделалВращающийся вид с использованием ограничений - Swift

mediaContainer.addSubview(overlayView) 
keepBottomLeft() 
overlayView.layoutIfNeeded() 

func keepBottomLeft(overlayView: UIView) { 
    NSLayoutConstraint(item: overlayView, attribute:.width, relatedBy:.equal,toItem: mediaContainer, attribute:.width, multiplier: 0.8, constant: 0).isActive = true 
    NSLayoutConstraint(item: overlayView, attribute:.leading, relatedBy:.equal, toItem: mediaContainer, attribute:.leading, multiplier: 1, constant: 0).isActive = true 
    NSLayoutConstraint(item: overlayView, attribute:.height, relatedBy:.equal,toItem: nil, attribute:.notAnAttribute, multiplier: 1.0, constant: 26).isActive = true 
    NSLayoutConstraint(item: overlayView, attribute:.bottom, relatedBy:.equal, toItem: mediaContainer, attribute:.bottom, multiplier: 1, constant: 0).isActive = true 
    overlayView.transform = CGAffineTransform(rotationAngle: CGFloat(-M_PI_2)) 
} 

Нужно ли использовать опорную точку? Это то, чего я пытаюсь достичь?

From View A

To View B

Что я получаю

Может кто-то мне точку в правильном направлении?

+0

ли вы на самом деле хотите, чтобы ваш взгляд непрерывно вращаться с первого изображения на второе изображение? (Так что он будет наклоняться вверх по возрастающей диагонали, пока он не станет вертикальным, как ваше второе изображение?) –

+0

Я не анимация вращения здесь. Просто перейдите в новую позицию на IBAction. –

+0

Вы хотите, чтобы содержимое изображения было повернуто на 90 °, или только высоту и ширину для замены, а опорную точку отрегулировали? –

ответ

1

Ваш якорный пункт находится в центре желтого зрения; по умолчанию. Либо вы хотите переместить его в левое нижнее положение с помощью layer.anchorPoint = CGPoint (x: 0, y: 1) [Обратите внимание, что якорь находится в единичных координатах от 0 до 1, а не в точках]. Вам все равно потребуется дополнительный перевод x = height.

В качестве альтернативы вы можете объединить свои преобразования и переместить центр в точку, в которую вы хотите повернуть, выполнить поворот, а затем отменить свой перевод (это на самом деле типичный способ сделать это с помощью 3D-преобразований).

ОБНОВЛЕНИЕ: Здесь находится детская площадка. Обратите внимание, что вы объединяете матрицы в обратном порядке, чтобы вы применяли преобразования. У меня есть анимация здесь, так что вы можете разложить преобразования и посмотреть, что делает каждый из них:

  1. Переместите вид в начало координат (0,0) (это последнее преобразование)
  2. Поверните вид 90 градусы по часовой стрелке
  3. Переместите вид на половину его текущей ширины и вниз, чтобы его в нижней части надзора.

    import PlaygroundSupport 
    import UIKit 
    class V: UIViewController { 
        var overlayView = UIView() 
        override func viewDidLoad() { 
         super.viewDidLoad() 
         overlayView.translatesAutoresizingMaskIntoConstraints = false 
         view.addSubview(overlayView) 
         overlayView.backgroundColor = .yellow 
         overlayView.heightAnchor.constraint(equalToConstant: 26).isActive = true 
         overlayView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.8).isActive = true 
         overlayView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true 
         overlayView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true 
        } 
        override func viewDidAppear(_ animated: Bool) { 
         UIView.animate(withDuration: 1) { 
          let center = self.overlayView.center 
          let size = self.overlayView.bounds.size 
          self.overlayView.transform = 
           CGAffineTransform(translationX: self.view.bounds.size.height - size.width/2, y: -size.height/2) 
           .concatenating(CGAffineTransform(rotationAngle: CGFloat.pi/2) 
           .concatenating(CGAffineTransform(translationX: -center.x, y: -center.y))) 
         } 
        } 
    } 
    
    let v = V() 
    v.view.frame = CGRect(x: 0, y: 0, width: 200, height: 200) 
    PlaygroundPage.current.liveView = v 
    
+0

. После добавления ограничений: Я попробовал это 'overlayView.layer.anchorPoint = CGPoint (x: 0, y: 1); overlayView.transform = CGAffineTransform (translationX: overlayView.frame.size.height, y: 0) overlayView.transform = CGAffineTransform (rotationAngle: CGFloat (-M_PI_2)) '. Это придает overlayView сверху, но не близко к левому краю. Я что-то пропустил? –

+0

вы должны конкатенировать матрицы (т. Е. Умножить их вместе). https://developer.apple.com/reference/coregraphics/cgaffinetransform/1455996-concatenating –

+0

Я также пробовал это: 'overlayView.transform = CGAffineTransform (translationX: overlayView.frame.size.height, y: 0) .concatenating (CGAffineTransform (rotationAngle: CGFloat (-M_PI_2))) 'Это то, что я получаю http://imgur.com/a/8dPpC –

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