UFO ET IT

iOS에서 프로그래밍 방식으로 종횡비 제한을 어떻게 설정할 수 있습니까?

ufoet 2020. 12. 10. 20:47
반응형

iOS에서 프로그래밍 방식으로 종횡비 제한을 어떻게 설정할 수 있습니까?


내 뷰 컨트롤러에 자동 레이아웃을 사용했습니다. 제약 조건에서 V 및 H 위치를 설정했지만 5s, 6 및 6 Plus로 변경 될 때 버튼 크기를 어떻게 늘릴 수 있는지 알고 싶습니다. 이것은 로그인 버튼에 대한 제약 조건을 추가 한 방법입니다.

NSArray *btncon_V=[NSLayoutConstraint constraintsWithVisualFormat:@"V:[btnLogin(40)]" options:0 metrics:nil views:viewsDictionary];
[btnLogin addConstraints:btncon_V];

NSArray *btncon_POS_H=[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[btnLogin]-100-|" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:btncon_POS_H];


NSArray *btncon_POS_V=[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-70-[Title]-130-[lblFirst]-0-[lblSecond]-20-[textusername]-10-[txtpassword]-10-[btnLogin]" options:0 metrics:nil views:viewsDictionary];

[self.view addConstraints:btncon_POS_V];

하지만 내 문제는 왼쪽과 오른쪽의 간격을 관리하는 동안 높이가 고정되어 있기 때문에 iPhone 6 및 6 Plus에서 늘어나는 것입니다. 화면 크기에 따라 크기를 늘리려면 어떻게해야합니까? 이것이 종횡비라고 생각하지만 코드에서 종횡비 제약을 어떻게 설정할 수 있습니까?


이렇게. 한 번 시도하십시오.

[self.yourview setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.yourview addConstraint:[NSLayoutConstraint
                                  constraintWithItem:self.yourview
                                  attribute:NSLayoutAttributeHeight
                                  relatedBy:NSLayoutRelationEqual
                                  toItem:self.yourview
                                  attribute:NSLayoutAttributeWidth
                                  multiplier:(self.yourview.frame.size.height / self.yourview.frame.size.width)
                                  constant:0]];

또는 대신 (self.yourview.frame.size.height / self.yourview.frame.size.width)부동 소수점 값을 사용할 수 있습니다. 감사.

Swift 3.0-

self.yourview!.translatesAutoresizingMaskIntoConstraints = false
self.yourview!.addConstraint(NSLayoutConstraint(item: self.yourview!,
                                          attribute: NSLayoutAttribute.height,
                                          relatedBy: NSLayoutRelation.equal,
                                          toItem: self.yourview!,
                                          attribute: NSLayoutAttribute.width,
                                          multiplier: self.yourview.frame.size.height / self.yourview.frame.size.width,
                                          constant: 0))

레이아웃 앵커 는 프로그래밍 방식으로 제약 조건을 설정하는 가장 편리한 방법입니다.

버튼의 가로 세로 비율을 5 : 1로 설정하고 싶다면 다음을 사용해야합니다.

button.heightAnchor.constraint(equalTo: button.widthAnchor, multiplier: 1.0/5.0).isActive = true

다음은 전체 코드입니다.

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(type: .custom)
        button.setTitle("Login", for: .normal)
        button.backgroundColor = UIColor.darkGray

        self.view.addSubview(button)

        button.translatesAutoresizingMaskIntoConstraints = false

        let margins = view.layoutMarginsGuide

        button.leadingAnchor.constraint(equalTo: margins.leadingAnchor, constant: 20.0).isActive = true
        button.trailingAnchor.constraint(equalTo: margins.trailingAnchor, constant: -20.0).isActive = true
        button.bottomAnchor.constraint(equalTo: margins.bottomAnchor, constant: -20.0).isActive = true
        button.heightAnchor.constraint(equalTo: button.widthAnchor, multiplier: 1.0/5.0).isActive = true
    }

}

위에 작성된 코드로 얻은 결과는 다음과 같습니다. 버튼이 다양한 기기에서 5 : 1 종횡비를 유지하는 것을 볼 수 있습니다.

결과보기


스위프트 3 :

yourView.addConstraint(NSLayoutConstraint(item: yourView,
                                          attribute: .height,
                                          relatedBy: .equal,
                                          toItem: yourView,
                                          attribute: .width,
                                          multiplier: 9.0 / 16.0,
                                          constant: 0))

Interface Builder의 디자인 타임에 "Height constraint"를 설정할 수 있습니다. ' "빌드시 제거"를 선택하면 앱이 실행될 때 제거됩니다.

여기에 이미지 설명 입력 그런 다음 예를 들어 viewDidLoad 메서드에서 "Aspect Ratio"제약 조건을 추가 할 수 있습니다.

Xamain.iOS에서 "16 : 9"는 다음과 같습니다.

    this.ImageOfTheDay.AddConstraint(NSLayoutConstraint.Create(
            this.ImageOfTheDay,
            NSLayoutAttribute.Height,
            NSLayoutRelation.Equal,
            this.ImageOfTheDay,
            NSLayoutAttribute.Width,
            9.0f / 16.0f,
            0));

또는 Mahesh Agrawal이 말했듯이 :

    [self.ImageOfTheDay addConstraint:[NSLayoutConstraint
                              constraintWithItem:self.ImageOfTheDay
                              attribute:NSLayoutAttributeHeight
                              relatedBy:NSLayoutRelationEqual
                              toItem:self.ImageOfTheDay
                              attribute:NSLayoutAttributeWidth
                              multiplier:(9.0f / 16.0f)
                              constant:0]];

위의 모든 답변을 시도했지만 작동하지 않았으며 이것이 신속한 3을 사용한 내 솔루션입니다.

let newConstraint = NSLayoutConstraint(item: yourView, attribute: .width, relatedBy: .equal, toItem: yourView, attribute: .height, multiplier: 560.0/315.0, constant: 0)
yourView.addConstraint(newConstraint)
NSLayoutConstraint.activate([newConstraint])  
NSLayoutConstraint.deactivate(yourView.constraints)
yourView.layoutIfNeeded()

UIView의 도우미 확장

extension UIView {

    func aspectRation(_ ratio: CGFloat) -> NSLayoutConstraint {

        return NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: self, attribute: .width, multiplier: ratio, constant: 0)
    }
}

그리고 사용법은 다음과 같습니다.

view.aspectRation(1.0/1.0).isActive = true

참고 URL : https://stackoverflow.com/questions/31334017/how-can-i-set-aspect-ratio-constraints-programmatically-in-ios

반응형