###前提・実現したいこと
Swift初心者です。
iOSでカード表示アプリを作成しています。
1つの画面に2つのScrollViewを配置し、AutoLayoutの設定をしています。
起動してすぐに、ここに表示しているような状態になるようにしたいです。
###発生している問題・エラーメッセージ
起動時にScrollViewの中のコンテンツの表示位置がずれてしまいます。
デバイス回転時も同様です。
しかしModal画面を開き(タップした時に現れるツールバーを開く)、それを閉じると、正常の位置に表示されます。
###該当のソースコード
コードかAutoLayoutの設定かどちらが悪いのかわかっていないので、
プロジェクトを以下に挙げています。
GitHubのプロジェクト
一応ScrollView関連の設定のコードを抜粋します。
settingScrollViewとgenerateViewメソッドで実装しており、
viewWillAppearの中で呼んでいます。
Swift
1 2 //ScrollViewの設定 3 func settingScrollView () { 4 5 print("Setting View Size") 6 7 //Page幅の設定 8 //pageWidth = self.view.frame.size.width 9 pageWidth = upperCardView.frame.size.width + CGFloat(pageMargin) 10 11 //pageHeight 12 pageHeight = upperCardView.frame.size.height + CGFloat(pageMargin) 13 14 //ScrollViewのサイズ設定 15 16 if isPortrait { 17 //Portraitの時 18 upperScrollView.bounds = CGRectMake(0, 0, pageWidth, upperScrollView.frame.height) 19 lowerScrollView.bounds = CGRectMake(0, 0, pageWidth, lowerScrollView.frame.height) 20// upperScrollView.frame.size.width = pageWidth 21// lowerScrollView.frame.size.width = pageWidth 22 upperScrollView.frame = upperScrollView.bounds 23 24 //Bounceの設定 25 upperScrollView.alwaysBounceVertical = false 26 upperScrollView.alwaysBounceHorizontal = true 27 lowerScrollView.alwaysBounceVertical = false 28 lowerScrollView.alwaysBounceHorizontal = true 29 30 } else { 31 //Landscapeの時 32 upperScrollView.bounds = CGRectMake(0, 0, upperScrollView.frame.width, pageHeight) 33 lowerScrollView.bounds = CGRectMake(0, 0, lowerScrollView.frame.width, pageHeight) 34// upperScrollView.frame.size.height = pageHeight 35// lowerScrollView.frame.size.height = pageHeight 36 upperScrollView.frame = upperScrollView.bounds 37 38 //Bounceの設定 39 upperScrollView.alwaysBounceVertical = true 40 upperScrollView.alwaysBounceHorizontal = false 41 lowerScrollView.alwaysBounceVertical = true 42 lowerScrollView.alwaysBounceHorizontal = false 43 44 } 45 46 //はみ出したカードも表示 47 upperScrollView.clipsToBounds = false 48 lowerScrollView.clipsToBounds = false 49 50 } 51 52 //ScrollViewの中のPage生成 53 func generateView () { 54 55 56 //SubViewを削除 57 removeAllSubviews(upperScrollView, jogaiSubView: upperCardView) 58 removeAllSubviews(lowerScrollView, jogaiSubView: lowerCardView) 59 60 61 //コンテンツ量に合わせてScrollViewのサイズを確保 62 if isPortrait { 63 upperScrollView.contentSize = CGSizeMake(pageWidth * CGFloat(upperCardString.count), upperScrollView.frame.height) 64 lowerScrollView.contentSize = CGSizeMake(pageWidth * CGFloat(lowerCardString.count), lowerScrollView.frame.height) 65 } else { 66 upperScrollView.contentSize = CGSizeMake(upperScrollView.frame.width, pageHeight * CGFloat(upperCardString.count) ) 67 lowerScrollView.contentSize = CGSizeMake(lowerScrollView.frame.width, pageHeight * CGFloat(lowerCardString.count)) 68 } 69 70 71 //viewの生成(Upper) 72 print("generate view") 73 74 for i in 0 ..< upperCardString.count { 75 76 //CardViewを複製 77 let genCardView = duplicateCardView(upperCardView, index: i) 78 upperScrollView.addSubview(genCardView) 79 80 //ラベルの裏ビューを複製 81 let genLabelBG = duplicateBGView(upperCVlabelBG) 82 genCardView.addSubview(genLabelBG) 83 84 //ラベルView1を設定 85 let genLabel1 = duplicateLabel(upperCVlabel1) 86 genCardView.addSubview(genLabel1) 87 //ラベルView2を設定 88 let genLabel2 = duplicateLabel(upperCVlabel2) 89 genCardView.addSubview(genLabel2) 90 91 //テキストViewを設定 92 let cardText = duplicateTextView(upperCVtext) 93 genCardView.addSubview(cardText) 94 95 //ラベルとテキストの中身を設定 96 genLabel1.text = upperCardString[i][0] 97 genLabel2.text = upperCardString[i][1] 98 cardText.text = upperCardString[i][2] 99 } 100 101 102 //viewの生成(lower) 103 for i in 0 ..< lowerCardString.count { 104 105 //CardViewを複製 106 let genCardView = duplicateCardView(lowerCardView, index: i) 107 lowerScrollView.addSubview(genCardView) 108 109 //ラベルの裏ビューを複製 110 let genLabelBG = duplicateBGView(lowerCVlabelBG) 111 genCardView.addSubview(genLabelBG) 112 113 //ラベルView1を設定 114 let genLabel1 = duplicateLabel(lowerCVlabel1) 115 genCardView.addSubview(genLabel1) 116 //ラベルView2を設定 117 let genLabel2 = duplicateLabel(lowerCVlabel2) 118 genCardView.addSubview(genLabel2) 119 120 //テキストViewを設定 121 let cardText = duplicateTextView(lowerCVtext) 122 genCardView.addSubview(cardText) 123 124 //ラベルとテキストの中身を設定 125 genLabel1.text = lowerCardString[i][0] 126 genLabel2.text = lowerCardString[i][1] 127 cardText.text = lowerCardString[i][2] 128 129 } 130 131 //最初の表示位置の初期化 132 print("Position Reset") 133 upperScrollView.contentOffset = CGPointMake(0, 0); 134 lowerScrollView.contentOffset = CGPointMake(0, 0); 135 136 } 137
###試したこと
上記のコードを、viewDidAppearの中で呼んでみたり、
UIScrollView.contentOffset = 0
をいろいろな所に入れてみたりしています。
また、AutoLayout使用以前は正しく表示されていました。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
XCode7.3.1, Swift, iPhone6で検証しています
回答1件
あなたの回答
tips
プレビュー