UIView xib 사용 (소스에서 자동 레이아웃)
10684 단어 iOSSwift4VFLxibAutoLayout
UIView의 xib 사용 (소스에서 자동 레이아웃)
이용 방법에 문제가 없는지, 더 좋은 방법이 없는지 모르기 때문에,
정보를 얻기 위해 공유했습니다. 댓글에 공유해주세요.
(자동 레이아웃 우선 순위에 익숙한 분, 꼭 코멘트 부탁드립니다)
Step1. xib 파일을 만듭니다.
1-1. xib 파일을 프로젝트에 추가합니다. (파일 이름: SubviewMockUpView.xib).
1-2. 스토리보드로 가져오는 View는 ImageView이므로, 외관을 보기 쉽게 조정한다. Freeform으로 마우스를 사용하여 크기를 조정하면 위 이미지처럼 보입니다.
1-3. 이미지 뷰를 추가하고 이미지를 설정합니다. 이미지 뷰가 중앙에 오도록 아래와 같은 제약을 추가한다. (이미지 보기만 선택하고 다음과 같은 작업을 수행합니다).
1-4. 이미지의 종횡비를 설정합니다. (이미지 보기만 선택하고 다음과 같은 작업을 수행합니다).
1-5. 설정된 종횡비를 조정합니다. (실패한 제약은, 대상의 아이템을 선택해, 여기에서 삭제할 수 있다).
Step2. xib의 마지막 클래스를 만듭니다. 파일은 xib와 동일한 계층에 둔다.
//
// SubviewMockUpView.swift
// IOSMockUp
//
// Created by 神谷亮太 on 2018/10/20.
// Copyright © 2018年 神谷亮太. All rights reserved.
//
import UIKit
@IBDesignable
class SubviewMockUpView: UIView {
@IBOutlet weak var imageView: UIImageView!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
loadView()
}
override init(frame: CGRect) {
super.init(frame: frame)
loadView()
}
func loadView() {
// 自分のクラス名と同じ名前のxibファイルを読み込む。
let xibName = String(describing: type(of: self))
let xib = UINib(nibName: xibName, bundle: Bundle(for: type(of: self)))
let view = xib.instantiate(withOwner: self, options: nil).first as! UIView
// xibのview直下のイメージビューを自分のサブビューにする。
guard let additionalTarget: UIView = view.subviews.first as? UIImageView else {
print("First view type is \(String(describing: view.subviews.first)).")
return
}
addSubview(additionalTarget)
// ソースからオートレイアウトを設定する。
// 親に同じ制約を設定する。
addConstraints(additionalTarget.constraints)
// オートレイアウトを有効にする。
additionalTarget.translatesAutoresizingMaskIntoConstraints = false
// イメージビューのアスペクト比の制約を自身の制約に追加する。
// オートレイアウトの対象を設定する。
let views = ["view": additionalTarget, "parent": self]
// 優先度1000(規定値)の設定。
// VFLでオートレイアウトを設定する。
// Hは水平方向の制約、|は親ビューを示し、親ビューにviewが隣接する。また、幅はparent以下。
addConstraints(NSLayoutConstraint.constraints(
withVisualFormat: "H:|[view(<=parent)]", metrics:nil, views: views))
// Vは垂直方向の制約。
addConstraints(NSLayoutConstraint.constraints(
withVisualFormat: "V:|[view(<=parent)]", metrics: nil, views: views))
// 優先度750の設定。
//(優先度250では適用されず。詳しい方教えてください)。
// 画像の縦幅が親より小さい場合、親のサイズに調整する。
addConstraints(NSLayoutConstraint.constraints(
withVisualFormat: "H:[view(==parent@750)]", metrics:nil, views: views))
}
}
Step3. xib의 소유자를 설정합니다. ( @IBOutlet weak var imageView: UIImageView!를 설정할 수 있게 된다)
Step4. 스토리보드로 설정합니다.
3-1. 제약 없이 View 바로 아래(보이는 위치)에 UIView를 배치합니다.
3-2. 위 이미지와 같이 Custom Class에 작성한 클래스를 설정합니다.
3-3. 이미지의 크기를 조정하면 종횡비가 유지됩니다. 스트리보드 위에서도 같은 종횡비로 제약을 추가한다.
Reference
이 문제에 관하여(UIView xib 사용 (소스에서 자동 레이아웃)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rkamiya/items/317a50a7599ea61a69ab
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
//
// SubviewMockUpView.swift
// IOSMockUp
//
// Created by 神谷亮太 on 2018/10/20.
// Copyright © 2018年 神谷亮太. All rights reserved.
//
import UIKit
@IBDesignable
class SubviewMockUpView: UIView {
@IBOutlet weak var imageView: UIImageView!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
loadView()
}
override init(frame: CGRect) {
super.init(frame: frame)
loadView()
}
func loadView() {
// 自分のクラス名と同じ名前のxibファイルを読み込む。
let xibName = String(describing: type(of: self))
let xib = UINib(nibName: xibName, bundle: Bundle(for: type(of: self)))
let view = xib.instantiate(withOwner: self, options: nil).first as! UIView
// xibのview直下のイメージビューを自分のサブビューにする。
guard let additionalTarget: UIView = view.subviews.first as? UIImageView else {
print("First view type is \(String(describing: view.subviews.first)).")
return
}
addSubview(additionalTarget)
// ソースからオートレイアウトを設定する。
// 親に同じ制約を設定する。
addConstraints(additionalTarget.constraints)
// オートレイアウトを有効にする。
additionalTarget.translatesAutoresizingMaskIntoConstraints = false
// イメージビューのアスペクト比の制約を自身の制約に追加する。
// オートレイアウトの対象を設定する。
let views = ["view": additionalTarget, "parent": self]
// 優先度1000(規定値)の設定。
// VFLでオートレイアウトを設定する。
// Hは水平方向の制約、|は親ビューを示し、親ビューにviewが隣接する。また、幅はparent以下。
addConstraints(NSLayoutConstraint.constraints(
withVisualFormat: "H:|[view(<=parent)]", metrics:nil, views: views))
// Vは垂直方向の制約。
addConstraints(NSLayoutConstraint.constraints(
withVisualFormat: "V:|[view(<=parent)]", metrics: nil, views: views))
// 優先度750の設定。
//(優先度250では適用されず。詳しい方教えてください)。
// 画像の縦幅が親より小さい場合、親のサイズに調整する。
addConstraints(NSLayoutConstraint.constraints(
withVisualFormat: "H:[view(==parent@750)]", metrics:nil, views: views))
}
}
Reference
이 문제에 관하여(UIView xib 사용 (소스에서 자동 레이아웃)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rkamiya/items/317a50a7599ea61a69ab텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)