2017-01-07 3 views
0

У меня есть этот проект SwiftySwitch.Как сделать UIView расти в UIView.animate() с точным радиусом угла?

Моя цель состоит в том, чтобы круг расширялся и уменьшал сохранение формы круга вместо того, чтобы иметь радиус угла, который больше, чем текущая высота круга в каждый конкретный момент анимации.

Эта обработка круга растущего код здесь:

func turnOn() { 
    let tempView = UIView(frame: CGRect(x: ballDiameter/2, y: ballDiameter/2, width: 0, height: 0)) 
    tempView.backgroundColor = onColor 
    tempView.layer.cornerRadius = ballDiameter/2 
    self.addSubview(tempView) 

    UIView.animate(withDuration: dotTravelTime, animations: { [weak self] in 

     //RIGHT HERE is the code for the circle to hold it's circular form 
     if self != nil { 
      tempView.frame = CGRect(x: 0, y: 0, width: self!.ballDiameter, height: self!.ballDiameter) 
      tempView.layer.cornerRadius = self!.ballDiameter/2 
     } 
     self?.layoutIfNeeded() 

    }) { [weak self] _ in 
     self?.backgroundColor = self!.onColor 
     tempView.removeFromSuperview() 
    } 
} 

func turnOff() { 
    let tempView = UIView(frame: CGRect(x: 0, y: 0, width: ballDiameter, height: ballDiameter)) 
    tempView.backgroundColor = onColor 
    self.addSubview(tempView) 
    self.backgroundColor = offColor 

    UIView.animate(withDuration: dotTravelTime, animations: { [weak self] in 

     //RIGHT HERE is the code for the circle to hold it's circular form 
     if self != nil { 
      tempView.frame = CGRect(x: self!.ballDiameter/2, y: self!.ballDiameter/2, width: 0, height: 0) 
      tempView.layer.cornerRadius = self!.ballDiameter/2 
     } 
     self?.layoutIfNeeded() 

    }) { _ in 
     tempView.removeFromSuperview() 
    } 
} 

Где я говорю прямо здесь это место, где я обрабатывать круг анимацию. Я использую временный UIView для обработки анимации, а затем удаляю представление после изменения цвета фактического представления позади него. TempView - это переключатель окружности, который вы видите с помощью скользящей анимации. Если вам нужна информация о моем дизайне, дайте мне знать. Я пробовал много вещей, и все было разрешено, когда круг был квадратом или имел чуть больший угловой радиус, чем я хотел. (Я думаю, что это сужая радиус закругления некоторые из оригинального размера, но это второстепенно.

+0

Вы пробовали автомат вместо изменения размера рамки? – dfd

+0

Автонастройка будет еще хуже. Проверьте комментарии ниже для правильных ответов @dfd – Sethmr

+1

@Matt очень хорошо. Рад, что он дал вам хороший ответ. – dfd

ответ

2

Моя цель состоит в том, чтобы сделать круг расширить и умалить поддержания формы круга

Тогда дон (cornerRadius) Маска к круговой траектории и анимация роста/усадки маски (и/или пути).

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

enter image description here

+0

Я новичок в анимации .... Я только что сделал переход, где я предпочитаю программно делать простые образы и виды, а не создавать изображение в эскизе. Просто дай мне немного времени с суровой критикой! – Sethmr

+0

Все наши серверы работают, поэтому я читаю ваши книги. Спасибо за весь этот материал! – Sethmr

+0

@Sethmr И ваш вопрос изменил книгу! Это вдохновило меня добавить этот пример: https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch04p130viewAnimationWithMask/MaskViewTest/ViewController.swift – matt

1

угловой радиус является свойством CALayer и не UIView. К сожалению, методы анимации UIView будут собирать только изменения значения ключа для свойств, связанных с UIView. Вы можете отдельно одушевить свойства слоя, но вам нужно сделать это с помощью CABasicAnimation. В качестве альтернативы вы можете реализовать drawRect и просто нарисовать круг с UIBezierPath вместо использования радиуса угла.

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