programing

setFrame과 autolayout을 같은 뷰에서 사용할 수 있습니까?

cafebook 2023. 11. 4. 13:19
반응형

setFrame과 autolayout을 같은 뷰에서 사용할 수 있습니까?

저는 모든 버튼에 패딩을 추가하고 싶어서 UI버튼을 서브클래스했고, 다른 변경사항 중 setFrame 방법을 사용하여 고정패딩을 추가하고 싶었습니다.setFrame을 제외하고는 모두 작동했습니다.확인해보니 해당 뷰에서 "자동 레이아웃 사용"을 선택 해제하면 setFrame을 사용할 수 있고, 작동합니다.이 문제를 해결할 방법이 있습니까?저는 자동 레이아웃을 꼭 사용하고 싶습니다. 왜냐하면 그것은 아이폰 5와 이전의 기기에서 앱을 멋지게 보이게 하는데 도움을 주기 때문입니다.하지만 저는 또한 제 서브클래스에서 setFrame을 사용하여 제 삶을 좀 더 편하게 하고 싶습니다.

요약하자면, 제 질문은 자동 레이아웃을 사용하고 UIView의 프레임을 프로그래밍 방식으로 조정할 수 있습니까?

네, 할 수 있습니다.

보기를 설정하는 경우translatesAutoresizingMaskIntoConstraints = YES, 에 전화를 걸었습니다.setFrame:실행 시 뷰의 현재 상태를 기준으로 레이아웃 제약 조건으로 자동 변환됩니다.autoresizingMask. 이를 통해 프레임 기반 레이아웃과 제약 조건 기반 레이아웃을 혼합할 수 있습니다.

예를 들어, 자동 레이아웃을 사용하여 보기의 모든 하위 보기의 레이아웃을 정의할 수 있지만, 여전히 호출할 수 있습니다.setFrame:뷰 자체의 크기와 위치를 설정합니다.여러분의 관점에서, 여러분은 자동 레이아웃과 직접 프레임 조작을 혼합하여 레이아웃을 하고 있습니다.하지만 이 시스템은 실제로 모든 것을 처리하기 위해 제약 조건을 사용하고 있습니다.

그러나 사용에 대한 한 가지 큰 주의 사항이 있습니다.translatesAutoresizingMaskIntoConstraints.

이렇게 하면 이러한 자동 제약 조건이 나머지 제약 조건을 만족할 수 있는지 확인해야 합니다.

예를 들어, 뷰의 크기와 위치를 결정하는 제약 조건이 이미 있다고 가정하고, 또한 다음과 같이 설정합니다.translatesAutoresizingMaskIntoConstraints = YES하고 전화를 했습니다.setFrame:. 로의 통화.setFrame:는 뷰에 새로운 제약 조건을 생성하여 이미 존재하는 제약 조건과 충돌할 가능성이 있습니다.

(실제로 이러한 오류는 자주 발생합니다.상충되는 제약 조건에 대해 불평하는 로그 메시지를 본 적이 있다면, 그러한 제약 조건 중 하나는NSAutoresizingMaskLayoutConstraint, 그러면 지금 보시는 것은 자동 구속 장치와의 충돌입니다.이것은 쉬운 실수입니다. 왜냐하면translatesAutoresizingMaskIntoConstraints = YES는 기본값이므로 코드에서 제약 조건을 구성하는 경우 이러한 자동 제약 조건을 원하지 않을 경우 끌 것을 기억해야 합니다.

반대로 뷰의 크기와 위치를 결정하는 기존의 제약 조건이 이미 존재하지만 다음을 설정한다고 다시 가정합니다.translatesAutoresizingMaskIntoConstraints = NO전화 드리기 전에setFrame:. 이 경우, 당신의setFrame:호출은 새로운 제약 조건을 생성하지 않으므로 별도의 제약 조건 에 충돌이 발생하지 않습니다.그러나 이 경우 제약 조건과 설정한 프레임 사이에는 "충돌"이 여전히 존재합니다.다음 번에 Auto Layout(자동 레이아웃)을 호출할 때 뷰에 이미 존재하는 제약 조건을 보고 이 제약 조건에 필요한 프레임 값을 계산한 다음 프레임 자체를 필요한 값으로 설정하여 수동으로 설정한 값을 흐리게 합니다.

자세한 내용은 Apple의 Cocoa Auto Layout Guide에서 "Attopting Auto Layout" 섹션을 참조하십시오.

저에게 가장 쉬운 일은 이동/크기 조정을 원하는 뷰를 수퍼뷰에서 제거하고 설정하는 것이었습니다.frame, 다시 추가합니다.예를 들어, 사용자 정의를 사용합니다.UILabel일순간에UITableViewCell하위 클래스:

[cell.myLabel removeFromSuperview];
cell.myLabel.frame = someFrameIGenerated;
[cell.contentView addSubview:cell.myLabel];

저에게 효과가 있었던 것은 단순히 하나를 추가하는 것이었습니다.IBOutlet뷰 컨트롤러에 대한 제약 조건에 대해 다음으로 변경합니다.constant콘센트에 있는 재산

예를 들어, 뷰의 x 원점을 변경하려면 해당 뷰의 선행 제약 조건에서 컨트롤러로 출구를 설정합니다.즉, 콘센트를 만듭니다.@IBOutlet var labelXOrigin: NSLayoutConstraint!. 그러면 x 위치를 조정하고 싶을 때는 그냥 다음과 같이 하면 됩니다.

self.labelXOrigin.constant = 20.0 // Or whatever origin you want to set.

서브뷰 프레임을 설정하는 가장 좋은 방법은 자동 레이아웃 프로젝트에서 viewWillLayoutSubviews 메서드입니다.

set 속성을 번역합니다.MaskIntoContracts = true 크기 조정 보기가 나타난 직후에 보기가 나타나거나 버튼을 눌러 설정한 후에 작동합니다.

앱이 여러 장치 방향을 지원하지 않는 경우.

ViewDidLoad에서 크기를 조정할 뷰 프레임을 설정합니다.

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [aView setFrame:CGRectMake(15, 15, 100, 100)];
}

보기DidLayoutSubviews:

-(void)viewDidLayoutSubviews
{
    [self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
}

확실하지는 않지만 이 솔루션을 사용할 경우 한 방향을 다른 방향으로 전환하면 문제가 발생할 수 있습니다.

언급URL : https://stackoverflow.com/questions/13186908/can-i-use-setframe-and-autolayout-on-the-same-view

반응형