2015-09-08 6 views
8

Sto cercando di estendere la classe UIButton aggiungendo una proprietà cornerRadius che può essere modificata in fase di progettazione senza dover creare l'app. Sto usando la seguente classe di estensione:@IBestensione UIButton progettabile

import UIKit 

@IBDesignable 
extension UIButton { 

    @IBInspectable var cornerRadius :CGFloat { 

     get { 
      return layer.cornerRadius 
     } 

     set { 

      layer.cornerRadius = newValue 
      layer.masksToBounds = newValue > 0 
     } 
    } 

} 

Ma quando faccio un cambio della proprietà cornerRadius nello Storyboard non vedo il cambiamento accade dal vivo! Mi sto perdendo qualcosa!

risposta

15

Le estensioni non rispettano il qualificatore IBDesignable. Solo le sottoclassi effettive. Fastidioso ma vero.

+1

Forse in futuro avremo tale funzionalità! ( –

-6

provare questo codice:

@IBDesignable extension UIView { 
    @IBInspectable var borderColor:UIColor? { 
      set { 
       layer.borderColor = newValue!.CGColor 
      } 
      get { 
       if let color = layer.borderColor { 
        return UIColor(CGColor:color) 
       } 
       else { 
        return nil 
       } 
      } 
     } 
    } 

questo mostrerà effetto sul tempo di esecuzione

+1

war fa * questo mostrerà effetto su runtime * significa? '@ IBDesignable' e' @ IBInspectable' sono ganci per il generatore di interfacce.Essi sono irrilevanti durante il runtime. – vikingosegundo

+0

mease bordercolor non è mostrato nello storyboard o nel pennino , mostrerà quando l'applicazione è in esecuzione –

+0

Solo cercando di aggiungere chiarezza, mentre sì, il tuo codice funzionerebbe durante l'esecuzione, la domanda era intorno a '@ IBDesignable' e' @ IBInspectable', che sono per contrassegnare viste e proprietà che puoi quindi interagire con * in fase di progettazione * tramite Interface Builder e, sfortunatamente, Interface Builder non riconosce tali attributi quando vengono aggiunti a un'estensione. In altre parole, nell'esempio di codice, '@ IBDesignable' e' @ IBInspectable' non effettivamente fare qualsiasi cosa: funziona allo stesso modo se li rimuovi, o più esattamente, * non funziona in Interface Builder. – MarqueIV