установка пользовательского стиля UIButton в соответствии с его состоянием - PullRequest
0 голосов
/ 15 сентября 2011

Я создаю пользовательскую кнопку UIB в моей программе (не в IB), и мне бы хотелось, чтобы она показывала разные изображения в разных состояниях, поэтому я сделал:

UIImage *learnImg=[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"01" ofType:@"png"]];
self.learn=[[UIButton buttonWithType:UIButtonTypeCustom] retain];
[self.learn setFrame:CGRectMake(148, 108,254,97)]; 
[[self.learn imageView] setContentMode:UIViewContentModeScaleAspectFit];
[self.learn setImage:learnImg forState:UIControlStateNormal];

UIImage *learnSelected=[UIImage imageWithContentsOfFile:[[NSBundle mainBundle]   pathForResource:@"02" ofType:@"png"]];
[self.learn setImage:learnSelected forState:UIControlEventTouchDown];

[self.learn addTarget:self action:@selector(loadLearn:) forControlEvents:UIControlEventTouchUpInside];

Проблема в том, что два изображения имеют разные размеры, поэтому, когда я нажимаю на кнопку, положение кнопки переводится (я полагаю, это связано с поведением setFrame, поскольку расположение xy должно быть относительным) .

Я не мог придумать, как это исправить, все, что мне нужно, это убедиться, что кнопка находится в правильном положении во всех состояниях, в которых она находится. В любом случае, я могу установить полный набор стилей для каждой кнопки? состояние (кадр, изображения и т. д.)? Или какие-то другие мысли?

Спасибо!

Наконец-то я обошел эту проблему, заново установив центр кнопки с помощью двух событий действия: UIControlEventTouchDown и UIControlEventTouchCancel. Спасибо всем за комментарии.

Ответы [ 3 ]

0 голосов
/ 15 сентября 2011
       UIButton *deleteButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [deleteButton setFrame:CGRectMake(285, 5, 30, 30)];
        deleteButton.contentMode = UIViewContentModeScaleAspectFill;     
        UIImage *newImage12 = [UIImage imageNamed:@"x.png"];
        deleteButton.tag = indexPath.row;
        [deleteButton setImage:newImage12 forState:UIControlStateNormal];
        [deleteButton setImage:newImage12 forState:UIControlStateHighlighted];
        [deleteButton addTarget:self action:@selector(deleteRemindersMethod:) forControlEvents:UIControlEventTouchUpInside];

дать имя изображения в соответствии с вашими состояниями кнопки.

0 голосов
/ 15 сентября 2011

UIControlEventTouchDown не является состоянием кнопки.Это событие зарегистрировано кнопкой.Различные состояния для UIButton:

enum {
    UIControlStateNormal       = 0,                       
    UIControlStateHighlighted  = 1 << 0,                  // used when UIControl isHighlighted is set
    UIControlStateDisabled     = 1 << 1,
    UIControlStateSelected     = 1 << 2,                  // flag usable by app (see below)
    UIControlStateApplication  = 0x00FF0000,              // additional flags available for application use
    UIControlStateReserved     = 0xFF000000               // flags reserved for internal framework use
};
typedef NSUInteger UIControlState;
0 голосов
/ 15 сентября 2011

1.) Попробуйте установить фоновое изображение, используя setBackgroundImage:forState:, это растянет ваше изображение в соответствии с размером. Если вы не хотите этого, поэкспериментируйте со свойством imageEdgeInsets.

2.) Состояние, которое вы хотите для своего изображения касания, - UIControlStateHighlighted. Если вы хотите сделать что-нибудь. обычай с «выбранным» состоянием (selected свойство), вам нужно использовать комбинации состояний (UIControlStateSelected|UIControlStateHighlighted для выбранного + касание)

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