166
가로세로 어느 방향도 자유롭게 유연성있는 아이폰 앱 레이아웃 구현

B4 가로세로 어느 방향이라도 자유롭게

Embed Size (px)

Citation preview

Page 1: B4 가로세로 어느 방향이라도 자유롭게

가로세로 어느 방향도 자유롭게유연성있는 아이폰 앱 레이아웃 구현

Page 2: B4 가로세로 어느 방향이라도 자유롭게

유연한 레이아웃?

Page 3: B4 가로세로 어느 방향이라도 자유롭게
Page 4: B4 가로세로 어느 방향이라도 자유롭게
Page 5: B4 가로세로 어느 방향이라도 자유롭게
Page 6: B4 가로세로 어느 방향이라도 자유롭게
Page 7: B4 가로세로 어느 방향이라도 자유롭게
Page 8: B4 가로세로 어느 방향이라도 자유롭게
Page 9: B4 가로세로 어느 방향이라도 자유롭게
Page 10: B4 가로세로 어느 방향이라도 자유롭게
Page 11: B4 가로세로 어느 방향이라도 자유롭게

우리가 만든 앱은..?

Page 12: B4 가로세로 어느 방향이라도 자유롭게
Page 13: B4 가로세로 어느 방향이라도 자유롭게
Page 14: B4 가로세로 어느 방향이라도 자유롭게

무엇이 문제일까

Page 15: B4 가로세로 어느 방향이라도 자유롭게

첫번째,

Page 16: B4 가로세로 어느 방향이라도 자유롭게

320

Page 17: B4 가로세로 어느 방향이라도 자유롭게

320 = 아이폰 화면너비

세로

Page 18: B4 가로세로 어느 방향이라도 자유롭게

CGRectMake(320 - 27 - 6, y, 27, 28);

Page 19: B4 가로세로 어느 방향이라도 자유롭게

480

Page 20: B4 가로세로 어느 방향이라도 자유롭게

480320 |

Page 21: B4 가로세로 어느 방향이라도 자유롭게

if (UIInterfaceOrientationIsPortrait(orientation)) {

width = 320;

} else if (UIInterfaceOrientationIsLandscape(orientation)) {

width = 480;

}

Page 22: B4 가로세로 어느 방향이라도 자유롭게
Page 23: B4 가로세로 어느 방향이라도 자유롭게

1024768

Page 24: B4 가로세로 어느 방향이라도 자유롭게

320 480 768 1024

Page 25: B4 가로세로 어느 방향이라도 자유롭게

if (iPhone) {

if (UIInterfaceOrientationIsPortrait(orientation)) {

width = 320;

} else if (UIInterfaceOrientationIsLandscape(orientation)) {

width = 480;

}

} else if (iPad) {

if (UIInterfaceOrientationIsPortrait(orientation)) {

width = 768;

} else if (UIInterfaceOrientationIsLandscape(orientation)) {

width = 1024;

}

}

Page 26: B4 가로세로 어느 방향이라도 자유롭게

과연 이것으로 끝?

Page 27: B4 가로세로 어느 방향이라도 자유롭게
Page 28: B4 가로세로 어느 방향이라도 자유롭게
Page 29: B4 가로세로 어느 방향이라도 자유롭게

두번째,

Page 30: B4 가로세로 어느 방향이라도 자유롭게

절대 좌표

Page 31: B4 가로세로 어느 방향이라도 자유롭게
Page 32: B4 가로세로 어느 방향이라도 자유롭게

세로 화면

Page 33: B4 가로세로 어느 방향이라도 자유롭게

photo.frame = CGRectMake(0, 0, 77, 77);

name.frame = CGRectMake(77 + 10, 10, 320 - 77 - 10 - 50, 15);

status.frame = CGRectMake(77 + 10, 28, 320 - 77 - 10 - 50, 15);

Page 34: B4 가로세로 어느 방향이라도 자유롭게

가로 화면 - 기대

Page 35: B4 가로세로 어느 방향이라도 자유롭게

가로 화면 - 실제

Page 36: B4 가로세로 어느 방향이라도 자유롭게

그럼 이제 어떻게..?

Page 37: B4 가로세로 어느 방향이라도 자유롭게

문제점1) 고정된 화면 너비 값 필요2) 절대좌표 사용

Page 38: B4 가로세로 어느 방향이라도 자유롭게

해결방법1) 고정된 화면 너비 값 제거2) 절대좌표 제거

Page 39: B4 가로세로 어느 방향이라도 자유롭게

해결방법1) 고정된 화면 너비 값 제거2) 절대좌표 제거

Page 40: B4 가로세로 어느 방향이라도 자유롭게
Page 41: B4 가로세로 어느 방향이라도 자유롭게
Page 42: B4 가로세로 어느 방향이라도 자유롭게

상태 바

Page 43: B4 가로세로 어느 방향이라도 자유롭게

[[UIApplication sharedApplication] statusBarFrame];

Page 44: B4 가로세로 어느 방향이라도 자유롭게

if (iPhone) {

if (UIInterfaceOrientationIsPortrait(orientation)) {

width = 320;

} else if (UIInterfaceOrientationIsLandscape(orientation)) {

width = 480;

}

} else if (iPad) {

if (UIInterfaceOrientationIsPortrait(orientation)) {

width = 768;

} else if (UIInterfaceOrientationIsLandscape(orientation)) {

width = 1024;

}

}

Page 45: B4 가로세로 어느 방향이라도 자유롭게

width = [[UIApplication sharedApplication] statusBarFrame].size.width;

Page 46: B4 가로세로 어느 방향이라도 자유롭게

해결방법1) 고정된 화면 너비 값 제거2) 절대좌표 제거

Page 47: B4 가로세로 어느 방향이라도 자유롭게

아직 끝난게 아니다?

Page 48: B4 가로세로 어느 방향이라도 자유롭게
Page 49: B4 가로세로 어느 방향이라도 자유롭게

화면 너비 ≠ 뷰의 너비

Page 50: B4 가로세로 어느 방향이라도 자유롭게

뷰의 너비

Page 51: B4 가로세로 어느 방향이라도 자유롭게

뷰의 너비는 변할 수 있다

Page 52: B4 가로세로 어느 방향이라도 자유롭게

뷰의 크기는 변할 수 있다

Page 53: B4 가로세로 어느 방향이라도 자유롭게

문제점1) 고정된 화면 너비 값 필요2) 절대좌표 사용

Page 54: B4 가로세로 어느 방향이라도 자유롭게

해결방법1) 고정된 화면 너비 값 제거2) 절대좌표 제거

Page 55: B4 가로세로 어느 방향이라도 자유롭게

해결방법1) 화면 크기에 대한 가정을 제거2) 절대좌표 제거

Page 56: B4 가로세로 어느 방향이라도 자유롭게

뷰의 크기는 언제라도 변할 수 있다고 가정할 것. 반드시. 꼭!

Page 57: B4 가로세로 어느 방향이라도 자유롭게

어떻게 하면 정확한 뷰의 너비를 얻을 수 있는가

Page 58: B4 가로세로 어느 방향이라도 자유롭게

어떻게 하면 임의의 뷰의 너비로 배치할 수 있는가

Page 59: B4 가로세로 어느 방향이라도 자유롭게

어떻게 하면 뷰의 크기가 변해도 잘 배치되는가

Page 60: B4 가로세로 어느 방향이라도 자유롭게

오토리사이징Autoresizing

Page 61: B4 가로세로 어느 방향이라도 자유롭게

UIView@property (nonatomic) UIViewAutoresizing autoresizingMask

Page 62: B4 가로세로 어느 방향이라도 자유롭게

상위뷰의 크기가 변할때하위뷰는 그에 맞춰어떻게 변할 것인가

Page 63: B4 가로세로 어느 방향이라도 자유롭게
Page 64: B4 가로세로 어느 방향이라도 자유롭게
Page 65: B4 가로세로 어느 방향이라도 자유롭게
Page 66: B4 가로세로 어느 방향이라도 자유롭게

오토리사이징 마스크 - 네비게이션 바

Page 67: B4 가로세로 어느 방향이라도 자유롭게

bar.autoresizingMask =

UIViewAutoresizingFlexibleWidth |

UIViewAutoresizingFlexibleBottomMargin;

Page 68: B4 가로세로 어느 방향이라도 자유롭게
Page 69: B4 가로세로 어느 방향이라도 자유롭게
Page 70: B4 가로세로 어느 방향이라도 자유롭게
Page 71: B4 가로세로 어느 방향이라도 자유롭게
Page 72: B4 가로세로 어느 방향이라도 자유롭게
Page 73: B4 가로세로 어느 방향이라도 자유롭게

오토리사이징 마스크 - 탭 바

Page 74: B4 가로세로 어느 방향이라도 자유롭게
Page 75: B4 가로세로 어느 방향이라도 자유롭게
Page 76: B4 가로세로 어느 방향이라도 자유롭게
Page 77: B4 가로세로 어느 방향이라도 자유롭게
Page 78: B4 가로세로 어느 방향이라도 자유롭게
Page 79: B4 가로세로 어느 방향이라도 자유롭게

오토리사이징 마스크 - 뷰 중앙정렬

Page 80: B4 가로세로 어느 방향이라도 자유롭게

view.autoresizingMask =

UIViewAutoresizingFlexibleTopMargin |

UIViewAutoresizingFlexibleBottomMargin |

UIViewAutoresizingFlexibleLeftMargin |

UIViewAutoresizingFlexibleRightMargin;

Page 81: B4 가로세로 어느 방향이라도 자유롭게

오토리사이징 마스크 - 백그라운드 뷰

Page 82: B4 가로세로 어느 방향이라도 자유롭게
Page 83: B4 가로세로 어느 방향이라도 자유롭게

프로필 이미지

Page 84: B4 가로세로 어느 방향이라도 자유롭게

오토리사이징 마스크 - 프로필 이미지

Page 85: B4 가로세로 어느 방향이라도 자유롭게

profile.autoresizingMask =

UIViewAutoresizingFlexibleBottomMargin |

UIViewAutoresizingFlexibleRightMargin;

Page 86: B4 가로세로 어느 방향이라도 자유롭게

프로필 이미지

Page 87: B4 가로세로 어느 방향이라도 자유롭게

대화명

Page 88: B4 가로세로 어느 방향이라도 자유롭게

메시지

Page 89: B4 가로세로 어느 방향이라도 자유롭게

시간

Page 90: B4 가로세로 어느 방향이라도 자유롭게

상위 뷰의

영향만 받는 요소

Page 91: B4 가로세로 어느 방향이라도 자유롭게

다른 요소들의

영향을 받는 요소

Page 92: B4 가로세로 어느 방향이라도 자유롭게

오토리사이징 만으로는

모든 것을 해결할 수 없다

Page 93: B4 가로세로 어느 방향이라도 자유롭게

뷰 레이아웃 코딩

Page 94: B4 가로세로 어느 방향이라도 자유롭게

뷰 프레임 코딩

Page 95: B4 가로세로 어느 방향이라도 자유롭게

뷰 코딩

Page 96: B4 가로세로 어느 방향이라도 자유롭게

노가다

Page 97: B4 가로세로 어느 방향이라도 자유롭게

커스텀 뷰

Page 98: B4 가로세로 어느 방향이라도 자유롭게

커스텀 뷰 클래스vs

뷰 컨트롤러

Page 99: B4 가로세로 어느 방향이라도 자유롭게

기준

- 임의 크기의 뷰 생성 UIViewController

- 해당 뷰 안에 하위 뷰 배치 UIView

Page 100: B4 가로세로 어느 방향이라도 자유롭게

화면 회전↓

뷰 컨트롤러↓

뷰↓

서브 뷰 레이아웃

shouldAutorotateToInterfaceOrientation:

layoutSubviews

self.view

Page 101: B4 가로세로 어느 방향이라도 자유롭게

UIView- initWithFrame:

- layoutSubviews

Page 102: B4 가로세로 어느 방향이라도 자유롭게

기준

- 임의 크기의 뷰 생성 initWithFrame:

- 해당 뷰 안에 하위 뷰 배치 layoutSubviews

Page 103: B4 가로세로 어느 방향이라도 자유롭게

핵심 포인트

1) 화면 너비가 아닌 현재 뷰의 너비를 기준

2) 각 요소의 절대 위치가 아닌 요소간 간격

을 고려

Page 104: B4 가로세로 어느 방향이라도 자유롭게

프레임frame

Page 105: B4 가로세로 어느 방향이라도 자유롭게

제대로 알고 사용하자

Page 106: B4 가로세로 어느 방향이라도 자유롭게

UIView.frame 상위 뷰 상에 자신이 위치한 영역

.bounds 자신의 영역

Page 107: B4 가로세로 어느 방향이라도 자유롭게

바운드

{0, 0, 150, 150}

100

100

150

150

프레임

{100, 100, 150, 150}

Page 108: B4 가로세로 어느 방향이라도 자유롭게

69

69

212

212

바운드

{0, 0, 150, 150}

프레임

{69, 69, 212, 212}

Page 109: B4 가로세로 어느 방향이라도 자유롭게

window

Page 110: B4 가로세로 어느 방향이라도 자유롭게

application frame

status bar

{0, 20, 320, 460}

Page 111: B4 가로세로 어느 방향이라도 자유롭게

- (void)loadView { [super loadView]; self.view.backgroundColor = [UIColor redColor]; CGRect f = [[UIScreen mainScreen] applicationFrame]; UIView *bg = [[UIView alloc] initWithFrame:f]; bg.backgroundColor = [UIColor grayColor]; [self.view addSubview:bg]; [bg release];}

Page 112: B4 가로세로 어느 방향이라도 자유롭게

결과는..

Page 113: B4 가로세로 어느 방향이라도 자유롭게
Page 114: B4 가로세로 어느 방향이라도 자유롭게

왜?

Page 115: B4 가로세로 어느 방향이라도 자유롭게

application frame

status bar

{0, 20, 320, 460}

Page 116: B4 가로세로 어느 방향이라도 자유롭게

application frame

status bar

{0, 20, 320, 460}

Page 117: B4 가로세로 어느 방향이라도 자유롭게

센터center

Page 118: B4 가로세로 어느 방향이라도 자유롭게
Page 119: B4 가로세로 어느 방향이라도 자유롭게
Page 120: B4 가로세로 어느 방향이라도 자유롭게

CGRect f = CGRectMake(50, 100, 150, 150);UIView *view = [[UIView alloc] initWithFrame:f];[self.view addSubview:view];

f = CGRectMake(0, 0, 80, 80);UIView *subview = [[UIView alloc] initWithFrame:f];subview.center = view.center;[view addSubview:subview];

Page 121: B4 가로세로 어느 방향이라도 자유롭게
Page 122: B4 가로세로 어느 방향이라도 자유롭게

CGRect f = CGRectMake(50, 100, 150, 150);UIView *view = [[UIView alloc] initWithFrame:f];[self.view addSubview:view];

f = CGRectMake(0, 0, 80, 80);UIView *subview = [[UIView alloc] initWithFrame:f];subview.center = view.center;[view addSubview:subview];

Page 123: B4 가로세로 어느 방향이라도 자유롭게

CGRect f = CGRectMake(50, 100, 150, 150);UIView *view = [[UIView alloc] initWithFrame:f];[self.view addSubview:view];

f = CGRectMake(0, 0, 80, 80);UIView *subview = [[UIView alloc] initWithFrame:f];subview.center = view.center;[self.view addSubview:subview];

Page 124: B4 가로세로 어느 방향이라도 자유롭게
Page 125: B4 가로세로 어느 방향이라도 자유롭게

기준이 되는 좌표계가

어디인가에 따라

결과가 달라진다

Page 126: B4 가로세로 어느 방향이라도 자유롭게

기준이 되는 좌표계가

동일하다면

결과는 같아진다

Page 127: B4 가로세로 어느 방향이라도 자유롭게

상위 뷰가

동일하다면

결과는 같아진다

Page 128: B4 가로세로 어느 방향이라도 자유롭게

“뷰 계층구조를

적절하게 구성하라”

Page 129: B4 가로세로 어느 방향이라도 자유롭게

CGRect 시리즈

Page 130: B4 가로세로 어느 방향이라도 자유롭게

CGRectGetMinXCGRectGetMidXCGRectGetMaxX

Page 131: B4 가로세로 어느 방향이라도 자유롭게

CGRectGetMaxYframe.origin.y + frame.size.height

Page 132: B4 가로세로 어느 방향이라도 자유롭게

메시지

Page 133: B4 가로세로 어느 방향이라도 자유롭게

메시지 Y = 대화명 최대 Y + 간격

Page 134: B4 가로세로 어느 방향이라도 자유롭게

메시지 Y = 대화명 최대 Y + 간격메시지 Y = 대화명 최대 Y + 간격

메시지 Y = 대화명 Y + 대화명 H + 간격msgFrame.origin.y = nameFrame.origin.y + nameFrame.size.height + 5;

msgFrame.origin.y = CGRectGetMaxY(nameFrame) + 5;

Page 135: B4 가로세로 어느 방향이라도 자유롭게

그러나..

Page 136: B4 가로세로 어느 방향이라도 자유롭게
Page 137: B4 가로세로 어느 방향이라도 자유롭게

텍스트 길이는

변한다.

Page 138: B4 가로세로 어느 방향이라도 자유롭게

텍스트 라벨의 크기는

변한다.

Page 139: B4 가로세로 어느 방향이라도 자유롭게

텍스트 라벨의 크기는

변해야 한다.

Page 140: B4 가로세로 어느 방향이라도 자유롭게

텍스트 라벨의 크기를

구해야 한다.

Page 141: B4 가로세로 어느 방향이라도 자유롭게

NSString- sizeWithFont:

- sizeWithFont:constrainedToSize:

Page 142: B4 가로세로 어느 방향이라도 자유롭게

NSString- sizeWithFont:

- sizeWithFont:constrainedToSize:

Page 143: B4 가로세로 어느 방향이라도 자유롭게
Page 144: B4 가로세로 어느 방향이라도 자유롭게

CGFloat maxWidth = 150.0f;

CGSize maxSize = CGSizeMake(maxWidth, CGFLOAT_MAX);CGSize size = [msg.text sizeWithFont:msg.font constrainedToSize:maxSize];

CGRect f = msg.frame;f.size.height = size.height;msg.frame = f;

Page 145: B4 가로세로 어느 방향이라도 자유롭게
Page 146: B4 가로세로 어느 방향이라도 자유롭게

CGFloat maxWidth = CGRectGetWidth(self.bounds) - (CGRectGetWidth(photo.bounds) + CGRectGetWidth(time.bounds) + offset1 + offset2 + offset3 + offset4); CGSize maxSize = CGSizeMake(maxWidth, CGFLOAT_MAX);CGSize size = [msg.text sizeWithFont:msg.font constrainedToSize:maxSize];

CGRect f = msg.frame;f.size.width = size.width;f.size.height = size.height;msg.frame = f;

Page 147: B4 가로세로 어느 방향이라도 자유롭게
Page 148: B4 가로세로 어느 방향이라도 자유롭게
Page 149: B4 가로세로 어느 방향이라도 자유롭게

시간

Page 150: B4 가로세로 어느 방향이라도 자유롭게

CGRect f = time.frame;f.origin.x = CGRectGetMaxX(msg.frame) + 5;f.origin.y = CGRectGetMaxY(msg.frame) - CGRectGetHeight(f);time.frame = f;

Page 151: B4 가로세로 어느 방향이라도 자유롭게

해결방법1) 화면 크기에 대한 가정을 제거2) 절대좌표 제거

Page 152: B4 가로세로 어느 방향이라도 자유롭게

해결방법1) 화면 크기에 대한 가정을 제거2) 절대좌표 제거

Page 153: B4 가로세로 어느 방향이라도 자유롭게

Mission Complete

Page 154: B4 가로세로 어느 방향이라도 자유롭게

배치 순서는

화면 좌표계 방향과

동일하다

Page 155: B4 가로세로 어느 방향이라도 자유롭게

배치 순서는

좌에서 우로

위에서 아래로

Page 156: B4 가로세로 어느 방향이라도 자유롭게

지금까지..

Page 157: B4 가로세로 어느 방향이라도 자유롭게

뷰의 너비는

항상 변한다고 가정하라

1

Page 158: B4 가로세로 어느 방향이라도 자유롭게

화면 너비 보다는

현재 뷰의 너비를 기준으로

2

Page 159: B4 가로세로 어느 방향이라도 자유롭게

각 요소들의 절대 위치보다

요소들간의 상대적 위치를 고려

3

Page 160: B4 가로세로 어느 방향이라도 자유롭게

다른 요소의 영향을 받지 않는 요소는

오토리사이징 마스크를 적용

4

Page 161: B4 가로세로 어느 방향이라도 자유롭게

프레임은 상위 뷰 좌표계 기준이고

바운드는 자신의 좌표계 기준이다

5

Page 162: B4 가로세로 어느 방향이라도 자유롭게

뷰 계층구조를 잘 구성하고

다른 요소의 프레임을 최대한 활용

6

Page 163: B4 가로세로 어느 방향이라도 자유롭게

레이아웃 순서는

좌에서 우로, 위에서 아래로

7

Page 164: B4 가로세로 어느 방향이라도 자유롭게

?

Q & A

Page 165: B4 가로세로 어느 방향이라도 자유롭게

이메일 [email protected]

트위터 redleafgogo

미투데이 redleafgogo

Page 166: B4 가로세로 어느 방향이라도 자유롭게

감사합니다