2011-10-18 5 views
1

나는 뷰가 있으며 다른 위치 프레임이있는 많은 UILabel 텍스트가 필요하므로 프로그래밍 방식으로 UILabel을 만들고이를 매개 변수 전달이라고하며 매개 변수 전달을 통해 호출하고 있습니다.다른 UIOrientation에서 UILabel에 대한 위치를 설정하는 방법

아래 코드를 사용하여 가로보기 모드로 회전하면 세로보기 레이블이 계속 표시됩니다. 어떻게 이것을 극복 할 수 있습니까? 아래 코드에서 수행해야합니다. 레이블 프레임의 위치를 ​​세로보기에서 가로보기로 변경하고 싶습니다.

참고 : 매개 변수 전달을 사용하므로 많은 레이블을 만들어야하므로 각 레이블을 만드는 데 많은 방법을 쓸 필요가 없습니다.

-(UILabel*)createLabel:(CGRect)frame :(NSString*)labelTitle 
{ 
    UILabel *myLabel = [[UILabel alloc] initWithFrame:frame]; 
    [UIFont fontWithName:@"Arial" size:13]; 
    myLabel.text = labelTitle;  
} 

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

{ 
    if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) 
    { 
     [self.view addSubview:[self createLabel:CGRectMake(450,140,60,20):@"Ratings:"]]; 
     [self.view addSubview:[self createLabel:CGRectMake(450,170,60,20):@"Reviews:"]]; 
    } 
    else 
    { 
     [self.view addSubview:[self createLabel:CGRectMake(650,140,60,20):@"Ratings:"]]; 
     [self.view addSubview:[self createLabel:CGRectMake(650,170,60,20):@"Reviews:"]]; 
    } 

    return YES; 
} 
+2

'[self facepalm]; ' –

답변

0

오리엔테이션이 바뀔 때마다 호출되어 더 많은 라벨이 만들어지기 때문에 shouldAutorotateToInterfaceOrientation에 생성하지 마십시오. 레이블이 자동으로 크기를 조정하고 전체 회전 :

myLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth ; 

이이 방향 변경이 원하는 동작을하게됩니다 :

대신 예는, - (void) loadView 번을 만들고, 그들에게 올바른 autoResizingMask 특성을 제공 애니메이션이 매끄 럽습니다.

추 신 : 레이블을 만드는 방법으로 인해 메모리 누수가 발생했음을 회피하려면 release 메서드를 사용하십시오.

+0

ViewDidLoad 메서드에서 다음 코드를 시도했습니다. CGRect frame = CGRectMake (6001406020); myLabel = [[UILabel alloc] initWithFrame : frame]; [UIFont fontWithName : @ "Arial"size : 13]; myLabel.text = LabelTitle; 아래 호출시 labeltitle을 할당하는 방법 하지만 도시 미표시 LabelTitle는 - (BOOL)는 를 shouldAutorot 경우 (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) { myLabel.frame = CGRectMake (6001406020); myLabel.text = @ "등급 :"; } else – crazy2431

+0

LabelTitle을 createLabel 메서드의 매개 변수로 보내므로 전달하지 않으면 액세스 할 수 없습니다. 대신 myLabel.text = @ "<여기에 내 제목>"을 사용할 수 있습니다. – Wolfert

+0

myLabel을 썼습니다.텍스트 = @ "등급"; (BOOL) ShouldnautoRotate 메서드에서 다음 코드가 호출되었지만 여전히 throwing 예외가 발생했습니다. (BOOL) ShouldnautoRotate { myLabel.frame = CGRectMake (6001406020); myLabel.text = @ "등급 :"; – crazy2431

0

세로 방향 레이블은 여전히 ​​장치가 회전 될 때마다 이전 레이블을 제거하지 않고 새 레이블을 추가하기 때문에 나타납니다.

기존 레이블의 프레임을 변경하는 동안 새 레이블을 만드는 것은 좋지 않다고 생각합니다. 이렇게하려면 클래스에 두 개의 속성 (예 : reviewLabel 및 ratingLabel)을 추가하고 레이블을 처음 만들 때 레이블에 할당해야합니다. 그런 다음 shouldAutorotate 함수에서이 레이블에 액세스하고 프레임을 변경할 수 있습니다.

+0

나는 샘플 코드를 가질 수있다. 나는 아이폰 개발에 익숙하다. 그리고 또 하나의 질문은 15 주위에 많은 라벨을 만들 필요가있다. 그래서 나는 모든 것을위한 속성을 가질 필요가있다. 라벨 ...? – crazy2431

+0

많은 레이블을 가지고 있다면 각각의 속성을 갖는 것은별로 실용적이지 않습니다. Wolfert가 제안한대로 autoresizingMask를 설정하여 제대로 레이아웃 해보십시오. 뷰 태그를 사용할 수도 있습니다. myLabel = [self.view viewWithTag : 10]'을 사용하여 각 라벨의 태그를 생성시 'myLabel.tag = 10'과 같이 설정하고 shouldAutorotate 함수의 라벨을 가져옵니다. – murat

관련 문제