it-swarm.com.de

Benutzerdefinierte UIBarButton-Elemente von UIButtons mit benutzerdefinierten Bildern - Ist es möglich, die Tap-Ziele zu vergrößern?

Ich mache UIBarButtons wie folgt:

// Create "back" UIBarButtonItem
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
backButton.frame = CGRectMake(0, 0, 28, 17);
[backButton addTarget:self action:@selector(backButtonTapped) forControlEvents:UIControlEventTouchUpInside];
backButton.showsTouchWhenHighlighted = YES;

UIImage *backButtonImage = [UIImage imageNamed:@"back-button.png"];
[backButton setBackgroundImage:backButtonImage forState:UIControlStateNormal];

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];

[toolBarItems addObject:backBarButtonItem];

Die Abzweigziele sind jedoch winzig. Genauer gesagt entsprechen sie der Größe der benutzerdefinierten Bilder. (Welche wiederum sind winzig.) Gibt es eine Möglichkeit, die Größe ihres Abzweigziels zu erhöhen?

(Hinweis: Durch Ändern der Frame-Eigenschaft der UIButtons wird das Bild nur gestreckt.)

14
Doug Smith

Kleine Änderungen an Ihrem Code werden das Zeug tun

Änderungen erforderlich:

  • Ich gehe davon aus, dass die Größe von backButtonImage{28,17} ist und setze den Schaltflächenrahmen auf CGRectMake(0, 0, 48, 37) `
  • entferne die backGroundImage und benutze setImage:
  • setze die Eigenschaft imageEdgeInsets auf UIEdgeInsetsMake(10, 10, 10, 10)

Ihr Code wird folgendermaßen aussehen:

UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
backButton.frame = CGRectMake(0, 0, 48, 37);
[backButton addTarget:self action:@selector(backButtonTapped) forControlEvents:UIControlEventTouchUpInside];
backButton.showsTouchWhenHighlighted = YES;

UIImage *backButtonImage = [UIImage imageNamed:@"back-button.png"];
[backButton setImage:backButtonImage forState:UIControlStateNormal];

backButton.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10);

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];

[toolBarItems addObject:backBarButtonItem];

Sie können den Wert für die frame und die imageEdgeInsets gemäß Ihren Anforderungen ändern.
Dieser Code hat bei mir funktioniert.

26
Prasad Devadiga

Sie können die width -Eigenschaft der UIBarButtonItem ändern

backBarButtonItem.width = x;

Leider kann man die Höhe übrigens nicht ändern, da es keine Höheneigenschaft gibt.

Sie können jedoch UIBarButtonItem und UIButton mit initWithCustomView in einem definierten Frame übergeben.

zum Beispiel:

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

    UIImage *backButtonImage = [UIImage imageNamed:@"back-button.png"];

   [button setBackgroundImage:backButtonImage forState:UIControlStateNormal];

    button.frame = CGRectMake(0, 0, width, height);

    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];

Wenn Ihr Bild gestreckt aussieht, achten Sie darauf, dass Sie das gleiche Seitenverhältnis beibehalten! Oder stellen Sie sicher, dass das Bild genau dieselbe Größe hat.

5
VGruenhagen

1) Fügen Sie Ihrem UIButton eine Kategorie hinzu
2) Fügen Sie der Kategorie neue Eigenschaften hinzu
3) Fügen Sie Ihre Methode hinzu, um die Zurück-Schaltfläche zu initialisieren
4) Override -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
5) ToolBarItems der Unterklasse

@implementation UIButton (yourButtonCategory)
@dynamic shouldHitTest; // boolean
@dynamic hitTestRect; // enlarge rect of the button
@dynamic buttonPressedInterval; // interval of press, sometimes its being called twice

-(id)initBackBtnAtPoint:(CGPoint)_point{
// we only need the Origin of the button since the size and width are fixed so the image won't be stretched
    self = [self initWithFrame:CGRectMake(_point.x, _point.y, 28, 17)];   
    [self setBackgroundImage:[UIImage imageNamed:@"back-button.png"]forState:UIControlStateNormal];

    self.shouldHitTest = CGRectMake(self.frame.Origin.x - 25, self.frame.Origin.y-10, self.frame.size.width+25, self.frame.size.height+25); // this will be the enlarge frame of the button
    self.shouldHitTest = YES;
    return self;
}


-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
BOOL shouldReturn = [super pointInside:point withEvent:event];
NSSet *touches = [event allTouches];
BOOL shouldSendTouches = NO;

for (UITouch *touch in touches) {
    switch (touch.phase) {
        case UITouchPhaseBegan:
            shouldSendTouches = YES;
            break;
        default:
            shouldSendTouches = NO;
            break;
    }
}


if(self.shouldHitTest){

    double elapse = CFAbsoluteTimeGetCurrent();
    CGFloat totalElapse = elapse - self.buttonPressedInterval;
    if (totalElapse < .32) {
        return NO;
        // not the event we were interested in
    } else {
                    // use this call

        if(CGRectContainsPoint(self.hitTestRect, point)){
            if(shouldSendTouches){
                self.buttonPressedInterval = CFAbsoluteTimeGetCurrent();

                [self sendActionsForControlEvents:UIControlEventTouchUpInside];
            }

            return NO;
        }
    }

}

return shouldReturn;

}


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

[super touchesBegan:touches withEvent:event];
UITouch *touch = [touches anyObject]; 
CGPoint touch_point = [touch locationInView:self];
[self pointInside:touch_point withEvent:event];
}

@end

Nehmen wir an, dass das Berührungsereignis nicht ausgelöst wird. Wir benötigen die Ansicht its in, um die Schaltfläche aufzurufen. In toolBarItems führen wir also Folgendes aus:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesBegan:touches withEvent:event];
    for(id subs in self.subviews){
        if([subs isKindOfClass:[UIButton class]]){
            [subs touchesBegan:touches withEvent:event];
        }
    }


}

dann ist es soweit. Wir vergrößern den Rahmen, ohne die eigentliche Schaltfläche zu vergrößern.

sie initialisieren einfach Ihren Button wie folgt: UIButton *btn = [[UIButton alloc]initBackBtnAtPoint:CGPointMake(0,0)];

Ich hoffe es hilft

3
Joshua

Wenn Sie initWithCustomView aufrufen, delegiert die UIBarButtonItem die Ereignisbehandlung an die benutzerdefinierte Ansicht, die in Ihrem Fall die UIButton ist. Im Gegenzug erhält die UIButton ihre Grenzen aus dem Bild, und als Hintergrundbild wird erwartet, dass sie gedehnt wird, um neue Grenzen nach Bedarf zu füllen.

Legen Sie stattdessen die Eigenschaften image und imageInsets direkt in UIBarButtonItem fest. Diese Eigenschaften werden in der übergeordneten Klasse UIBarItem deklariert. Möglicherweise möchten Sie auch deren Landschaftsvarianten festlegen.

1
Steven McGrath

Ändern Sie den Schaltflächenrahmen zu groß und ändern Sie die Linie

[backButton setBackgroundImage:backButtonImage forState:UIControlStateNormal];

zu:

[backButton setImage:backButtonImage forState:UIControlStateNormal];
1

Sie müssen drei Codezeilen ändern und hoffen, dass es funktioniert.

1) Ändern Sie die Breite der BackButton nach Ihren Wünschen.

2) Setze die Image von backButton anstelle der BackgroundImage von backButton

[backButton setImage:backButtonImage forState:UIControlStateNormal];

3) Setze auch die contentHorizontalAlignment von backButton

backButton.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft;
1
korat prashant

mmm ... für das, was Sie erreichen wollen - das ist keine Bilddehnung - gibt es einen einfachen Weg:

1) Verwenden Sie Gimp oder Photoshop und erstellen Sie eine transparente Ebene unter Ihrem Bild, so dass sie der gewünschten Größe entspricht.

2) Zusammenführen und Erstellen von Netzhaut- und Nicht-Netzhautbildern.

3) Aktualisieren Sie Ihren Code so, dass er die neue Bildgröße widerspiegelt.

4) Weisen Sie die Bilder zu und führen Sie dann Ihren Code aus.

Auf diese Weise wird das Originalbild nicht gestreckt, da die Grenzen den transparenten Teil des Bildes berücksichtigen.

Davon abgesehen können Sie dies wahrscheinlich alles programmatisch tun, aber ich bezweifle, dass dies eine gute Idee ist, es sei denn, Sie wollten sich aus anderen Gründen mit UIGraphics befassen.

1
Alex

Benutz einfach

[button setImage:backButtonImage forState:UIControlStateNormal];

anstatt

[backButton setBackgroundImage:backButtonImage forState:UIControlStateNormal];

und stellen Sie den Rahmen nach Ihren Wünschen ein. Das Bild wird dann zentriert und die Schaltfläche erhält die Berührung im angegebenen Rahmen.

Etwas wie das:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(50, 50, 50, 50);
[button setImage:backButtonImage forState:UIControlStateNormal];
1
Lukas Kukacka

Erhöhen Sie die UIButton-Frames (bis zur gewünschten Tap-Größe)

      button.frame = CGRectMake(0, 0, 56, 20);

Wenn Sie das Bild für die vollständige Schaltfläche sehen möchten, schreiben Sie bitte folgende Methode

      [backButton setBackgroundImage:backButtonImage forState:UIControlStateNormal];

Wenn Sie die tatsächliche Bildgröße sehen möchten (Keine Sorge, die Tippgröße ist nur Ihre Tastengröße)

      [backButton setImage:backButtonImage forState:UIControlStateNormal];

Und schlussendlich

      UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];

Hoffe es hilft dir!

0
Ganee....

sie sollten nur in der Lage sein, die Kanteneinsätze auf der Schaltfläche festzulegen.

stellen Sie daher den Rahmen der Schaltfläche so ein, dass er größer als das Bild ist, und setzen Sie dann die Kanteneinsätze auf die Schaltfläche.

um Ihre Breite auf jeder Seite um 10 Pixel zu vergrößern, sollte so etwas funktionieren

backButton.frame = CGRectMake(0,0,28,37);
backButton.imageEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 10);
0
andrew lattis