65

UITableView画面の同じ位置に留まり、でスクロールしないボタンを配置したいUITableView。ボタンを試してみるとaddSubview、表示されますが、でスクロールしUITableViewます。

ボタンを重ねる理由UITableViewは、ユーザーがボタンに対して何らかのアクションを実行できるようにするためです。セルにボタンがあることについて話しているのではありません。それらは、位置を移動することのないフローティングボタンです。

私はを使用しUITableViewControllerていますが、この目的でヘッダーまたはフッターを使用したくありません。また、別のバー(UIToolbarたとえば)は私にとってオプションではありません。

前もって感謝します。

4

10 に答える 10

88

あなたもそれを行うことができます(あなたのテーブルやVCをネストするUITableViewController通常の必要はありません)UIViewController

SafeAreasを使用して更新されたiOS11+

自動レイアウトを使用して、ビューを下に維持したい

{
    [self.view addSubview:self.bottomView];
    [self.bottomView setTranslatesAutoresizingMaskIntoConstraints:NO];
    UILayoutGuide * safe = self.view.safeAreaLayoutGuide;
    [NSLayoutConstraint activateConstraints:@[[safe.trailingAnchor constraintEqualToAnchor:self.bottomView.trailingAnchor],
                                              [safe.bottomAnchor constraintEqualToAnchor:self.bottomView.bottomAnchor],
                                              [safe.leadingAnchor constraintEqualToAnchor:self.bottomView.leadingAnchor]]];
    [self.view layoutIfNeeded];
}

ビューが常に上にあることを確認します

- (void)viewDidLayoutSubviews {

    [super viewDidLayoutSubviews];

    [self.view bringSubviewToFront:self.bottomView];

}

以前の古いソリューション

テーブルをスクロールして、「フローティング」ビューの位置を調整する必要があります。これで問題ありません。

UITableViewControllerを使用している場合は、

UITableViewの上部にビューをフロートさせたい場合

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGRect frame = self.floatingView.frame;
    frame.origin.y = scrollView.contentOffset.y;
    self.floatingView.frame = frame;

    [self.view bringSubviewToFront:self.floatingView];
}

UITableViewの下部にビューをフロートさせたい場合

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGRect frame = self.floatingView.frame;
    frame.origin.y = scrollView.contentOffset.y + self.tableView.frame.size.height - self.floatingView.frame.size.height;
    self.floatingView.frame = frame;

    [self.view bringSubviewToFront:self.floatingView];
}

それがあなたの質問に対する本当の答えだと思います

于 2013-04-29T14:45:37.480 に答える
87

ナビゲーションコントローラーを使用している場合は、ビューを追加できます。

[self.navigationController.view addSubview:yourView];

例:

UIButton *goToTopButton = [UIButton buttonWithType:UIButtonTypeCustom];
goToTopButton.frame = CGRectMake(130, 70, 60, 20);
[goToTopButton setTitle:@"Scroll to top" forState:UIControlStateNormal];
[goToTopButton addTarget:self action:@selector(goToTop) forControlEvents:UIControlEventTouchUpInside];
[goToTopButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[goToTopButton.layer setBorderColor:[[UIColor whiteColor] CGColor]];
goToTopButton.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:13];
[self.navigationController.view goToTopButton];
于 2013-11-23T01:39:31.007 に答える
44

テーブルビューをカバーする静的コントロールビューを表示する場合は、次の3つのオプションがあります。

1)UITableViewControllerを使用しないでください。代わりに、UITableViewサブビューを使用してUIViewControllerを作成し、テーブルビューデリゲート/データソースコードをUIViewControllerに配置します。このオプションは、アプリのアーキテクチャに応じて機能する場合と機能しない場合があります。たとえば、多くのカスタムロジックを使用してUITableViewControllerのサブクラスを実装しようとしている場合、これは理想的ではありません。

2)WWDC2011メソッド。32:20から始まるWWDC2011セッション125「UITableViewの変更、ヒント、およびコツ」を参照してください。AutoLayoutがiOSに導入される前、および処理する画面サイズが非常に多くなる前に、Appleは、テーブルビューがスクロールするたびにビューの配置を調整するこの方法を推奨していました。さまざまな画面サイズすべての位置を自分で管理するため、お勧めしません。

3)UITableViewControllerを含むコンテナビューでUIViewControllerを使用することをお勧めします。 このようにして、UITableViewControllerでテーブルビューロジックを分離しておくことができます。UIViewControllerは、UITableViewControllerの「ダム」コンテナをホストし、静的コントロールビューも保持します。これを行うには、UIViewControllerをストーリーボードにドラッグし、その中に「コンテナビュー」をドラッグします。コンテナビューに自動的にアタッチされるUIViewControllerを削除し、コンテナビューからテーブルビューコントローラにドラッグして[埋め込み]を選択することにより、コンテナビューに表示されるテーブルビューコントローラをアタッチします。これで、テーブルビューの上に表示されるUIViewControllerにサブビューとして静的コントロールを追加できます。次のようになります。

コンテナビュー内のUITableViewControllerのストーリーボード

UIViewControllerは制御ロジックを処理でき、UITableViewControllerはテーブルビューロジックを処理できるため、この方法が好きです。ここでの他のいくつかの回答は、静的コントロールをサブビューとしてナビゲーションコントローラーまたはウィンドウに追加することを推奨しています。これらは、ナビゲーションコントローラーまたはウィンドウに別のビューコントローラーを追加しない場合にのみ機能します。

于 2015-02-25T19:01:46.537 に答える
27

UIViewControllerこれに対する1つの解決策は、の代わりに拡張することですUITableViewController。独自のテーブルビューを追加して、すべてを設定する必要があります。次に、テーブルビューの代わりに、ビューコントローラのビューにボタンを追加できます。

于 2013-02-04T16:05:35.807 に答える
11

迅速な場合:

override func scrollViewDidScroll(scrollView: UIScrollView){
    var frame: CGRect = self.floatingView.frame
    frame.origin.y = scrollView.contentOffset.y
    floatingView.frame = frame

    view.bringSubviewToFront(floatingView)
}

この関数は、スクロールするたびに呼び出されます。次に、内部でUIViewのフレームを取得し、スクロールした量に応じてその位置を更新します。UIViewはUIScrollViewとともに常に移動しているため、ユーザーにはフローティングのように見えます。

于 2014-11-04T16:52:41.593 に答える
9

UIWindowにボタンを追加できます。UITableviewControllerの代わりにUIViewControllerに拡張する必要はありません。ウィンドウにボタンを追加するだけです。

UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIButton *btn =[UIButton buttonWithType:UIButtonTypeCustom];
[btn setFrame:CGRectMake(60, 200,40, 60)];
[btn addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
[window addSubview:btn];
于 2013-11-30T11:08:04.027 に答える
8

UITableView / UICollectionView / UIScrollViewの上にフローティングボタンを簡単に追加できるようにするために、ライブラリを作成しました。MEVFloatingButtonと呼ばれます。

これらはそれを使用するためのステップです。

1-カテゴリファイルをインポートする

#import "UIScrollView+FloatingButton.h"

2-デリゲートとオプションのデリゲートメソッドを追加します。

  @interface ViewController () <MEVFloatingButtonDelegate>

  #pragma mark - MEScrollToTopDelegate Methods

  - (void)floatingButton:(UIScrollView *)scrollView didTapButton:(UIButton *)button;

2-MEVFloatingButtonオブジェクトを作成します。

MEVFloatingButton *button = [[MEVFloatingButton alloc] init];
button.animationType = MEVFloatingButtonAnimationFromBottom;
button.displayMode = MEVFloatingButtonDisplayModeWhenScrolling;
button.position = MEVFloatingButtonPositionBottomCenter;
button.image = [UIImage imageNamed:@"Icon0"];
button.imageColor = [UIColor groupTableViewBackgroundColor];
button.backgroundColor = [UIColor darkGrayColor];
button.outlineColor = [UIColor darkGrayColor];
button.outlineWidth = 0.0f;
button.imagePadding = 20.0f;
button.horizontalOffset = 20.0f;
button.verticalOffset = -30.0f;
button.rounded = YES;
button.hideWhenScrollToTop = YES;

4-ボタンを割り当て、UITableViewに委任します。

[self.tableView setFloatingButtonView:button];
[self.tableView setFloatingButtonDelegate:self]

デモ結果

デモデモデモ

于 2016-02-25T08:56:48.233 に答える
2

これにはより良い解決策があります。Buttonこれを行うには、対応する、またはUIView フローティングボタンの任意のAuto Layout(button.translatesAutoresizingMaskIntoConstraints = false)プロパティを無効にします。

スウィフト4

//create a button or any UIView and add to subview
let button=UIButton.init(type: .system)
button.setTitle("NEXT", for: .normal)
button.frame.size = CGSize(width: 100, height: 50)
self.view.addSubview(button)

//set constrains
button.translatesAutoresizingMaskIntoConstraints = false
if #available(iOS 11.0, *) {
     button.rightAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.rightAnchor, constant: -10).isActive = true
     button.bottomAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.bottomAnchor, constant: -10).isActive = true
} else {
     button.rightAnchor.constraint(equalTo: tableView.layoutMarginsGuide.rightAnchor, constant: 0).isActive = true
     button.bottomAnchor.constraint(equalTo: tableView.layoutMarginsGuide.bottomAnchor, constant: -10).isActive = true
}
于 2017-12-23T16:04:01.253 に答える
1

WWDC 2011のTableView、ヒント、コツのビデオを見たところです。フローティングビューはまったく同じです。あなたがしなければならないのは、scrollViewDidScrollの元の位置にフレームを戻すことだけです。

https://developer.apple.com/videos/wwdc/2011/

TableViewsのヒントとコツを動画で確認してください。

于 2013-12-16T16:12:31.607 に答える
0

クラスをサブクラスにしたいのですが、UITableViewControllerサブビューは自動レイアウトを使用した通常のサブビューである必要があります(必要な場合)。
だから、これが私がしたことです:

    private weak var _tableView:UITableView?
    override var tableView: UITableView!{
        get {
            return self._tableView
        }
        set {
            self._tableView = newValue
        }
    }

    override func viewDidLoad() {
        // Re-root
        let tableView = super.tableView! // keep a reference to the original tableview
        self.tableView = tableView
        view = UIView() // Create my own view
        tableView.translatesAutoresizingMaskIntoConstraints = true
        view.addSubview(tableView)
        tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    }

viewこれで、元のテーブルビューである間tableView、ViewControllerのに必要なものを追加できます。
質問がObjectiveCにあったことは知っていますが、コードはかなり単純で、自分のコードからコピーして貼り付けただけです。

于 2020-12-04T16:36:26.233 に答える