Uibitton 서브 클래스에서 drawRect를 재정의하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/816024

  •  03-07-2019
  •  | 
  •  

문제

안녕. 사용자 정의 버튼에 텍스트를 작성해야합니다. 그래서 나는 Uibutton을 서브 클래스했다. -DrawRect에서 필요한 텍스트를 씁니다. 문제는 텍스트가 버튼 아래에 있다는 것입니다. 내 텍스트를 작성한 후 Uibutton의 DrawRect가 계속해서 내 위에 그려집니다.

나는 그림을하기 전에 전화를 기대하고 있지만 [Super DrawRect : rect]를 부르지도 않습니다. Uibutton의 DrawRect는 상관없이 부름을받을 것 같습니다.

어떤 아이디어? 감사.

도움이 되었습니까?

해결책

다른 사람들이 말했듯이, 당신은 Uibutton을 서브 클래스 할 필요가 없습니다. 사실 Uibutton이 꽤 복잡하기 때문에 (찾은 것처럼). 세 가지 옵션이 있습니다.

  • 버튼의 제목을 비워두고 원하는 위치의 버튼에 새 텍스트 필드를 추가하십시오.
  • 3.0을 사용하는 경우 버튼의 레이블 속성에 액세스하십시오. 레이블 자체는 읽기 만 읽지 만 그 속성 (프레임 포함)은 그렇지 않습니다.
  • 서브 클래스 UICONTROL. uicontrol은 uiview이므로 다른보기 - 텍스트와 이미지를 추가 할 수 있으며 액션 메시지 동작을 구현하는 uiview입니다.addTarget:action:forControlEvents:). Uibutton은 이것 위에 상태를 구현합니다.

Uibutton 's와 같은 것들이 필요하지 않은 경우 setTitle:forState: 그리고 관련 기능이지만 세 번째 옵션을 사용하는 이러한 컨트롤을 많이 사용하고 있습니다. 그렇지 않으면 첫 번째를 사용하십시오 (또는 두 번째는 3.0 인 경우).

다른 팁

이것은 나에게 잘 작동합니다 ... (복잡한 드로잉 코드를 무시하십시오).

  1. Uibutton의 서브 클래스를 만듭니다
  2. 스토리 보드에 Uibutton을 만듭니다
  3. Identity Inspector로 이동하여 사용자 정의 버튼 클래스의 이름을 입력하십시오.

여기 내 uibitton 코드 :

H 파일 :

#import <UIKit/UIKit.h>

@interface DoneButton : UIButton

@property (assign, nonatomic) BOOL selected;

@end

M 파일 :

 #import "DoneButton.h"

    @implementation DoneButton

    @synthesize selected = _selected;

    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
        }
        return self;
    }

    - (void)setSelected:(BOOL)selected
    {
        if (_selected != selected) {
            _selected = selected;
            [self setNeedsDisplay];
        }
    }


    - (void)drawRect:(CGRect)rect
    {
        // Drawing code

        if (_selected) {
            //// Color Declarations
            UIColor* color2 = [UIColor colorWithRed: 0 green: 0 blue: 0 alpha: 1];

            //// Bezier Drawing
            UIBezierPath* bezierPath = [UIBezierPath bezierPath];
            [bezierPath moveToPoint: CGPointMake(49.39, 31.25)];
            [bezierPath addLineToPoint: CGPointMake(49.39, 31.25)];
            [bezierPath addCurveToPoint: CGPointMake(46.64, 25.19) controlPoint1: CGPointMake(49.39, 29.02) controlPoint2: CGPointMake(48.38, 26.94)];
            [bezierPath addCurveToPoint: CGPointMake(44.3, 18.95) controlPoint1: CGPointMake(46.63, 22.72) controlPoint2: CGPointMake(45.88, 20.53)];
            [bezierPath addCurveToPoint: CGPointMake(42.44, 17.59) controlPoint1: CGPointMake(43.75, 18.4) controlPoint2: CGPointMake(43.13, 17.95)];
            [bezierPath addCurveToPoint: CGPointMake(38.07, 16.61) controlPoint1: CGPointMake(41.17, 16.93) controlPoint2: CGPointMake(39.67, 16.62)];
            [bezierPath addCurveToPoint: CGPointMake(33.15, 13.95) controlPoint1: CGPointMake(36.62, 15.18) controlPoint2: CGPointMake(34.95, 14.23)];
            [bezierPath addCurveToPoint: CGPointMake(32.78, 13.92) controlPoint1: CGPointMake(33.03, 13.93) controlPoint2: CGPointMake(32.9, 13.93)];
            [bezierPath addCurveToPoint: CGPointMake(32, 13.86) controlPoint1: CGPointMake(32.52, 13.89) controlPoint2: CGPointMake(32.26, 13.86)];
            [bezierPath addLineToPoint: CGPointMake(32, 13.86)];
            [bezierPath addLineToPoint: CGPointMake(32, 13.86)];
            [bezierPath addLineToPoint: CGPointMake(32, 13.86)];
            [bezierPath addLineToPoint: CGPointMake(32, 13.86)];
            [bezierPath addCurveToPoint: CGPointMake(31.38, 13.91) controlPoint1: CGPointMake(31.79, 13.86) controlPoint2: CGPointMake(31.59, 13.89)];
            [bezierPath addCurveToPoint: CGPointMake(30.85, 13.95) controlPoint1: CGPointMake(31.2, 13.92) controlPoint2: CGPointMake(31.02, 13.92)];
            [bezierPath addCurveToPoint: CGPointMake(26.92, 15.74) controlPoint1: CGPointMake(29.44, 14.17) controlPoint2: CGPointMake(28.12, 14.8)];
            [bezierPath addCurveToPoint: CGPointMake(25.94, 16.61) controlPoint1: CGPointMake(26.58, 16.01) controlPoint2: CGPointMake(26.25, 16.29)];
            [bezierPath addCurveToPoint: CGPointMake(24.13, 16.76) controlPoint1: CGPointMake(25.31, 16.61) controlPoint2: CGPointMake(24.71, 16.66)];
            [bezierPath addCurveToPoint: CGPointMake(19.7, 18.95) controlPoint1: CGPointMake(22.41, 17.06) controlPoint2: CGPointMake(20.88, 17.77)];
            [bezierPath addCurveToPoint: CGPointMake(17.36, 25.19) controlPoint1: CGPointMake(18.12, 20.53) controlPoint2: CGPointMake(17.37, 22.72)];
            [bezierPath addCurveToPoint: CGPointMake(14.61, 31.25) controlPoint1: CGPointMake(15.62, 26.94) controlPoint2: CGPointMake(14.61, 29.02)];
            [bezierPath addLineToPoint: CGPointMake(14.61, 31.25)];
            [bezierPath addCurveToPoint: CGPointMake(14.61, 31.25) controlPoint1: CGPointMake(14.61, 31.25) controlPoint2: CGPointMake(14.61, 31.25)];
            [bezierPath addCurveToPoint: CGPointMake(14.66, 31.92) controlPoint1: CGPointMake(14.61, 31.48) controlPoint2: CGPointMake(14.64, 31.7)];
            [bezierPath addCurveToPoint: CGPointMake(14.7, 32.4) controlPoint1: CGPointMake(14.67, 32.08) controlPoint2: CGPointMake(14.67, 32.24)];
            [bezierPath addCurveToPoint: CGPointMake(15.86, 35.44) controlPoint1: CGPointMake(14.86, 33.46) controlPoint2: CGPointMake(15.27, 34.48)];
            [bezierPath addCurveToPoint: CGPointMake(15.97, 35.64) controlPoint1: CGPointMake(15.9, 35.5) controlPoint2: CGPointMake(15.93, 35.57)];
            [bezierPath addCurveToPoint: CGPointMake(17.36, 37.32) controlPoint1: CGPointMake(16.36, 36.23) controlPoint2: CGPointMake(16.83, 36.78)];
            [bezierPath addCurveToPoint: CGPointMake(17.49, 38.98) controlPoint1: CGPointMake(17.36, 37.89) controlPoint2: CGPointMake(17.41, 38.44)];
            [bezierPath addCurveToPoint: CGPointMake(18.35, 41.7) controlPoint1: CGPointMake(17.65, 39.95) controlPoint2: CGPointMake(17.92, 40.87)];
            [bezierPath addCurveToPoint: CGPointMake(19.7, 43.55) controlPoint1: CGPointMake(18.7, 42.38) controlPoint2: CGPointMake(19.15, 43)];
            [bezierPath addCurveToPoint: CGPointMake(25.93, 45.89) controlPoint1: CGPointMake(21.28, 45.13) controlPoint2: CGPointMake(23.47, 45.88)];
            [bezierPath addCurveToPoint: CGPointMake(27.61, 47.28) controlPoint1: CGPointMake(26.47, 46.42) controlPoint2: CGPointMake(27.02, 46.89)];
            [bezierPath addCurveToPoint: CGPointMake(32, 48.64) controlPoint1: CGPointMake(28.96, 48.16) controlPoint2: CGPointMake(30.44, 48.64)];
            [bezierPath addLineToPoint: CGPointMake(32, 48.64)];
            [bezierPath addLineToPoint: CGPointMake(32, 48.64)];
            [bezierPath addLineToPoint: CGPointMake(32, 48.64)];
            [bezierPath addLineToPoint: CGPointMake(32, 48.64)];
            [bezierPath addCurveToPoint: CGPointMake(38.06, 45.89) controlPoint1: CGPointMake(34.23, 48.64) controlPoint2: CGPointMake(36.31, 47.63)];
            [bezierPath addCurveToPoint: CGPointMake(44.3, 43.55) controlPoint1: CGPointMake(40.53, 45.88) controlPoint2: CGPointMake(42.72, 45.13)];
            [bezierPath addLineToPoint: CGPointMake(44.3, 43.55)];
            [bezierPath addLineToPoint: CGPointMake(44.3, 43.55)];
            [bezierPath addCurveToPoint: CGPointMake(46.64, 37.31) controlPoint1: CGPointMake(45.88, 41.97) controlPoint2: CGPointMake(46.63, 39.78)];
            [bezierPath addCurveToPoint: CGPointMake(49.39, 31.25) controlPoint1: CGPointMake(48.38, 35.56) controlPoint2: CGPointMake(49.39, 33.48)];
            [bezierPath addLineToPoint: CGPointMake(49.39, 31.25)];
            [bezierPath closePath];
            [color2 setStroke];
            bezierPath.lineWidth = 1;
            [bezierPath stroke];


            //// Bezier 2 Drawing
            UIBezierPath* bezier2Path = [UIBezierPath bezierPath];
            [bezier2Path moveToPoint: CGPointMake(22.42, 29.85)];
            [bezier2Path addLineToPoint: CGPointMake(29.74, 37.17)];
            [bezier2Path addLineToPoint: CGPointMake(41.58, 25.33)];
            bezier2Path.usesEvenOddFillRule = YES;

            [color2 setStroke];
            bezier2Path.lineWidth = 1;
            [bezier2Path stroke];

        } else {

            //// Color Declarations
            UIColor* color3 = [UIColor colorWithRed: 0.5 green: 0.5 blue: 0.5 alpha: 1];

            //// Bezier 2 Drawing
            UIBezierPath* bezier2Path = [UIBezierPath bezierPath];
            [bezier2Path moveToPoint: CGPointMake(22.42, 29.85)];
            [bezier2Path addLineToPoint: CGPointMake(29.74, 37.17)];
            [bezier2Path addLineToPoint: CGPointMake(41.58, 25.33)];
            bezier2Path.usesEvenOddFillRule = YES;

            [color3 setStroke];
            bezier2Path.lineWidth = 1;
            [bezier2Path stroke];
        }
    }

버튼이 선택되면 첫 번째 코드를 그립니다. 그렇지 않으면 다른 코드를 그립니다. 페인트 코드를 사용하기 때문에이 방법을 선호합니다. 따라서 많은 시간을 절약 할 수 있으며 수천 개의 PNG 또는 JPEG를 만들 필요가 없습니다.

다른 답변 중 하나에 대한 귀하의 의견을 바탕으로, 이것은 "Z를 달성하기 위해 Y와 X를 어떻게해야합니까?"라고 묻는 경우입니다. 당신이 정말로 당신이 "어떻게 z를 달성합니까?"라고 물어야 할 때.

버튼이 이미지 옆 대신 이미지 위에 텍스트를 그릴 수 있도록하려면 이미지를 버튼의 배경 이미지로 만듭니다. 사용 setBackgroundImage:forState:,보다는 setImage:forState:, 그런 다음 제목을 정상적으로 설정하십시오.

어쨌든, 당신은 이미지를 drawRect:, 또는 텍스트를 하위 뷰로 이동하여 이미지 위에 그려집니다. 내가 언급 한 솔루션은 두 번째 옵션의 버전입니다.

텍스트를 추가하기 위해 Uibutton을 서브 클래스 할 필요는 없습니다. 다음은 UIViewController 서브 클래스의 -viewDidload 메소드 내에서 사용자 정의 버튼의 버튼 제목을 설정하는 예입니다.

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 44, 44);
[button setTitle:@"x" forState:UIControlStateNormal];
[self.view addSubview:button];

버튼의 글꼴 속성을 설정하거나 -settitlecolor : forstate :.를 사용하여 색상을 변경할 수도 있습니다.

버튼보기에 하위 뷰를 추가하는 것은 어떻습니까? 그러면 당신은 그것을 완전히 제어 할 수 있고 버튼이 무엇을했는지 신경 쓰지 않을 것입니다. 당신은 아마도 그것을 레이블로 만들고 DrawRect를 스스로 저장할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top