2015-09-16 6 views
0

Я изучаю Swift, и у меня возникают проблемы с перемещением UIView из разных функций. Если я использую это:animateWithDuration не отображается

ViewController:

let boardView = BoardView() 

@IBAction func startButtonTapped(sender: UIButton) { 
    view.addSubview(boardView.background) 
} 

Класс BoardView:

class BoardView : UIView { 

    let multiplier: CGFloat = 0.95 
    let screenSize = UIScreen.mainScreen().bounds 

    var background: UIView { 
     let boardSize: CGFloat = multiplier * screenSize.width 
     let board = UIView(
     frame: CGRectMake(-boardSize, 
     screenSize.height/2 - boardSize/2, 
     boardSize, 
     boardSize) 
    ) 

     board.layer.cornerRadius = 8.0 
     board.backgroundColor = UIColor.blackColor() 
     UIView.animateWithDuration(0.15, animations: { 
      board.center.x = self.screenSize.width/2 
     }) 
     return board 
    } 
} 

Анимационные работы (в качестве противоречащий образом, для меня). Если я пытаюсь переместить UIView из другой функции, например: кнопка

ViewController:

@IBAction func startButtonTapped(sender: UIButton) { 
    view.addSubview(boardView.background) 
    boardView.moveBackground() 
} 

BoardView:

class BoardView : UIView { 

let multiplier: CGFloat = 0.95 
let screenSize = UIScreen.mainScreen().bounds 

var background: UIView { 
    let boardSize: CGFloat = multiplier * screenSize.width 
    let board = UIView(
     frame: CGRectMake(-boardSize, 
     screenSize.height/2 - boardSize/2, 
     boardSize, 
     boardSize)) 

    board.layer.cornerRadius = 8.0 
    board.backgroundColor = UIColor.blackColor() 
    return board 
} 

func moveBackground() { 
    UIView.animateWithDuration(0.15, animations: { 
     self.background.center.x = self.screenSize.width/2 
    }) 
} 
} 

анимация не работает. Ничего не происходит, если я использую animateWithDuration в ViewController.

Как я могу переместить UIView из другого места, чем там, где я его создал?

+0

Имена вашего класса и переменных действительно запутывают. – dasdom

ответ

0

Ваш оригинальный код, хотя и странно работает, на самом деле плохо определен. Не следует начинать анимацию представления перед добавлением его в иерархию представлений. Вы с этим справляетесь, но не делайте этого.

В вашем втором подходе, который ближе к правильному, проблема заключается в том, что вы сделали background нелаким вычислимым свойством. Поэтому каждый раз, когда вы вызываете model.background, вы получаете другой объект.

Учитывая, как вы написали это, свойство для фона - это, вероятно, то, что вы на самом деле имеете в виду.

Как примечания @dasdom, BoardModel - очень плохое имя для представления. Это должно быть BoardView.

В общем, ваш поток немного странный. Я бы, наверное, добавил BoardView. Если контроллер фактически добавляет фон к другому виду (кроме BoardView), то это действительно странно, и вам нужно переосмыслить структуру кода.

+0

Спасибо за ваш ответ. Но Xcode уведомляет меня об ошибке: «lazy» не может использоваться для вычисленного свойства », когда я пытаюсь добавить его. – Danowsky

+0

Вы имеете в виду использование' addSubview' в функции в 'Boardview'? Я чувствую, что мне нужно сохранить фон в нелокальной переменной, чтобы я мог переместить его из другой функции. – Danowsky

+0

Хорошо, я исправил его с помощью функции, называемой 'setBackground()' и 'lazy var background: UIView = self.setBackground () '. Я до сих пор не знаю, странно ли это добавить вид в контроллере. – Danowsky

0

Когда вы обращаетесь к backgroundboardModel (это действительно плохое имя для представления!), Создается и возвращается новый вид. Я не думаю, что это то, что вы хотите.

+0

Спасибо за ваш ответ @dasdom. Я не удивлен, что это плохое имя. Если я прав в любых других именах переменных, это почти совпадение. Я так новичок в объектно-ориентированном программировании. Буду признателен за ваше имя UIView. – Danowsky

+0

Как насчет boardView? – dasdom

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