2017-12-15 39 views
0

MyView 파일에서 프로그래밍 방식으로 만든 scrollView가 있습니다.UIScrollView 너비가 화면보다 큽니다.

let myScrollView: UIScrollView = { 
    let scrollView = UIScrollView() 
    scrollView.translatesAutoresizingMaskIntoConstraints = false 
    scrollView.isUserInteractionEnabled = true 
    return scrollView 
}() 

Visual Format Language를 사용하여 모든 제약 조건을 superView와 동일하게 설정했습니다.

func setupViews() { 
    self.frame = UIScreen.main.bounds 

    addSubview(myScrollView) 

    addConstraintsWithFormat(format: "H:|[v0]|", views: myScrollView) 
    addConstraintsWithFormat(format: "V:|[v0]|", views: myScrollView)  

}

내있는 ScrollView는 버튼과 라벨을 가지고있다.

myView.myScrollView.contentSize = CGSize(width: self.view.frame.size.width, height: self.view.frame.size.height + 200) 

모든 것이 잘 작동 :의 ViewController에서

viewDidLayoutSubviews에 내가 contentSize을 설정 내가 스크롤 할 수 있습니다, myScrollView의 높이가 완벽하지만, 폭

여기에만 아이폰 X 용 완벽한입니다 아이폰 SE 예 :

enter image description here

있는 ScrollView 화면보다 넓다. iPhone Plus에서는 화면보다 작습니다.

내가 뭘 잘못하고 어떻게 해결할 수 있습니까?

미리 감사드립니다.

+0

에서

func addScrollViewHeader() { scrollViewHeader.isUserInteractionEnabled = false scrollViewHeader.translatesAutoresizingMaskIntoConstraints = false scrollView.addSubview(scrollViewHeader) scrollViewHeader.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true scrollViewHeader.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true scrollViewHeader.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true scrollViewHeader.heightAnchor.constraint(equalToConstant: Shared.statusBarHeight + 32).isActive = true } 

// 파단이 문제가 해결 되었습니까? – iDeveloper

+0

iDeveloper, 아직 없습니다. 이 작업 ... – Jonagold

+0

문제가 해당 답변을 사용하여 수정되었습니다. - https://stackoverflow.com/questions/19036228/uiscrollview-scrollable-content-size-ambiguity/27227174#27227174 – Jonagold

답변

0

먼저 addSubviewlayoutSubviews()에 입력하지 마십시오. 이는 모든 레이아웃에서 뷰를 추가한다는 의미입니다. 계층 구조에 여러 개의 scrollViews가있을 수 있습니다.

두 번째로 scrollView.frame = bounds을 수행하고 그에 따라 실제 contentSize을 계산할 수 있습니다. 콘텐츠 크기는 scrollView frame과 아무 관련이 없습니다. 최하층의 시각을 얻고 맥시를 잡아야합니다. X 축도 동일합니다. 콘텐츠를 수직으로 스크롤하려는 경우 contentSize = CGSize(width: width, height: lastViewInScrollView.frame.maxY)과 같은 기능을 사용할 수 있습니다.

당신이 절대적으로 VFL이 필요하면, 적어도 계산하여 contentSize 제대로있는 ScrollView 외부 layouted됩니다보기에 관해서는

(즉, scrollView에 포함 된 뷰의 실제 프레임 함께), 그 수 있습니다 이보기에 대해 잘못된 크기를 설정했습니다.

+0

Francis, 의견을 보내 주셔서 감사합니다. 언급 한 내용이 변경되었지만 여전히 동일한 문제가 있습니다. – Jonagold

0

자동 레이아웃과 스크롤보기를 함께 사용할 때 명시적인 크기를 계산할 필요가 없습니다. 스크롤 loadView에서보기 (순수-프로그램 응용 가능성이 여기에 그것을 할 것) 또는 viewDidLoad 만들기 : 내 기억이 맞다 경우는, 같은 자동 레이아웃과 함께 작동하도록 애플의 문서에 몇 가지 규칙이 있습니다

override func loadView() { 

    ... 
    addScrollView() 
    addScrollViewHeader() 
    // add subviews 
    addScrollViewFooter() 

} 

func addScrollView() { 

    scrollView.translatesAutoresizingMaskIntoConstraints = false 
    view.addSubview(scrollView) 
    scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true 
    scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true 
    scrollView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1).isActive = true 
    scrollView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 1).isActive = true 

} 

, 스크롤 뷰 자체에 의존하지 않고 스크롤 뷰 자체에서 서브 뷰의 크기를 결정합니다. 하지만 가장 외부에있는 뷰 (맨 위, 맨 아래, 가장 왼쪽, 가장 오른쪽)가 스크롤 뷰에 고정되어 있고 스크롤 뷰의 내용 크기가 자동으로 확장되도록하는 것이 좋습니다.

그래서 내가하는 일은 상단과 하단에 투명 뷰를 만들어서 스크롤 뷰의 콘텐츠 크기를 늘리면 중간에있는 콘텐츠가 스크롤 뷰를 자동으로 확장하고 축소합니다.머리글/바닥 글 뷰를 사용하는 이유는 단순히 상한 제약 조건과 맨 아래 제약 조건 (스크롤 뷰의 맨 위와 맨 아래에 여분의 패딩을 만들기 위해)에 상수를 추가하는 대신 상수가 무시 된 것처럼 보이기 때문입니다 . 뷰와 콘텐츠 크기의 가장자리 사이를 "물리적으로"만져서 스트레칭해야합니다. 중간

func addScrollViewFooter() { 

    scrollViewFooter.isUserInteractionEnabled = false 
    scrollViewFooter.translatesAutoresizingMaskIntoConstraints = false 
    scrollView.addSubview(scrollViewFooter) 
    scrollViewFooter.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true 
    scrollViewFooter.topAnchor.constraint(equalTo: lastView.bottomAnchor).isActive = true 
    scrollViewFooter.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true 
    scrollViewFooter.heightAnchor.constraint(equalToConstant: 32).isActive = true 

    // and the most important constraint to make it work 
    scrollViewFooter.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true 

} 
+0

미아가 도와 주셔서 감사합니다. 그러나 다른 솔루션이 나를 위해 잘 작동했습니다. – Jonagold