2009-07-25 7 views
0

이 접근 방식은 많은 사용자 정의보기가있는 응용 프로그램, 중첩 된 PNG 그래픽 및 사용자 상호 작용에 따라 변경 될 수있는 애니메이션의 경우 좋은 방법으로 보이는지 궁금합니다. I는 UIView의상속을위한 UIView 및 UIViewController 연습

@interface BaseView : UIView { 
    @protected 
    BaseViewController *controller; 
} 

@property (retain) BaseViewController *controller; 

@end 

및 I는 "drawArea"는 CGRect가 사용되는 뷰

@interface BaseViewController : UIViewController { 
    @protected 
    CGRect drawArea; 
} 

- (void) drawArea:(CGRect) _drawArea; 
- (CGRect) drawArea; 
- (void) linkSubviewController: (BaseViewController *) _subviewController; 

@end 

를 조작하기위한 코드를 걸었 기본 위치는 해당 컨트롤러 클래스를 확장하는 BaseView 클래스를 생성 프레임으로보기로 전달하십시오. 다음과 같이

"linkSubviewController은"둥지에 컨트롤러와 뷰를 사용하면 다음을 수행 할 수 있습니다 나는 "이미지 뷰"하고있는 UIImage과를 BaseView을 확장뿐만 아니라 저장 "ImageViewController"라는 다른 사용자 지정 쌍을 계층화 또한

- (void) linkSubviewController: (BaseViewController *) _subviewController { 
    [self.view addSubview:[_subviewController view]]; 
} 

X, Y는, 뷰에서 "의 drawRect"연신 방법에서 H

, 승 I는 예를 들어, self.controller의 바르 어느 VARS 변경되었는지 확인하거나 이미지를 할당 확인할 수

UIImage *image = [(ImageViewController *)self.controller image]; 
CGContextDrawImage(...) etc 
,

나는 기본은 "initWithFrame"루틴은 그래서 각 것을 지정하지 않고 투명 배경을 가진 다양한 이미지를로드 할 수 있습니다

self.backgroundColor = [UIColor clearColor]; 
    self.opaque = NO; 

이 포함이

- (void)loadView { 
    ImageView *v = [[ImageView new] initWithFrame:drawArea]; 
    v.controller = self; 
    self.view = v; 
} 

같은에는 loadView 메소드 뭔가의 대부분을 쓰기 시각.

내 응용 프로그램에서이 코드를 사용할 수 있었으며 사용자 지정 항목의 레이아웃을 어셈블하는 최상위 클래스를 쉽게 작성할 수 있습니다. 애니메이션의 경우 컨트롤러에 넣고 self.view.layer를 조작했습니다.

은 기본적으로 내가 의견을 찾고 있어요, 내가 목표 - C와 아이폰 SDK에 새로운 오전

답변

4

은 몇 가지 문제는 여기에 있습니다 :

  1. [[Classname new] init...]new의 잘못된 사용이다 사용. new을 사용하면 [[Classname alloc] init]의 줄임말이므로 효과적으로 init을 두 번 호출합니다.
  2. 보기가 실제로 누가 제어하는지 알 필요가 없습니다.
  3. 컨트롤러가 표시되고 UIViewController가 뷰를 유지하므로주기가 유지되고 어느 것도 둘 다 완전히 release이되지 않습니다.

당신은 (뷰는 부모의 도면을 위임 할 수있다), 당신의 컨트롤러가 프로토콜을 구현해야하는 DrawDelegate 프로토콜을 만드는 시도하고보기 하위 클래스에서이 행동의 유형을하려는 경우 drawDelegate 비 유지 속성 :

+0

[[Class alloc] init]보다 [Class new]를 사용해야하는 특별한 이유가 있습니까? 명백한 확장 된 initWith 및 기타 등등. – Sneakyness

+1

@ Snookyness + new는 천천히 죽어가는 관습입니다. + alloc은 + new + *가 + alloc-init을 호출해야하기 때문에 + alloc-init에 비해 유연성이 떨어지는 반면, + alloc을 사용하면 원하는 모든 -init 또는 -initWith ... 메소드를 사용할 수 있습니다. –

+0

감사합니다. + 새로운 것은 분명한 실수입니다. 감사합니다. 나는 위임 접근법을 시도 할 것이다. 나의 주요 목표는 콘트롤러에 상태 정보를 유지하고 콘트롤러의 변경에 따라 뷰를 다시 그리게하고, 콘트롤 클래스를 실행할 수있는 앱 클래스이다. 또한 계획의 일부는 사용자 정의보기에서 캐스팅 된 .controller까지 터치 이벤트를 보낼 수 있어야했습니다. 분명히 약간의 재 작업이 필요하지만 대표단이 도움이된다고 생각합니다. – Michael