UIButton границы и фоновое изображение - PullRequest
5 голосов
/ 20 декабря 2009

Что я хочу: граница, показывающая, выбрана ли кнопка UIB.

Фон: у меня есть несколько кнопок UIB, использующих прозрачные изображения, а не текст. Это кнопки переключения (т.е. могут быть включены или выключены).

Проблема: класс UIButton не дает пользователям никаких сведений о том, выбрана ли кнопка или нет, если только вы не измените что-либо еще о кнопке. Поскольку изображение не меняется в зависимости от состояния, мне нужно два из каждого изображения, одно нормальное, одно выбранное и установить одно для каждого состояния кнопки. Это раздражает. Я решил вместо этого изменить фоновое изображение, но это удаляет красивую границу на кнопке, я просто получаю прямоугольник моего фонового изображения, чёрт.

Возможные решения, которые мне не нравятся:

1) Создайте фон, соответствующий границе UIButton, и используйте его для выбранного. Мне это не нравится, потому что они не совпадают идеально, и я придирчив.

2) Создайте два изображения для каждой кнопки, по сути идентичные, но с другим фоном. Это кажется ненужной работой, и, поскольку эта проблема постоянно возникает, я хочу найти решение и на будущее.

Я надеюсь, что кто-то уже нашел приличное решение для этого. Заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 20 декабря 2009

Поскольку UIButton имеет два слоя изображения, изображение и фоновое изображение, я думаю, что вы могли бы добиться того, чего хотите, используя всего два фоновых изображения для всех ваших кнопок. Одно изображение показывает границу, а другое нет. Поменяйте местами фон, когда состояние управления изменилось.

1 голос
/ 07 ноября 2010
//
//  TabBarSingleton.h

#import <Foundation/Foundation.h>

@interface TabBarSingleton : UITabBarController <UITabBarControllerDelegate>{
    NSRecursiveLock *barLock;

    UIButton *Button;
    UIButton *favoriteButton;
}

@property(nonatomic, retain) UIButton *Button;
@property(nonatomic, retain) UIButton *favoriteButton;

- (void) ButtonPressed;
- (void) favoriteButtonPressed;

@end

///////////////////////////////////
0 голосов
/ 07 ноября 2010
//
//  TabBarSingleton.m

//  Created by ArunDhwaj on 9/7/10.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//


#import "TabBarSingleton.h"

@implementation TabBarSingleton

@synthesize Button, favoriteButton;


- (id) init
{
    if (self = [super initWithNibName: nil bundle: nil]) 
    {
        barLock = [[NSRecursiveLock alloc] init];
    }
    self.delegate = self;
    return self;
}

+ (TabBarSingleton *) defaultBar
{
}

- (void)viewDidLoad
{
    NSLog(@"TabBarSingleton: viewDidLoad");

    //Hiding TabBar 
    self.tabBar.hidden = YES;

    //Creating a UIView, its frame is same as tabBar frme
    CGRect tabbarFrame = self.tabBar.frame; 
    UIView* customTabbarView = [[UIView alloc] initWithFrame:tabbarFrame];

    UIImageView *newsFeedImg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"newsfeeds_normal.png"]];
    newsFeedImg.frame = CGRectOffset(newsFeedImg.frame, 0, 1);

    Button = [UIButton buttonWithType:UIButtonTypeCustom];
    [Button setFrame:newsFeedImg.frame];

    [Button setBackgroundImage:newsFeedImg.image forState:UIControlStateNormal];
    [Button setBackgroundImage:[UIImage imageNamed:@"newsfeeds_active.png"] forState:UIControlStateHighlighted];     
    [Button addTarget:self action:@selector(newsFeedsButtonPressed) forControlEvents:UIControlEventTouchUpInside];

    [customTabbarView addSubview:Button];
    //[newsFeedImg release];

    CGRect newsFeedFrame = newsFeedImg.frame;
    UIImageView *favoriteImg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"favorites_normal.png"]];
    favoriteImg.frame = CGRectMake(newsFeedFrame.size.width, newsFeedFrame.origin.y, newsFeedFrame.size.width, newsFeedFrame.size.height);

    favoriteButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [favoriteButton setFrame:favoriteImg.frame];

    [favoriteButton setBackgroundImage:favoriteImg.image forState:UIControlStateNormal];
    [favoriteButton setBackgroundImage:[UIImage imageNamed:@"favorites_active.png"] forState:UIControlStateHighlighted];     
    [favoriteButton addTarget:self action:@selector(favoriteButtonPressed) forControlEvents:UIControlEventTouchUpInside];

    [customTabbarView addSubview: favoriteButton];
    //[favoriteImg release];

    [self.view addSubview:customTabbarView ];

    [self newsFeedsButtonPressed];
}


- (void) newsFeedsButtonPressed
{
    NSLog(@"TabBarSingleton: newsFeedsButtonPressed");
    self.selectedIndex = 0;

    //Keeping Highlighted newsFeed tab
    UIImageView *newsFeedImg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"newsfeeds_active.png"]];
    [Button setImage: newsFeedImg.image forState:UIControlStateNormal];

    //Keeping normal others tab icons 
    UIImageView *favoriteImg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"favorites_normal.png"]];
    [favoriteButton setImage: favoriteImg.image forState:UIControlStateNormal];
}

- (void) favoriteButtonPressed
{
    NSLog(@"TabBarSingleton: favoriteButtonPressed");
    self.selectedIndex = 1;

    //Keeping Highlighted newsFeed tab
    UIImageView *newsFeedImg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"newsfeeds_normal.png"]];
    [Button setImage: newsFeedImg.image forState:UIControlStateNormal];

    //Keeping normal others tab icons 
    UIImageView *favoriteImg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"favorites_active.png"]];
    [favoriteButton setImage: favoriteImg.image forState:UIControlStateNormal];

#pragma mark  UITabBarControllerDelegate 

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
    NSLog(@"TabBarSingleton: shouldSelectViewController");
    return YES;
}

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    NSLog(@"TabBarSingleton: didSelectViewController");
}

- (void) dealloc
{
    //[barLock release];
    [super dealloc];
}

@end
0 голосов
/ 21 декабря 2009

Если вы хотите использовать только границы, то у вас есть только один вариант использования двух изображений для двух состояний, в противном случае, если ваша цель - провести различие между двумя состояниями, вы можете сделать это, слегка изменив альфа на выбранную кнопку это даст эффект, аналогичный кнопкам переключения, вы также можете отключить выбранную кнопку и включить ее снова при нажатии другой кнопки.

Надеюсь, это даст вам правильное представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...