2013-06-22 8 views
28

Ho fatto il UIButton programmazioneCome aumentare l'area di selezione di UIButton?

togglebutton = [UIButton buttonWithType:UIButtonTypeCustom]; 
togglebutton.frame = CGRectMake(42, 15, 80, 21); 
[togglebutton addTarget:self action:@selector(toggleview) 
forControlEvents:UIControlEventTouchUpInside]; 
[togglebutton setImage:[UIImage imageNamed:@"squ.png"] forState:UIControlStateNormal]; 
[buttonView addSubview:togglebutton]; 

enter image description here

Si è guardato come il tasto destro sull'immagine sopra. Ora il requisito è che l'area di selezione di questo pulsante debba essere più di quella dell'immagine Uibutton. In modo che l'utente sarà in grado di fare clic sul pulsante facilmente toccando l'area vicino di un particolare pulsante.

[togglebutton setImageEdgeInsets: UIEdgeInsetsMake(0, -30, 0, -25)]; 

ho cercato di impostare la image inset ma rendendo il image irregular. Si prega di guardare questo problema.

+0

Come hai scelto questi riquadri e quali altri valori hai provato? – Wain

+0

Guarda questo e prova a cambiare la modalità di visualizzazione dell'immagine del pulsante, quindi dovrebbe funzionare con gli inserimenti e l'immagine dovrebbe rimanere la stessa - http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual /ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html –

+0

@Wain Ho impostato l'immagine inserita con la differenza di pulsante e dimensione dell'immagine –

risposta

44

È possibile raggiungere questo impostando il pulsante del contentEdgeInsets, ad esempio:

toggleButton.contentEdgeInsets = UIEdgeInsetsMake(0, 15, 0, 0); //set as you require 
+6

Secondo la dichiarazione di proprietà, avresti bisogno di valori negativi per il riquadro per aumentare l'area di selezione . Utilizzare questa proprietà per ridimensionare e riposizionare il rettangolo di disegno effettivo per il contenuto del pulsante. Il contenuto comprende l'immagine del pulsante e il titolo del pulsante. È possibile specificare un valore diverso per ciascuno dei quattro riquadri (superiore, sinistro, inferiore, destro). Un valore positivo riduce, o inserisce, quel bordo spostandolo più vicino al centro del pulsante. Un valore negativo espande, o supera, quel bordo. – kevinl

+0

Puoi anche impostarlo direttamente nello storyboard dal gui xcode. Per fare ciò seleziona il pulsante che vuoi e scegli "Identificatore identità", quindi aggiungi un "Attributo Definisci Runtime Utente" di nome "contentEdigeInsets" di tipo "Rect". Questo è talvolta più conveniente rispetto a farlo in codice. –

+1

FYI: i valori positivi aumentano l'area tappabile del pulsante. – duncanc4

3

Provare a utilizzare contentEdgeInsets proprietà dello UIButton.

-2

vorrei creare un UIView intorno a quel pulsante in modo da poter impostare la dimensione di quello che vuoi. Poi mi piacerebbe impostare il colore di sfondo del UIView per il colore chiaro (non impostare l'opacità a 0 o non verrà riconosciuto il gesto)

Quindi aggiungere un UIGestureRecognizer al UIView per gestire lo stesso IBAction

Di Naturalmente, molte persone incoraggerà/preferire l'uso dei edgeInsets

+1

questo non è sicuramente il modo corretto di risolvere questo problema. – cmyr

-2

Ecco un esempio di aumentare zona tangibile di costume UIButton:

UIImage *ButtonImage=[UIImage imageNamed:@"myimage.png"]; 
UIButton *myButton=[UIButton buttonWithType:UIButtonTypeCustom]; 
myButton.frame=CGRectMake(10, 25, ButtonImage.size.width/2+10, ButtonImage.size.height/2+10); 
[myButton setImage:ButtonImage forState:UIControlStateNormal]; 
myButton.imageEdgeInsets = UIEdgeInsetsMake(5, 5, 5, 5); 
[myButton addTarget:self action:@selector(crossButtonClick:) forControlEvents:UIControlEventTouchDown]; 
[self.view addSubview:myButton]; 

Spero che sarebbe utile.

0

Nel mio caso, l'immagine del mio pulsante è piccola e voglio aumentare l'area del pulsante senza aumentare la dimensione dell'immagine uibutton perché apparirà sfocata. Così ho aumentato la cornice del pulsante e poi l'immagine del pulsante setImageEdgeInsets. I valori positivi per edgeInsets si ridurranno e i valori negativi si espanderanno.

self.menuButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[self.menuButton addTarget:self 
        action:@selector(onSideBarButtonTapped:) 
     forControlEvents:UIControlEventTouchDown]; 
[self.menuButton setImage:[UIImage imageNamed:@"menu"] 
         forState:UIControlStateNormal]; 
self.menuButton.frame = CGRectMake(10, 3, 40, 40); 

Ora ho intenzione di ridurre le dimensioni dell'immagine in modo che il pulsante non appaia sfocato.

[self.menuButton setImageEdgeInsets:UIEdgeInsetsMake(10, 10, 10, 10)]; 
2

il codice qui sotto risolve i miei problema.Questo è un modo molto semplice, provate questo:

button.contentEdgeInsets = UIEdgeInsetsMake(15, 20, 10, 10); //Change x,y,width,height as per your requirement. 
16

Per Swift

È possibile ignorare func 'pointInside' di classe UIView per espandere cliccabile la zona.

override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { 
    // padding : local variable of your custom UIView, CGFloat 
    // you can change clickable area dynamically by setting this value. 

    let newBound = CGRect(
     x: self.bounds.origin.x - padding, 
     y: self.bounds.origin.y - padding, 
     width: self.bounds.width + 2 * padding, 
     height: self.bounds.height + 2 * padding 
    ) 
    return CGRectContainsPoint(newBound, point) 
} 

Usa come questo,

class MyButton: UIButton { 
    var padding = CGFloat(0) // default value 

    //func pointInside at here!! 
} 

Quando init il pulsante, impostare il padding personalizzato.

func initButton() { 
    let button = MyButton(frame: CGRect(x: 100, y: 100, width: 30, height: 30)) 
    button.padding = 10 // any value you want 
    view.addSubview(button) 
} 

quindi il pulsante è in cornice (x: 100, y: 100, larghezza: 30, altezza: 30)

e area cliccabile del pulsante potrebbe verificarsi nel telaio con (x: 90, y: 90, larghezza: 50, altezza: 50)

** Assicurati di controllare la sovrapposizione con qualsiasi altra vista, perché la sua area cliccabile è più grande di quanto sembri.

Aggiornamento per Swift 3

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { 
    let padding = CGFloat(10) 
    let extendedBounds = bounds.insetBy(dx: -padding, dy: -padding) 
    return extendedBounds.contains(point) 
} 
+2

Questa è la soluzione ideale per l'uso con il layout automatico. – GoldenJoe

+0

anche una soluzione ideale per coloro che hanno bisogno di regolare l'immagine di un pulsante senza compromettere la dimensione di successo –

+0

Il selettore non viene chiamato anche se il metodo 'pointInside (point: with)' sta restituendo 'true' – Saif

1

Per l'obiettivo C

Creare questa usanza UIButton classe e assegnarlo nel vostro pulsante. Quindi imposta questi valori delle proprietà da viewController.

//This is .h file 
    #import <UIKit/UIKit.h> 
     @interface CustomButton : UIButton 
     @property (nonatomic) CGFloat leftArea; 
     @property (nonatomic) CGFloat rightArea; 
     @property (nonatomic) CGFloat topArea; 
     @property (nonatomic) CGFloat bottomArea; 
     @end 



     //.m file is following 
     #import "CustomButton.h 
     @implementation CustomButton 

     -(BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event 
     { 
      CGRect newArea = CGRectMake(self.bounds.origin.x - _leftArea, self.bounds.origin.y - _topArea, self.bounds.size.width + _leftArea + _rightArea, self.bounds.size.height + _bottomArea + _topArea); 

      return CGRectContainsPoint(newArea, point); 
     } 
     @end 
2

in Xcode 9 è possibile effettuare le seguenti operazioni:

xcode 9 screenshot

che significa che si deve compensare l'immagine offset e offset contenuto per garantire un posizionamento immagine centrata.

Problemi correlati