回答:
完全に機能するコードスニペットを表示することは常に良いことです。
// in viewDidLoad (if using Autolayout check note below):
UIScrollView *myScrollView;
UIView *contentView;
// scrollview won't scroll unless content size explicitly set
[myScrollView addSubview:contentView];//if the contentView is not already inside your scrollview in your xib/StoryBoard doc
myScrollView.contentSize = contentView.frame.size; //sets ScrollView content size
Swift 4.0
let myScrollView
let contentView
// scrollview won't scroll unless content size explicitly set
myScrollView.addSubview(contentView)//if the contentView is not already inside your scrollview in your xib/StoryBoard doc
myScrollView.contentSize = contentView.frame.size //sets ScrollView content size
IBでcontentSizeを設定する方法が見つかりません(Xcode 5.0以降)。
注:Autolayoutを使用している場合、このコードを配置するのに最適な場所は-(void)viewDidLayoutSubviews
メソッド内です。
myScrollView.delegate = self
ALSO を設定することを忘れないでください。これがまだ機能しない場合は、この下の答えに素晴らしいアドバイスがあります(xib / StoryBoardに移動して、「AutoLayout」が無効になっていることを確認してください)。プロのヒント:<UIScrollViewDelegate>
UIScrollViewをプログラムでスクロールするなどの操作を行う場合は、.hファイルに含めることもできます。
viewDidLayoutSubviews
とうまくいきます。
contentSizeを正しく設定してもビューをスクロールできない場合は、Interface Builder-> File Inspectorで[Use AutoLayout] をオフにしてください。
設定する必要があります contentSize
スクロールビューを適切にスクロールするには、スクロールビューのプロパティます。
あなたが自動レイアウトを使用している場合は、設定する必要contentSize
でviewDidLayoutSubviews
、それが自動レイアウトが完了した後に適用するために。
コードは次のようになります。
-(void)viewDidLayoutSubviews
{
// The scrollview needs to know the content size for it to work correctly
self.scrollView.contentSize = CGSizeMake(
self.scrollContent.frame.size.width,
self.scrollContent.frame.size.height + 300
);
}
contentSize
の大きさにしcontentView
、scrollViewとcontentViewの大きさが同じに設定しますように思われます。しかしcontentSize
、の高さをの高さよりも大きい値に設定するとcontentView
、機能しました。
viewDidLayoutSubviews
ライフサイクル中に複数回呼び出される可能性があるため、高さが予想よりも高くなるリスクがあります。
上記の答えは正しいです-スクロールを発生させるには、コンテンツサイズを設定する必要があります。
インターフェイスビルダーを使用している場合、これを行うための適切な方法は、ユーザー定義のランタイム属性を使用することです。例えば:
コンテンツのサイズを膨大な数に変更してみてください。コンテンツのサイズがコントロールのサイズよりも大きいように見えても、スクロールビューがスクロールしない理由を理解できませんでした。コンテンツのサイズが必要なサイズよりも小さいと機能しないことを発見しました。
self.scrollView.contentSize = CGSizeMake(2000, 2000);
2000年の代わりに、あなたはあなた自身の大きな数を置くことができます。それが機能する場合は、サイズを変更したときにコンテンツサイズが十分に大きくないことを意味します。
スクロールビューが機能するためにデリゲートは必要ありません。
私はそれを最初の試みで機能させました。自動レイアウトとすべてで、追加のコードはありません。次に、コレクションビューがバナナになり、実行時にクラッシュし、何が問題かを見つけることができなかったので、それを削除して再作成し(Xcode 10 Beta 4を使用しています)、それでスクロールがなくなりました。ただし、コレクションビューは再び機能しました。
数時間後..これは私のためにそれを修正したものです。私は次のレイアウトを持っていました:
UIView
それはすべて制約の中にあります。安全領域はシステムによって自動的に定義されます。最悪の場合には、スクロールやコンテンツビューのすべての制約を削除してくださいません IBはあなたのためにそれらを作成/リセットがあります。手動で作成してください。
基本的には、コンテンツビューをScrollviewに適合させることです。これは、セーフエリアに適合します。
しかし、それ自体は機能しませんでした。コンテンツビューの高さがありません。私はできる限りのことを試みましたが、トリックを行う唯一の方法は、コンテンツビューの高さを作成して、コントロールをドラッグするコンテンツビューをそれ自体にしたことです。これは、ビューコントローラのサイズから計算された固定の高さを定義し(実際のディスプレイよりも長い、フリーフォームとして定義され、すべてのサブビューを含む)、最後に再び機能しました!
以前に言及されなかった何か!
コンセントがscrollViewに正しく接続されていることを確認してください!塗りつぶされた円が表示されるはずですが、塗りつぶされた円であっても、scrollViewが接続されていない可能性があるため、再確認してください。円にカーソルを合わせて、実際のスクロールビューが強調表示されるかどうかを確認してください!(これは私の場合でした)
//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
チュートリアルが、どのような多くの初心者はscrollViewがされていることであるかわからない続いている場合は、時間の多くのコードは正しいです、NOTシミュレータによって正常にスクロールしようとします。あなたがマウスパッドを押し下げたときにのみスクロールすると仮定されると同時にスクロール。多くの経験豊富な XCode / Swift / Obj-Cユーザーはこれに慣れているので、初心者が見落とす可能性がある方法を知りません。チャオ:-)
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(scrollView)
// Do any additional setup after the view
}
override func viewWillLayoutSubviews(){
super.viewWillLayoutSubviews()
scrollView.contentSize = CGSize(width: 375, height: 800)
}
このコードは、上記で言ったことを実行している限り、問題なく機能します。
他の解決策がどれも機能しない場合は、スクロールビューが実際UIScrollView
にInterface Builderにあることを再確認してください。
この数日間のある時点で、クラスがインスペクタで言っていたとしても、UIScrollView
自発的に型がに変更さUIView
れUIScrollView
ました。私は使用していXcode 5.1 (5B130a)
ます。
新しいスクロールビューを作成して、測定、設定、および制約を古いビューからコピーするか、手動でファイルUIScrollView
内のビューに変更することができxib
ます。私は比較して、次の違いを見つけました:
元の:
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" bounces="NO" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Wsk-WB-LMH">
...
</scrollView>
タイプが自発的に変更された後:
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" customClass="UIScrollView" id="qRn-TP-cXd">
...
</view>
そのため、この<view>
行を元の<scrollView>
行に置き換えました。
また、ビューの終了タグ</view>
をに置き換えました</scrollView>
。
IDは必ず現在のビューと同じにしてください。この場合は、id = "qRn-TP-cXd"です。
また、アプリの派生データを削除して、Xcodeのキャッシュからxibをフラッシュする必要がありました。
Xcode->Window->Organizer->Projects
、プロジェクトを選択し、[派生データ]行で[削除...]をクリックします。または、デバイスを使用している場合:
Xcode->Window->Organizer->Device
、デバイスを選択->アプリケーション、アプリを選択、(-)をクリックプロジェクトをクリーンアップし、アプリをシミュレーター/デバイスから削除します。
Xcode->Product->Clean
Simulator/device->press
とapp->click
(X)を押して削除しますこれで、アプリをビルドして実行し、スクロール機能を再び利用できるようになります。
PSスクロールビューのコンテンツサイズを設定しviewDidLayoutSubviews
たり、自動レイアウトをオフにする必要はありませんでしたが、YMMVでした。
が何らかのタイプののscrollView
サブビューである場合は、がのフレームまたは境界内にあるcontainerView
ことを確認してください。私が持っていたまだ私はscrollViewを参照可能となったが、ための範囲内にありませんでしたそれのタッチイベントを検出しません。scrollView
containerView
containerView.clipsToBounds = NO
scrollView
containerView
例えば:
containerView.frame = CGRectMake(0, 0, 200, 200);
scrollView.frame = CGRectMake(0, 200, 200, 200);
[containerView addSubview:scrollView];
scrollView.userInteractionEnabled = YES;
scrollViewを表示することはできますが、ユーザーの操作を受け取ることはありません。
次のコードを追加するviewDidLayoutSubviews
と、Autolayoutで機能します。すべての答えを試した後:
- (void)viewDidLayoutSubviews
{
self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620);
}
//set the height of content size as required
さらに別の楽しいケース:
scrollview.superview.userInteractionEnabledはtrueでなければなりません
親がUIImageViewであることを理解するためにこれを追いかける2時間以上を無駄にしましたが、当然、これにはuserInteractionEnabled == falseがあります
このスレッドで提供された回答で失敗した後、私はこの記事に解決策を見つけました。
autolayoutでスクロールビューを設定することには、直感的でない2つの点があります。
これがその記事の要点です。イラストを含む完全な説明については、チェックしてください。