多くのUIScrollView
s、UILabelsなどを含むUIImageView
があります...ラベルはUIScrollView
よりもはるかに長いですが、アプリを実行すると、クリックしてスクロールダウンできません...
これはなぜでしょうか?
ありがとう
完全に機能するコードスニペットを表示することは常に良いことです。
// 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.
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
メソッド内です。
contentSizeを正しく設定した後でもビューをスクロールできない場合、Interface Builder-> File Inspectorでncheck "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
);
}
上記の答えは正しいです-スクロールを発生させるには、コンテンツサイズを設定する必要があります。
インターフェイスビルダーを使用している場合、ユーザー定義のランタイム属性を使用してこれを行うことができます。例えば:
コンテンツのサイズを膨大な数に変更してみてください。コンテンツサイズがコントロールサイズよりも大きいと思われる場合でも、スクロールビューがスクロールしない理由を理解できませんでした。コンテンツサイズが必要なサイズよりも小さい場合も機能しないことを発見しました。
self.scrollView.contentSize = CGSizeMake(2000, 2000);
2000の代わりに、あなた自身の大きな数字を置くことができます。そして、それが機能する場合、サイズ変更時にコンテンツのサイズが十分に大きくないことを意味します。
デリゲートは、スクロールビューが機能するために必要ではありません。
スクロールビューのcontentSizeプロパティが正しいサイズ(つまり、すべてのコンテンツを包含するのに十分な大きさ)に設定されていることを確認してください。
[自動レイアウトを使用する]チェックボックスをオフにすると、トリックが実行されます。
環境:xCode 5.0.2ストーリーボードios7
私の場合、delaysContentTouches
をtrueに設定する必要がありました。これは、scrollView内のオブジェクトがすべて、scrollView自体に処理させるのではなく、タッチイベントをすべてキャプチャして処理するためです。
contentSize
メソッドでUIScrollview
のViewDidLayoutSubviews
プロパティを設定します。このようなもの
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height)
}
viewDidLayoutSubviews
が存在しないというメッセージ(IOS8/Swift)を受け取っている場合は、代わりに次を使用してください
override func viewDidAppear(animated: Bool)
これは私のためにそれを修正しました
上記のすべてが、スクロールビューがスクロールしない実際の理由ですが、スクロールビューがIBではなくコードを介して追加される場合、特に注意してください。これは、サブビューを親ビューに追加してこれにより、サブビューがスクロールしなくなります
コンテンツサイズを設定し、親ビューフレームよりも大きくしてください(duhh !!)
スクロールのコンテンツサイズをスクロールビューのサイズより小さく設定したために、スクロールビューがスクロールしない理由は間違っています。スクロール中にコンテンツをナビゲートするには、スクロールビューのサイズよりも大きいコンテンツサイズを設定する必要があります。
ズームについても同じ考え方で、ズームアクションを通じて適用されるズームの最小値と最大値を設定します。
ようこそ :)
多くの場合、チュートリアルに従っていればコードは正しいですが、多くの初心者が知らないのは、scrollViewがNOTシミュレーターを通常通りスクロールすることです。マウスパッドとを同時にスクロールしたときにのみスクロールすることを想定しています。多くのExperienced 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)
}
このコードは、上で言ったことをすれば完璧に機能します。
以前に言及されなかった何か!
コンセントがscrollViewに正しく接続されていることを確認してください!塗りつぶされた円があるはずですが、たとえ塗りつぶされた円であっても、scrollViewが接続されていない可能性があります。円にカーソルを合わせて、実際のスクロールビューが強調表示されるかどうかを確認してください! (これは私の場合でした)
//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
私は最初の試行でそれを機能させました。自動レイアウトとすべてで、追加のコードはありません。その後、コレクションビューがバナナになり、実行時にクラッシュし、何が間違っているのかを見つけることができなかったため、削除して再作成し(Xcode 10 Beta 4を使用しています。バグのように感じました)、スクロールが消えました。ただし、コレクションビューは再び機能しました。
数時間後..これは私にとってそれを修正したものです。次のレイアウトがありました。
IView
すべてが制約内にあります。セーフエリアはシステムによって自動的に定義されます。最悪の場合、スクロールビューとコンテンツビューのすべての制約を削除し、not IBをリセット/作成します。それらを手動で作成してください。
基本的に、コンセプトは、セーフビューに適合するScrollviewに適合するコンテンツビューを持つことです。
しかし、それ自体は機能しませんでした。コンテンツビューで高さが見つかりませんでした。私はできる限りのことを試してみましたが、トリックを行ったのはコンテンツビューの高さでコントロールビューを作成し、コンテンツビュー自体を作成するだけでした。これは、View Controllerのサイズから計算された固定高さを定義し(実際の表示よりも長いフリーフォームとして定義され、すべてのサブビューを含む)、最後に再び機能しました!
scrollView
が何らかのタイプのcontainerView
のサブビューである場合、scrollView
がcontainerView
のフレームまたは境界内にあることを確認してください。 scrollViewを表示できる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を表示することはできますが、ユーザーの操作は受け付けません。
私の問題は以下によって解決されました:
セーフエリアやスーパービューにバインドされた上部および/または下部の制約を削除すると、scrollView内のビューが再びスクロールする可能性があり、画面の下部の上部に固定されたままになりませんでした!
これにより、この特定の問題で他の人が何時間も苦しむことを止められることを願っています。
他のソリューションがどれもうまくいかない場合は、スクロールビューがInterface Builderで実際にUIScrollView
であることを再確認してください。
インスペクターでクラスが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)削除しますその後、アプリをビルドして実行し、再びスクロール機能を使用できるようになります。
追伸スクロールビューのコンテンツサイズをviewDidLayoutSubviews
に設定したり、自動レイアウトをオフにする必要はありませんでしたが、YMMVです。
viewDidLayoutSubviews
に次のコードを追加すると、Autolayoutで機能しました。すべての答えを試した後:
- (void)viewDidLayoutSubviews
{
self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620);
}
//set the height of content size as required
UIScrollViewDelegate
を追加し、viewDidAppear
メソッドに次のコードを追加して修正しました。
@interface testScrollViewController () <UIScrollViewDelegate>
-(void)viewDidAppear:(BOOL)animated {
self.scrollView.delegate = self;
self.scrollView.scrollEnabled = YES;
self.scrollView.contentSize = CGSizeMake(375, 800);
}
このAutoLayoutの問題により、クラスにViewController
の代わりにUIView
の代わりにUIScrollView
を使用するだけの場合は、UIScrollView
を追加するだけです。 ..それが動作すること。
さらに別の楽しいケース:
scrollview.superview.userInteractionEnabledはtrueでなければなりません
親がUIImageViewであることがわかり、当然、userInteractionEnabled == false
このスレッドで提供された答えで失敗した後、私は この記事 を見つけました。
自動レイアウトを使用してスクロールビューを設定することについて、直感的でない2つのことがあります。
これがその記事の要旨です。イラストを含む完全な説明については、それをチェックしてください。
IBでも同じ問題がありました。
ScrollViewの先頭、末尾、上下をsuperViewに設定した後。 containerViewをスクロール可能にするために以下の変更を行い、機能しました。
ScrollViewを水平方向にのみスクロールするには、scrollViewのcenterY = ContainerViewのcenterYを使用して制約を作成します。
そして、垂直にスクロール可能にするには、scrollViewのcenterX = ContainerViewのcenterXを作成します