Sie müssen wahrscheinlich benutzerdefinierte Zeichnung erstellen. Wenn Sie nur eine Ansicht strecken, wird das Aliasing verursacht und die Ansicht wird verformt.
Um dies zu tun, sollten Sie die Unterklasse UIView
und überschreiben drawRect
, um eine Art von Zeichnung zu tun, die auf Benutzerinteraktion reagieren kann.
Ich habe eine Beispielklasse erstellt:
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()
}
}
Dies wird einen Kreis zeichnen, sondern taperFactor
und heightFactor
Wechsel wird eine Dehnungseffekt geben. Wenn Sie heightFactor
auf 1.0 setzen, bedeutet dies, dass die Zeichnung die gesamte Höhe der Ansicht einnimmt und die Einstellung taperFactor
auf 1,0 bewirkt, dass das Ende der Zeichnung so breit wie der obere Kreis ist.
Um ein Gefühl dafür zu bekommen, wie heightFactor
und taperFactor
ändert die Zeichnung ändern, können Sie dann eine Pfanne Gestenerkenner dieser Ansicht hinzufügen und darin Aktion ist so etwas sagen wie:
@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
}
Sie heightFactor
und taperFactor
ändern um verschiedene Effekte zu erzielen. Dies ist nur ein Teil davon, wie man einen Refresh-Controller erstellt, scheint aber die Stoßrichtung Ihrer Frage zu sein.
Wie mache ich diese Animation durch Konturlinien? Und auf beiden Seiten in der rechten und linken –
verstehe ich nicht, was Sie "von Konturlinien" meinen. Ich würde vorschlagen, dass Sie nur Ihre eigene Frage stellen ... – Rob