2017-12-13 16 views
0

둥근 테두리가있는 셀이있는 정적 테이블보기가 있습니다. 서로 다른 시뮬레이터에서 테스트 할 때 자동 레이아웃 제약 조건이 작동하는 동안 경계가 항상 올바른 폭이 아닌 것으로 나타났습니다. 이 특정 화면에는 UIView이 포함 된보기 컨트롤러가 포함되어 있습니다. tableViewControllerviewDidAppear에서 UI 만 올바르게 구성 할 수 있습니까? 그리고 viewWillAppear/viewDidLoad 아닌가요?

일부 조사를 수행했는데 실제로 테두리의 너비가 스토리 보드 전화의 너비에 달려 있음을 알았습니다. 즉, iPhone 8의 스토리 보드가있는 경우 8+에 셀이 너무 짧거나 그 반대의 경우 8+ 스토리 보드의 결과가 8보다 길고 (화면에서 벗어난) 셀에 표시됩니다.

현재 나는 viewDidAppear 내에서이 코드를 실행하면

- (void)configureCellThree { 
    //Add Border 
    CALayer *borderLayer = [CALayer layer]; 
    CGRect borderFrame = CGRectMake(0, 0, (_contentCellThree.frame.size.width), (_contentCellThree.frame.size.height)); 
    [borderLayer setBackgroundColor:[[UIColor clearColor] CGColor]]; 
    [borderLayer setFrame:borderFrame]; 
    [borderLayer setCornerRadius:_contentCellThree.frame.size.height/2]; 
    [borderLayer setBorderWidth:1.0]; 
    [borderLayer setBorderColor:[kTextColor2 CGColor]]; 
    // [borderLayer setOpacity:0.5]; 
    [_contentCellThree.layer addSublayer:borderLayer]; 
} 

지금, 모든 것이 두 장치에서 작동합니다 : 내가있는 viewDidLoad에서 셀 테두리를 설정하고, 여기에 내가 셀 경계를 구성하는 데 사용하고있는 코드입니다. 내 메인보기 컨트롤러에 몇 가지 로그를 추가하여 상황이 설정되는 방식을 확인했습니다.

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    NSLog(@"VDL - SELF.VIEW = %@", self.view); 
    NSLog(@"VDL - CONTAINER VIEW = %@", self.profileScrollingContainerView); 
} 

- (void)viewDidAppear:(BOOL)animated { 

    [super viewDidAppear:animated]; 

    NSLog(@"VDA- SELF.VIEW = %@", self.view); 
    NSLog(@"VDA - CONTAINER VIEW = %@", self.profileScrollingContainerView); 
} 

내가있는 viewDidLoad가 스토리 보드 대신 (오른쪽하지 않는 것) 뷰 자체의 크기 정보를 이용 것을 의심했다. 이 기록은 이것을 확인합니다. UIView이 내 테이블 뷰 표시를 담당하는 경우 스토리 보드를 8 이상으로 설정하면 프레임 속성이 X = 0, Y = 349, W = 414, H = 338이됩니다. 이제 로깅 결과를 살펴 보겠습니다.

VDL - SELF.VIEW = <UIView: 0x7fa545401f10; frame = (0 0; 375 667); 
VDL - CONTAINER VIEW = <UIView: 0x7fa545401b50; frame = (0 349; 414 338); 


VDA- SELF.VIEW = <UIView: 0x7fa545401f10; frame = (0 64; 375 603); 
VDA - CONTAINER VIEW = <UIView: 0x7fa545401b50; frame = (0 285; 375 269); 

따라서 뷰가로드되면 뷰 뷰에 잘못된 뷰 크기 정보가 표시됩니다. viewDidAppear이 호출되면보기의 크기가 올바르게 지정되고 제대로 작동합니다. 내 문제는 내 viewDidAppear에서 initialising 코드를 호출하고 싶지 않다는 것입니다.

I read here that I should be putting my UI Geometry code into the viewWillAppear 그러나 나는 이것을 시도했지만 동일한 문제가 발생합니다.

VWA - CONTAINER VIEW = <UIView: 0x7fec04d97700; frame = (0 349; 414 338); 

그래서 내 질문을 통합, 어떻게 내가 설정 내 UI 올바르게 /보기 전에 내보기의 속성을로드 할 수 있도록 등장받을 수 있나요?

UIView의 하위 클래스를 사용해야하고 잠재적으로 setFrame을 사용해야한다는 것을 읽었지 만 실제로이 작업을 실제로 수행하는 방법을 실제로 알지 못합니다.

답변

0

그래서 잘못된 방법을 사용하고있는 것으로 나타났습니다. I found this question which solved my whole issue. 기본적으로 UI 계산 (예 : 사용자 지정보기 추가)을 수행해야하는 경우 -(void)viewDidLayoutSubviews에서 수행해야합니다. 이 메서드는 뷰가 크기 및 제약 조건을 모두 처리 한 후에 호출되므로 여기에서 수행하는 모든 작업이 뷰의 올바른 속성을 사용하여 실행됩니다!