2017-10-28 6 views
0

Ich habe eine UIButton auf Xib, die ein Rechteck ist, ich möchte ändern Sie den Rahmen mit einem Pfeil wie Ecke, aber behalten Sie es auf der XIB (von der Schnittstelle Builder), wie kann ich das tun?Ändern UIButton rect ohne drawRect

Ich weiß, dass ich das mit UIBezierPath in DrawRect tun kann, aber das ist nur eine benutzerdefinierte Form zu erstellen und aus Code hinzuzufügen.

Gibt es einen anderen Weg?

enter image description here Dies ist mein Code mit benutzerdefinierter Schaltfläche Klasse:

class ButtonContinue: UIButton { 

    var path: UIBezierPath! 

    override func awakeFromNib() { 
     backgroundColor = UIColor.green 
     addTarget(self, action: #selector(touchDown), for: .touchDown) 
    } 

    override func draw(_ rect: CGRect) { 

     path = UIBezierPath() 
     path.move(to: CGPoint(x: 32, y: 28 + (rect.size.height/2))) 
     path.addLine(to: CGPoint(x: 70, y: 28)) 
     path.addLine(to: CGPoint(x: rect.size.width, y: 28)) 
     path.addLine(to: CGPoint(x: rect.size.width, y: rect.size.height + 28)) 
     path.addLine(to: CGPoint(x: 70, y: rect.size.height + 28)) 
     path.close() 

     let shapeLayer = CAShapeLayer() 
     shapeLayer.strokeColor = UIColor.red.cgColor 
     shapeLayer.fillColor = UIColor.blue.cgColor 
     shapeLayer.path = path.cgPath 
     layer.addSublayer(shapeLayer) 
    } 

    func touchDown(button: ButtonContinue, event: UIEvent) { 
     if let touch = event.touches(for: button)?.first { 
      let location = touch.location(in: button) 

      if path.contains(location) == false { 
       button.cancelTracking(with: nil) 
      } 
     } 
    } 
} 
+0

Warum brauchen Sie es auf diese Weise? Ist es nicht einfacher ein Bild zu verwenden? –

+0

Möchten/müssen Sie wirklich prüfen, ob sich die Berührung innerhalb des Pfeilrahmens befindet? Ich würde nur ein Bild verwenden. –

Antwort

0

einfach auf das Bild legen Sie in Vermögenswerte des Projektes zur Verfügung gestellt. Und setzen Sie Schaltflächenbild auf das Bild in Assets.

self.imageView.image = UIImage(named: "imageName") 

Und wenn Sie Farbe der Linien des Bildes ändern möchten Sie die Bildwiedergabe auf alwaysTemplate einstellen

self.imageView?.image = UIImage(named: "imageName")?.withRenderingMode(UIImageRenderingMode.alwaysTemplate) 
self.imageView?.tintColor = .red