스토리보드,xib 객체 코드에서 불러오기
xib 기반 프로젝트나 날코딩(?)으로 ui를 구현했는데, 만약 storyboard가 필요할 경우
동적으로 스토리보드를 불러올수 있다.
스토리보드를 만들고 뷰컨트롤러 속성에서 id를 지정하고, id를 사용한다고 체크해야 한다.
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"스토리보드 이름" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"뷰컨트롤러id"];
xib
// NSBundle 사용 현재 권장되지 않음.
[[NSBundle mainBundle] loadNibNamed:@"nib이름" owner:self options:nil] objectAtIndex:0];
// UINib (NSNib) 사용
UINib *nib = [UINib nibWithNibName:@"nib이름" bundle:nil];
NSArray *objs;
[nib instantiateWithOwner:self topLevelObjects:&objs];
// or objs = [nib instantiateWithOwner:self options:nil];
UIView *view = (UIView*) objs[0]; // top level objects are only uiview. otherwise use isKindofClass before.
스토리보드에서 외부 xib 뷰 사용
http://stackoverflow.com/questions/30335089/reuse-a-uiview-xib-in-storyboard
1. 뷰만 있는 xib 는 File's Owner가 없고 해당 뷰만 생성되는데,
File's owner class를 해당 뷰로 지정한다(컨트롤러처럼)
2. 뷰의 클래스는 기본값 UIView로 설정
3. view 프로퍼티를 하나 선언하고, 뷰를 IBOutlet 연결
4. 뷰에 인터페이스 빌더 생성자 오버라이드
-(id)initWithCoder:(NSCoder*)aDecoder {
self = [super initWithCoder:aDecoder];
if(self) {
// nib파일을 로드한다. 로드되면서 outlet 설정등도 로드되므로 별도로 뷰를 받을 필요는 없다.
[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class])
owner:self
options:nil] objectAtIndex:0];
// 아웃렛으로 연결된 프로퍼티에 뷰가 생성되었을테니 서브뷰로 추가
[self addSubview:self.view];
// 해당 뷰는 전체 크기로 맞춘다(오토레이아웃)
[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
[self addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|[view]|"
options:0
metrics:nil
views:@{@"view":self.view}]];
[self addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|[view]|"
options:0
metrics:nil
views@{@"view":self.view}]];
}
return self;
}
5. 스토리보드에서 뷰 등록하고, 뷰의 클래스명을 적어주면 된다.
커스텀 세그웨이(segue)
UIStoryboardSegue를 상속받은 커스텀 세그웨이 클래스 생성
세그웨이 생성 및 Identifier 지정.
변경시 스토리보드 세그웨이 설정에서 kind 를 custom 으로 설정.
세그웨이 클래스명 지정
-(void)perform
{
UIViewController *source = (UIViewController *)self.sourceViewController;
UIViewController *destination = (UIViewController *)self.destinationViewController;
// 필요한 형태로 보이기
// 교체
[UIView
transitionFromView:source.view
toView:destination.view
duration:(NSTimeInterval)
options:(UIViewAnimationOptions)
completion:^(BOOL finished)
];
// 에니메이션
[source.view.superview insertSubview:destination.view atIndex:0];
[UIView
animateWithDuration:
delay:
options:
animations:^{
// 소스뷰 이동
source.view.transform = CGAffineTransformMakeTranslation(0,0)
// 목표뷰 이동
destination.view.transform = CGAffineTransformMakeTranslation(100,100);
}
completion:^(BOOL finished) {
[destination.view removeFromSuperview];
[source dismissViewControllerAnimated:NO completion:nil];
}
}
'프로그래밍 > iOS,macOS' 카테고리의 다른 글
아이폰 시뮬레이터 로그 터미널로 보기 (0) | 2016.11.01 |
---|---|
모달 뷰 (0) | 2016.10.28 |
ChildViewController (0) | 2016.10.27 |
오토레이아웃 이것저것 / Constraint / UITextView (0) | 2016.10.25 |
커스텀객체와 인터페이스빌더 (0) | 2016.10.23 |
싱글톤 (0) | 2016.10.19 |
코어 데이터 정리 (0) | 2016.10.18 |
슬라이드메뉴 (0) | 2016.10.16 |
UITableView / UICollectionView (0) | 2016.10.16 |
파일 가져오기 (0) | 2016.10.16 |