사용자 정의 컨트롤 주제 요약

10771 단어 Objective-C
아이폰에서 사용자 정의 컨트롤 실현 절차인 Objective-c는 모든 대상 간의 상호작용을 어떻게 실현합니까?(면접문제)답: Objective-C에서 모든 대상 간의 상호작용은 지침을 통해 이루어진다는 것을 기억해라.objective-c에서 어떻게 라인의 동기화를 실현합니까?(면접문제) 스레드 동기화와 스레드 비동기화는 어떤 차이가 있습니까?예를 들어 만약에 당신이 한 사람을 기다리고 동기화할 때 그녀가 온 후에야 다른 일을 할 수 있다. 이 과정은 당신을 기다리는 것 외에 아무것도 할 수 없다. 다른 단계로 갈 때 당신은 기다리고 있다. 아마도 게임을 하거나 신문을 볼 것이다. 그녀가 올 때까지 기다려야 당신의 대기 상태가 끝날 것이다. 동기화하는 과정은 프로세스의 모든 다른 조작을 막는다.동기화를 비동기식으로 전환하는 가장 흔히 볼 수 있는 방법은 프로세스의 대기 동작을 막아서 새로운 프로세스에 넣는 것입니다. 이 대기 작업에 모니터를 추가하면 대기 작업이 끝났을 때 대기 프로세스를 끝냅니다.1. 시스템 컨트롤에 기능을 확장하는 사용자 정의 컨트롤 2. 완전 리셋 컨트롤이다. 사용자 정의 컨트롤의 트리거 이벤트를 포함한다. 예를 들어 사용자 정의 버톤의 구체적인 실현, 예를 들어 사용자 정의 버톤은 두 가지 실현 방안을 사용할 수 있다.1. 응답 이벤트가 있고 UIButton의 사용자 정의 컨트롤을 직접 계승합니다.2. UIVIew에서 계승한 다음에 클릭 이벤트와 기타 일부 속성을 실현한다.UIView의 사용자 정의 컨트롤을 상속하는 응답 이벤트가 없습니다.사용자 정의 클래스터치에서 클릭 이벤트를 실현하고 아이폰 컨트롤 사용자 정의 컨트롤 개발: 다시 그리든지 그룹 아이폰 개발에서 필요에 따라 사용자 정의 컨트롤이 자주 필요하다.물론 원가와 품질을 고려하여 시스템 컨트롤러를 우선적으로 선택하십시오.진정으로 사용자 정의 컨트롤을 개발해야 할 때, 보통 두 가지 선택이 있다. 바로 다시 그리거나 조합하는 것이다.다시 그리는 것은 컨트롤을 다시 쓰는 그리기 함수입니다. 이 함수에서 원하는 효과를 그립니다.조합은 서로 다른 컨트롤러의 조합을 통해 수요를 만족시키는 컨트롤러를 형성하는 것이다.물론 사용자 정의 컨트롤의 수요에 따라 어떤 것은 다시 그리기에 적합하고 어떤 것은 조합에 적합하며 어떤 것은 두 가지 실현이 모두 적용된다.예를 들어 성급 컨트롤러는 프로젝트에서 비교적 자주 사용하지만 시스템에서 제공하지 않는 컨트롤러이다.이 컨트롤에 대해 우리는 또 어떻게 선택해야 합니까?다시 그리기 구현:

@interface StarRating:UIView{    
    int numberStars;    
    int rating;
}
@property int numberStars;
@property int rating;
- (id)initWithNumberOfStars:(int)numStars;
- (id)initWithNumberOfStars:(int)numStars initialRating:(int)initialRating;
@end
@implementation StarRating
- (void)drawRect:(CGRect)rect {    
    UIImage *onImage = [UIImage imageNamed:@"on.png"];    
    UIImage *offImage = [UIImage imageNamed:@"off.png"];    
    for (int i=1; i<=[self numberStars]; i++)    {        
        UIImage *img = (i <= [self rating]) ? onImage : offImage;        
        CGPoint imagePoint;        
        imagePoint.x = BTN_WIDTH * (i-1);        
        imagePoint.y = 0.0f;        
        [img drawAtPoint:imagePoint];    
    }
}
@end

그 중에서 묘사 부분은 성급 rating에 따라 그림을 선택하고 성급 이하는 on을 사용한다.png, 성급 이상의off.png. 조합 구현:

@interface StarRating: UIControl {
    NSMutableArray            *starArray;
    NSInteger                     numberStars;
    NSInteger                     rating;
}
-(id)initWithFrame:(CGRect)frame andStars:(NSInteger)inNumStars;
@end
@implementation StarRating
-(id)initWithFrame:(CGRect)frame andStars:(int)inNumStars {   
    if (self = [super initWithFrame:frame])    
    {        
        approxMode = InterpolationMode_Half;        
        starNum = inNumStars;       
        [self prepareStars:starNum frame:frame];    
    }   
    return self;
}
-(void)setRating:(int)aRating{   
    rating= aRating;   
    [self fillStars];
}
- (void) prepareStars: (int)aStarNum frame: (CGRect)frame {
    starArray = [[NSMutableArray alloc] initWithCapacity:aStarNum];
    float width = frame.size.width/aStarNum;
    float height = frame.size.height;
    for(int i=0; i < aStarNum; i++) {
        UIImageView * star = [[UIImageView alloc] initWithFrame:CGRectMake(0+(i*width), 0, width, height)];
        [starArray addObject:star];
        [self addSubview:star];
        [star release];
    }
}
- (void)fillStars{    
    UIImage *onImage = [UIImage imageNamed:@"on.png"];    
    UIImage *offImage = [UIImage imageNamed:@"off.png"];    
    for (int i=1; i<=[self numberStars]; i++)    {           
       UIImage *img = (i <= [self rating]) ? onImage : offImage;   
       UIImageView *star = (UIImageView *)[self subViewAtIndex:i]; 
    [star setImage:img];
    }
}

여기서 는 5개의 UIImageView 하위 컨트롤을 미리 만든 다음 성급 rating에 따라 하위 컨트롤의 그림 속성을 설정합니다.대비: 1 재구성 방안은 자신에게 하나의 컨트롤러만 있고 조합 실현은 다섯 개의 하위 컨트롤러를 포함한다.자원과 효율을 다시 그리는 방안이 비교적 우세할 것이다.2 다시 그리기는 묘사를 처리해야 하고 조합은 하위 컨트롤이 묘사를 책임진다.따라서 묘사 처리에서 조합 방안이 비교적 간단할 때 3가지 수요 변경이 필요할 때 재구성 방안은 묘사 코드를 수정해야 할 수 있고 조합 방안은 합리적인 디자인에서 하위 컨트롤을 쉽게 바꿀 수 있는 유형이다.아이폰에서 자동 그리기 실현 절차 1.계승@interface MyView: UIView {2. 실현-(void)drawRect: (CGRect)rect 3. 새로 생성된view를 디스플레이에 추가하기 위해ddSubView를 호출합니다

addSubView[window addSubview:viewController.view]; 

4. 샘플 코드

- (void)drawRect:(CGRect)rect { 
    // create the bitmap context 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(nil,100,100,8,400, colorSpace,kCGImageAlphaPremultipliedLast); 
    CFRelease(colorSpace); 
    //    create an arrow image 
    // set the fill color 
    CGColorRef fillColor = [[UIColor blackColor] CGColor]; 
    CGContextSetFillColor(context, CGColorGetComponents(fillColor)); 
    
    CGContextBeginPath(context); 
    CGContextMoveToPoint(context, 8.0f, 13.0f); 
    CGContextAddLineToPoint(context, 24.0f, 4.0f); 
    CGContextAddLineToPoint(context, 24.0f, 22.0f); 
    CGContextClosePath(context); 
    CGContextFillPath(context); 
    CGContextSelectFont ( context, "Arial", 10.f, kCGEncodingMacRoman ); 
    CGContextSetRGBFillColor ( context, 0.0f, 0.0f, 0.f, 1.f ); 
    CGContextSetShouldAntialias ( context, 0 );    
    CGContextShowText(context, "hh", 2); 
    
    // convert the context into a CGImageRef 
    CGImageRef image = CGBitmapContextCreateImage(context); 
    CGContextRelease(context); 
    
    UIImage* image2 = [UIImage imageWithCGImage:image]; 
    [image2 drawInRect:CGRectMake(0, 0, 120, 160)]; 
    
    NSString* myStr = @" "; 
    UIFont* font = [UIFont systemFontOfSize:12.0]; 
    [myStr drawInRect: CGRectMake(160, 240, 100, 130) withFont:font lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter]; 

사용자 정의 컨트롤 아이폰/ipad 1, 가장 흔히 볼 수 있는 것은 button이고 가장 간단한 것이다. 애플은 이미 봉인되어 있다. 애플의 type을custom으로 설정하고 백그라운드를 설정하면 된다.2, segemented control,xib에 대응하는 segement에 이미지를 설정하면 됩니다. 그러나 주의해야 할 것은 모든 그림의 폭이 70일 수 있다고 가정하면 segemented control의 폭은 조금 짧아야 합니다. 66이면 됩니다.내가 예전에 실천할 때 그 자체의 넓이에 따라 설정하면 중간 연결 부분이 보기 싫었다.3, navigation bar 사용자 정의도 매우 흔합니다. 제가 사용하는 방법은 이미지뷰를 정의한 다음에 insertSubview를 0층으로 하는 것입니다.그러나 이런 방법으로는 시스템navigation bar 자체의 제목을 단추로 덮는 것이 좋지 않다.그래서 우리는 때때로 제목, 단추를 다시 사용자 정의한 다음에addsubview를bar에 올려야 한다. 구체적으로 내가 아래에 준 demo를 참고할 수 있다.4. 검색 바는 사용자 정의로 처음에 정의할 수 없다고 생각했는데 나중에 qq음악에서 예쁜 검색 바를 보고 연구를 시작했습니다.내비게이션 표시줄과 유사합니다. 이번에는 insertSubview를 1층으로 이동해야 합니다. 이미지view의 폭은 search bar의 기본 높이 44로 설정하는 것이 좋습니다.다음에 우리는 그 위에 있는 단추를 사용자 정의할 수 있다. 우리는 그 하위 보기를 출력하고, 단추의 층을 찾아서, 단추를 꺼내서 다시 정의할 수 있다.5, 그리고 흔히 볼 수 있는 사용자 정의가 필요한,tableViewCell.사용자 정의cell의 방법은 사실 매우 많다. 나는 주로 내가 자주 사용하는 방법을 말한다. 먼저xib 파일을 추가하는데 그 안에는tableviewcell만 있다. 이 xib 파일에 대응하는 주요 클래스는 사용자 정의가 필요한 클래스가어야 한다. cell에 사용자 정의 그림과 label을 설정하고 대응하는 tag를 1과 2로 설정한다.그 주 클래스에서uitableviewcell을 정의하고 아까의xib 파일에 연결합니다.6.tabbarcontroller도 사용자 정의할 수 있다. 내가 말한 것은 내가 성공한 방법을 실천한 것이다. tabbarcontroller 종류의 파일을 다시 쓰는 것은 주로tababr을 숨기는 것이다.다음은 app 파일에viewcontroller를 정의하고 방금tabbarcontroller의 클래스 파일인 insert를 0층으로 이동하면 됩니다.구체적으로는 나의 이전 데모를 참고할 수 있다.오늘은 슬라이딩 스크롤리뷰와 페이지 나누기 효과에 대해 말씀드리겠습니다. xib에 스크롤리뷰를 그린 후에 저희가...m 파일에서 그림 데이터를 초기화합니다.간단하게 설명하자면, 두 개의 순환은 그림을 scrollview에 추가하는 것입니다. 그 중에서ImageViewForScrollView는 그림의 클릭 이벤트를 처리하는 데 사용되는 사용자 정의 이미지뷰입니다.안에서 가장 관건적인 것은 어떻게 모든 그림의 위치를 설정하는가이다. scrollview의 콘텐츠 Size를 설정하는 것을 잊지 마라. 반드시 실제 내용의 폭과 일치해야 한다. 또한scrollview의 폭보다 크다. 그렇지 않으면 미끄러지지 않는다.그림 아래 부분에 페이지 컨트롤러를 추가하면 페이지 컨트롤러를 어떻게 제어할 것인가? 대부분의 IOS 응용 프로그램의 개발 과정에서 IB를 사용하지 않기 때문에 코드를 사용하여 인터페이스 컨트롤러를 사용자 정의하는 것이 특히 중요하다.본고는 코드로 BUTTON 컨트롤을 사용자 정의하는 방법을 소개한다.

UIButton *pBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect];   // button 
[pBtn setTitle:@"MyButton" forState:UIControlStateNormal];  
[pBtn setFrame:CGRectMake(10, 20, 80, 30)];  
[pView addSubview:pBtn];   
// :
[pBtn addTarget:self action:@selector(buttonTest:)forControlEvents:UIControlEventTouchUpInside];

- (void)buttonTest:(id)sender
{
NSLog(@"button test");
}

사용자 지정 버튼 2

UIButton *Btn;
CGRect frame;       
Btn = [[UIButton buttonWithType:UIButtonTypeCustom] retain]; //       
[Btn setImage:[UIImage imageNamed:@“aaa.png”] forState:UIControlStateNormal];//   
Btn.tag = 10;  
frame.size.width = 59;  //   
frame.size.height = 59;   //    
frame.origin.x =150;   //     
frame.origin.y =260;    
[Btn setFrame:frame];     
[Btn setBackgroundColor:[UIColor clearColor]];     
[Btn addTarget:self action:@selector(btnPressed:)forControlEvents:UIControlEventTouchUpInside];  //    
[self.view addSubview:Btn];      
[Btn release];

-(void)btnPressed:(id)sender
 {
     // 
}

코드로 TextField 컨트롤과 Button 컨트롤을 생성했는데 트리거 이벤트는 어떻게 추가합니까?

UITextField *textField=[[UITextField alloc] init];// 
[textField addTarget:selfaction:@selector(valueChanged:)forControlEvents:UIControlEventValueChanged];// textField 
-(void)valueChanged:(id)sender {     
   //....  statement
} 

코드에 생성된 button 컨트롤, 후면 (send to back)
[self.view sendSubviewToBack:button]; 

button 컨트롤은 코드로 Custom 속성을 설정합니다.

UIImage *buttonUpImage = [UIImageimageNamed:@"button_up.png"];
UIImage *buttonDownImage =[UIImage imageNamed:@"button_down.png"];
// , 。
UIButton *button = [UIButtonbuttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0.0,0.0, buttonUpImage.size.width, buttonUpImage.size.height);
[buttonsetBackgroundImage:buttonUpImageforState:UIControlStateNormal];
[buttonsetBackgroundImage:buttonDownImageforState:UIControlStateHighlighted];
[button setTitle:@"Tap"forState:UIControlStateNormal];
[button addTarget:selfaction:@selector(buttonTapped:)forControlEvents:UIControlEventTouchUpInside]; // 
[button addTarget:self action:@selector(buttonTapped:)forcontrolEvents:UIControlEventTouchUpInside]

button Tapped. 이것은 button의 UIControl Event Touch UpInside 이벤트에 대한 사용자 정의 응답 함수입니다.
From http://www.cocoachina.com/bbs/read.php?tid=49128&page=1

좋은 웹페이지 즐겨찾기