2011-09-15 8 views
0

나는 (안 IB에서) 내 프로그램에서 사용자 지정있는 UIButton을 만드는 오전 나는 다른 상태에 다른 이미지를 표시하는 데 싶습니다, 그래서 내가 그랬어 :설정 사용자 지정있는 UIButton 스타일은 상태에 따라

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]; 

문제는 두 이미지가 서로 다른 크기를 가지므로 버튼을 클릭하면 버튼의 위치가 '변환'됩니다 (xy 위치가 상대이어야하므로 'setFrame'동작으로 인한 것입니다).

이 문제를 해결할 방법을 생각할 수 없습니다. 원하는 모든 상태의 버튼이 올바른 위치에 있는지 확인하는 것이 좋습니다. 어쨌든 각 버튼에 대한 스타일 세트를 설정할 수 있습니까? 버튼 상태 (프레임, 이미지 등)? 아니면 다른 생각?

감사합니다.

마지막으로 UIControlEventTouchDown 및 UIControlEventTouchCancel이라는 두 가지 동작 이벤트를 통해 단추 중심을 다시 설정하여이 작업을 수행했습니다. 모든 의견에 감사드립니다.

답변

0

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

감사하지만 이것은 또 다른 문제입니다. "UIControlStateHighlighted"상태에서 이미지를 설정하면 "UIControlStateSelected"도 포함되어 있어도 버튼이 설정 한 이미지로 변경되지 않습니다. 무슨 일이 벌어지고 있는지 전혀 모르겠다 : S – dreamy129

+1

버튼 동작 내에서'button.selected = YES; '를 사용하여 버튼의 상태를 적절히 변경하여 작동하는지 확인한다. – visakh7

0

1) setBackgroundImage:forState:을 사용하여 배경 이미지를 설정하면 크기에 맞게 이미지가 늘어납니다. 이 방법을 사용하지 않으려면 imageEdgeInsets 속성을 사용하여 실험 해보세요.

2.) "ontouch"이미지에 대해 원하는 상태는 UIControlStateHighlighted입니다. 당신이 sth을하고 싶다면. (+ ontouch 선택에 대한 UIControlStateSelected|UIControlStateHighlighted)는 "선택"상태 (selected 속성)와 사용자 정의 당신이 물리게의 조합을 사용할 필요가

+0

입니다. 의견을 보내 주셔서 감사합니다. 이미지의 크기는 실제로 "UIViewContentModeScaleAspectFit"속성으로 인해 버튼에 완벽하게 그려지며 사용자가 클릭 할 때 버튼이 커지도록하는 것이 나의 의도입니다. 어쨌든 버튼의 한 모서리를 한 위치에 고정시킬 수 있습니까? 언제든지 '커지면'전체 위치를 엉망으로 만들지는 않습니까? – dreamy129

+0

버튼의 '중앙'을 설정하고 경계를 설정하여 커서를 크게 만듭니다. 충분하지 않다면 레이어의 'anchorPoint' –

+0

감사합니다. 기본적으로 모든 것을 시도했지만 아무 것도 작동하지 않는 것 같습니다. 구체적으로, 이미지는 두 개의 원추형 기하학이며 지정된 공간에 맞게 변형됩니다. 예상 된 결과는 사용자가 버튼을 클릭 할 때 두 번째로 큰 원추가 첫 번째 겹치기 (해당 꼭짓점은 같은 위치에 유지됨)입니다. 가장 단순한 방법은 더 큰 콘을 이미지로 만들고 "숨겨진"속성을 제어하는 ​​것입니다. 프레임/경계 등을 사용하여 간단히 구현하면 구현하기가 너무 어려워 보입니다. > _ < – dreamy129

0
 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]; 

은 버튼 상태에 따라 이미지의 이름을 지정합니다.

관련 문제