Вам, скорее всего, потребуется выполнить индивидуальный рисунок. Просто растяжение представления приведет к тому, что будет сглаживание, и представление будет искажено.
Для этого вы должны подклассифицировать UIView
и переопределить drawRect
, чтобы сделать какой-то рисунок, который может реагировать на взаимодействие пользователя.
Я создал класс образца:
class CircleRefresh:UIView{
var taperFactor:CGFloat = 0.00{
didSet{
self.setNeedsDisplay()
}
}
var heightFactor: CGFloat = 0.40
{
didSet{
self.setNeedsDisplay()
}
}
var radius:CGFloat
{
return self.frame.size.height * 0.20
}
//Set this to add an arrow or another image to the top circle
var refreshImage:UIImage?{
didSet{
//
self.subviews.forEach{$0.removeFromSuperview()}
if let image = self.refreshImage{
let imageView = UIImageView(frame: CGRect(x:self.frame.size.width * 0.5 - self.radius,y:0.0,width:self.radius * 2.0,height:self.radius * 2.0))
imageView.image = image
imageView.contentMode = .ScaleAspectFit
imageView.layer.cornerRadius = imageView.frame.size.height * 0.5
imageView.layer.masksToBounds = true
self.addSubview(imageView)
}
}
}
override func drawRect(rect:CGRect)
{
UIColor.lightGrayColor().setFill()
let endCenter = CGPoint(x:self.frame.size.width * 0.5,y:self.frame.size.height * heightFactor - radius * taperFactor)
//top arc
let path = UIBezierPath(arcCenter: CGPoint(x:self.frame.size.width * 0.5, y:radius), radius: self.frame.size.height * 0.20, startAngle: 0.0, endAngle: CGFloat(M_PI), clockwise: false)
//left curve
path.addCurveToPoint(CGPoint(x:endCenter.x - radius * taperFactor,y:endCenter.y), controlPoint1: CGPoint(x:endCenter.x - radius, y:radius * 2.0), controlPoint2: CGPoint(x: endCenter.x - radius * taperFactor, y: radius * 2.0))
//bottom arc
path.addArcWithCenter(endCenter, radius: radius * taperFactor, startAngle: CGFloat(M_PI), endAngle: 0.0, clockwise: false)
//right curve
path.addCurveToPoint(CGPoint(x:endCenter.x + radius,y:radius), controlPoint1: CGPoint(x: endCenter.x + radius * taperFactor, y: radius * 2.0),controlPoint2: CGPoint(x:endCenter.x + radius, y:radius * 2.0))
path.fill()
}
}
Это будет нарисовать круг, но изменения taperFactor
и heightFactor
даст эффект растяжения. Установка heightFactor
в 1.0 означает, что рисунок будет занимать всю высоту изображения, а установка taperFactor
- 1.0 приведет к тому, что хвост чертежа будет таким же широким, как верхний круг.
Чтобы получить чувство для того, как меняется heightFactor
и taperFactor
меняет рисунок, вы можете добавить панорамирование жест распознаватель с этой точкой зрения, и в это действие что-то вроде:
@IBAction func pan(sender: UIPanGestureRecognizer) {
let location = sender.locationInView(self.view)
circle.heightFactor = location.y/self.view.frame.size.height
circle.taperFactor = circle.heightFactor * 0.5 - 0.20
}
Вы можете изменить heightFactor
и taperFactor
для достижения различных эффектов. Это только часть того, как создать контроллер обновления, но, похоже, это вопрос вашего вопроса.
Как сделать эту анимацию по контурным линиям? И с обеих сторон справа и слева –
Я не понимаю, что вы подразумеваете под «контурными линиями». Я бы на самом деле предложил вам просто написать свой собственный вопрос ... – Rob