iOS App 개발에서 UIButton 내부 컨트롤을 바꾸는 기본 방법에 대해 자세히 설명하다

5247 단어
UIButton 내부에는 기본적으로 다음과 같은 속성으로 액세스할 수 있는 UIImageView, UILAbel 컨트롤이 있습니다.
 
  
@property(nonatomic,readonly,retain) UIImageView *imageView;
@property(nonatomic,readonly,retain) UILabel     *titleLabel;

UIButton이 문자를 표시할 수 있는 이유는 내부 타이틀 레이블 때문이다. 즉, UIButton의 setTitle:forState: 방법으로 설정한 문자열이 타이틀 레이블에 표시되기 때문이다.
UIButton의 setImage: forState: 방법이 설정한 그림이 내부 이미지 뷰에 표시됩니다.
주의:1.단추의 문자나 텍스트 색을 설정하려면 아래의 방법을 사용해야 합니다
 
  
- (void)setTitle:(NSString *)title forState:(UIControlState)state;
- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state;

warnning: 타이틀 레이블에서 문자와 텍스트 색을 직접 가져올 수 없습니다. 예를 들어 다음 방법이 잘못되었습니다.
 
  
button.titleLabel.text = @"12323";
button.titleLabel.textColor = [UIColor redColor];

2. 버튼 내부의 작은 그림을 설정하려면 아래의 방법을 사용해야 한다.
 
  
- (void)setImage:(UIImage *)image forState:(UIControlState)state;

warnning: 이미지 뷰 설정 그림을 직접 가져올 수 없습니다. 예를 들어 다음과 같은 방법은 잘못된 것입니다.
 
  
button.imageView.image = [UIImage imageNamed:@"abc.png"];

자, 돌아본 다음에 본문의 주제로 들어갑니다~
UIButton 내부 컨트롤을 변경하면 UIButton에 title과 이미지를 설정하면 UIButton은 UIButton Label + UIImageView로 구성된 것과 같습니다.그러나 기본 형식은 고정되어 있습니다. 왼쪽은 UIImage이고, 오른쪽은 UIButtonLabel입니다.지금 이 button 위에 UIImage를 표시하고 싶으면, 이 button 아래에 UIButton Label을 표시하십시오.
우리는 위에서 말한 것을 실현하기 위해 컨트롤을 완전히 사용자 정의할 수도 있고, UIButton의 기초 위에서 내부 하위 컨트롤을 바꿀 수도 있다.여기에는 두 번째 방법을 채택한다.
1. 우선 하위 컨트롤의 위치를 바꾸려면 이 button을 가져와서 이미지 뷰와 title Label 속성에 접근하는 것이 가장 먼저 생각납니다.
우리는 우선 이 button에 대해 인쇄를 해서 내부의 구조를 볼 수 있다.
 
  
NSLog(@"%@", self.button.subviews);

인쇄 결과는 빈 그룹입니다!이게 어떻게 된 일입니까?
실제로 UIButton 내부의 하위 컨트롤은 마운트 게으름을 피운다. 즉, 상응하는 하위 컨트롤을 사용하지 않으면 마운트하지 않는다는 것이다.
그러면 우리는 이 두 컨트롤의 프레임에 값을 다시 부여합니다. 이렇게 하면 이 두 컨트롤을 불러올 수 있을 뿐만 아니라, 이 두 컨트롤의 프레임을 직접 바꾸어 이 두 컨트롤을 다시 배열하는 목적을 달성할 수 있는지도 볼 수 있습니다.
그러나 만약 당신이 이렇게 한다면 실제 보이는 이 button 내부에 변화가 없다는 것을 발견할 수 있을 것이다. 이것은 UIButton 내부 컨트롤을 직접 바꾸는 프레임은 다시 배열하는 목적을 달성할 수 없다는 것을 의미한다.
이어서 이 button 내부의 하위 컨트롤을 출력합니다.
 
  
NSLog(@"%@", self.button.subviews);

subviews라는 그룹에 현재 UIImageView + UIButton Label이 있습니다. 현재 값이 있습니다. (앞에 두 개의 컨트롤이 사용되어 게으름 피우고 있습니다.)
그러나 자세히 살펴보면 이 두 컨트롤의 프레임은 분명히 우리가 방금 값을 부여한 프레임인데 왜 이 프레임에 표시된 것이 아니겠는가?
인쇄된 프레임은 우리가 방금 설정한 것일 뿐이고, UIButton은 표시할 때 UIImageView와 UIButton Label의 내용에 따라 크기를 다시 계산하기 때문에, 하위 컨트롤러의 프레임을 바꾸더라도 하위 컨트롤러의 위치와 자수를 진정으로 변경할 수 없습니다.
2. 두 번째 사고방식은 UIButton을 계승하여 원래의 단추를 바탕으로 바꿀 수 있다는 것이다.
예를 들어 우리는 UIButton의 하위 클래스인 CYLButton을 만들고 CYLButton의 실현 파일에서 다음과 같은 방법을 실현한다.
 
  
- (CGRect)titleRectForContentRect: (CGRect)contentRect // label
{
    return CGRectMake(0, contentRect.size.width, contentRect.size.width, contentRect.size.height - contentRect.size.width);
}

- (CGRect)imageRectForContentRect: (CGRect)contentRect // image
{
    return CGRectMake(0, 0, contentRect.size.width, contentRect.size.width);
}

// contentRect UIButton bounds.size

// initWithFrame: UIButton
- (instancetype)initWithFrame: (CGRect)frame
{
      if (self = [super initWithFrame: frame]) {
        self.titleLabel.backgroundColor = [UIColor blueColor];
          self.titleLabel.textAlignment = NSTextAlignmentCenter;
          self.imageView.backgroundColor = [UIColor yellowColor];
      }
      return self;
}


이런 방법이 우리의 요구를 만족시킬 수 있다는 것을 볼 수 있다.그러나 폐단도 있다. 만약에 우리가 그 중의 한 방법에 설정한 어떤 것을 다른 방법에서도 사용하고 싶다면 매우 편리하지 않다.
3. 더 좋은 방법은layoutSubviews 방법을 다시 쓰는 것입니다. 왜냐하면 이 방법은 하위 컨트롤을 쉽게 조정할 수 있기 때문입니다.
 
  
- (void)layoutSubviews
{
    [super layoutSubviews];

      CGFloat imageW = self.bounds.size.width;
      CGFloat imageH = imageW;
      self.imageView.frame = CGRectMake(0, 0, imageW, imageH);

      CGFloat titleY = imageH;
      CGFloat titleW = imageW;
      CGFloat titleH = self.bounds.size.height - titleY;
    self.titleLabel.frame = CGRectMake(0, titleY, titleW, titleH);
}


이렇게 하면 이상할 수도 있다. 왜냐하면 방금 이 종류의 바깥쪽에서 우리도 이미지 뷰와 타이틀 레이블의 프레임을 바꿨는데 아무런 작용이 없었고layout Subviews 방법에서 똑같이 수정했기 때문이다. 왜 작용했을까?
방금 밖에서 하위 컨트롤의 프레임을 수정했지만, 내부의layoutSubviews 방법을 실행할 때 프레임을 이미지와 title에 대응하는 크기로 다시 설정합니다.현재 우리는layoutSubviews에서 그들의 프레임을 직접 수정합니다. 이것은 이전의 프레임을 기본 크기로 설정하는 절차를 덮어쓰는 것과 같기 때문에 지금은 성공할 수 있고 한 방법에서 변수를 공유할 수 있기 때문입니다.
또한 UIButton(예를 들어 CYLButton)에서 계승된 경우 데이터 모델이 있으면 CYLButton의setter 방법에서 하위 컨트롤에 값을 부여하려고 할 때 직접 이렇게 할 수 없음을 주의해야 한다.
 
  
self.imageView = ...
self.text = ...

셀프(CYLButton)는 UIButton에서 물려받은 것이기 때문에 이미지든 타이틀이든 모두 상태가 나뉘기 때문에 이렇게 해야 한다.
 
  
[self setImage...];
[self setTitle...];

그러니까 직접 수정할 수 있느냐 없느냐는 이 속성이 상태를 구분하지 않느냐에 달려 있다.컨디션을 나누면 바로 수정할 수 없다.

좋은 웹페이지 즐겨찾기