티스토리 뷰

모바일/iOS

Auto Layout 사용시 UIScrollView 스크롤

VoidNoble 공허공자 2014. 2. 26. 17:27

폼의 입력란 클릭하면 키보드가 화면을 가리게 되는데
이때 스크롤뷰의 크기를 키보드 높이만큼 빼주면
스크롤뷰가 스크롤을 표시하게 되어

키보드가 올라와 있는 상태에서
다른 입력 뷰들을 볼 수 있게 하는
iOS 5 앱 만들때 기존에 썼던 코드들을 썼는데

젠장할... Scroll Indicator 나타나지 않는것이었다.

삽질의 시간 후에 알게되었지만
예전에 사용했던 xib은 스크롤 지시자가 잘 나타나서
살펴보니 AutoLayout 이 un-check 되어 있었다.

결국, Auto Layout 상에서 UIScrollView를 동작시킬 방법을 구글링 하고
삽질한 끝에 아래의 링크를 통하여 스크롤 문제를 해결했다.

http://www.g8production.com/post/57513133020/auto-layout-with-uiscrollview-how-to-use

auto layout 사용시, 뷰들은 constraint properties를 기반으로 자동적으로 크기조정 될것이다.

그러나, 자동 레이아웃 상태에서 UIScrollView 를 컨테이너와같이 사용할 경우, 기대한대로 작동하지 않을것이다. 

이유는 다음의 링크에서 알아볼 수 있다 http://developer.apple.com/library/ios/#releasenotes/General/RN-iOSSDK-6_0/index.html

일반적으로, 자동 레이아웃은 뷰에서 가장자리가 될 the top, left, bottom, and right edges 들을 고려한다. 그것은, 만약 뷰를 superview의 왼쪽 가장자리에 고장한다 할때, 실제로는 superview의 bounds의 최소 x값에 그것을 고장하는것이다. superview의 bounds origin을 바꾸는것은 뷰의 위치를 바꾸지 않는다.

The UIScrollView class scrolls its content by changing the origin of its boundsTo make this work with Auto Layout, the top, left, bottom, and right edges within a scroll view now mean the edges of its content view.

The constraints on the subviews of the scroll view must result in a size to fill, which is then interpreted as the content size of the scroll view. (This should not be confused with the intrinsicContentSize method used for Auto Layout.) To size the scroll view’s frame with Auto Layout, constraints must either be explicit regarding the width and height of the scroll view, or the edges of the scroll view must be tied to views outside of its subtree.

Note that you can make a subview of the scroll view appear to float (not scroll) over the other scrolling content by creating constraints between the view and a view outside the scroll view’s subtree, such as the scroll view’s superview..

그래서, 자동레이아웃 내용과 함께 UIScrollView 최고의 설정 방법은 UIScrollView의 하위뷰로 내용 UIView를 만드는것이다.

뷰들의 트리는 아래와 같을것이다:

- MainView 
- - UIScrollView
- - - content UIView
- - - - child views

음...스크롤뷰에  스크롤뷰 위치와 크기를 외부 제약으로 거는것은
thetranslatesAutoresizingMaskIntoConstraints 속성을 NO로 설정.


- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    // 키보드 보임/숨김 이벤트때 행동을 선택하여 알림센터에 등록
    [self addKeyboardNotification];
    
    self.keyboardVisible = NO;
}

- (void)dealloc
{
    [_scrollView release];
    
    [self removeKeyboardNotification];
    
    [super dealloc];
}

-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];

self.scroll.contentSize = self.theContainerViewIntoTheScroll.bounds.size;
}

#pragma mark - Keyboard Event

- (void)addKeyboardNotification
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardDidShow:)
                                                 name:UIKeyboardDidShowNotification
                                               object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardDidHide:)
                                                 name:UIKeyboardDidHideNotification
                                               object:nil];
}

- (void)removeKeyboardNotification
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];
}

- (void)keyboardDidShow:(NSNotification *)notif
{
    if (self.keyboardVisible) {
        return;
    }
    
    NSDictionary* info = [notif userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    self.scrollView.contentInset = contentInsets;
    self.scrollView.scrollIndicatorInsets = contentInsets;
    
    // If active text field is hidden by keyboard, scroll it so it's visible
    // Your application might not need or want this behavior.
    CGSize viewFrameSize = self.view.frame.size;
    viewFrameSize.height -= kbSize.height;
    self.scrollView.contentSize = CGSizeMake(self.contentView.bounds.size.width, viewFrameSize.height);
    
    self.keyboardVisible = YES;
}

- (void)keyboardDidHide:(NSNotification *)notif
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    self.scrollView.contentInset = contentInsets;
    self.scrollView.scrollIndicatorInsets = contentInsets;
    
    self.keyboardVisible = NO;
}

#pragma mark - Making the keyboard close

- (IBAction)doneEditing:(id)sender {
    [sender resignFirstResponder];
}


댓글
댓글쓰기 폼
Total
818,296
Today
119
Yesterday
305
«   2020/02   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
글 보관함