iphone - register - uitableview デザイン




テーブルビューにビューを追加する(UITableViewController) (4)

スウィフト/ストーリーボードソリューション

注:以下のコードは、UITableView上に表示されるカスタムビュー(私の場合はratingView)を持っていることを前提としています。

私はこれに関する多くの答えと、SOに関する同様の質問を読みました。 これらの情報源からの他の答えは私にとって様々な度合いで働いた(例えばビューはロードされたが表示されなかったりアクセスできない、など)。 私はSwift 2.0以降を使用しており、 UITableViewControllerを使用してこれを実行するための完全なソリューションを共有しています

ナビゲーションバーとビューへのアウトレットを作成します。これをテーブルビューに引き継ぎます。

//MARK:Outlets
@IBOutlet weak var navBar:UINavigationBar!
@IBOutlet var ratingView: MNGStarRating!

私の場合は、テーブルビュー上でビューをアニメートしたいので、変曲点とシーンの上の点(画面外)への参照を保持するためにクラス変数を使用しました。

var centerYInflection:NSLayoutConstraint!
var aPointAboveScene = -(max(UIScreen.mainScreen().bounds.width,UIScreen.mainScreen().bounds.height) * 2.0)

それからviewDidLoadで、テーブルビュー上でアニメートされる新しいビューのための制約を設定し追加する関数(configureRatingViewAutoLayout)を呼び出しました。

func configureRatingViewAutoLayout() {
    //REQUIRED    
    self.navBar.superview?.addSubview(self.ratingView)

    var newConstraints:[NSLayoutConstraint] = []
    newConstraints.append(self.ratingView.leadingAnchor.constraintEqualToAnchor(self.view.leadingAnchor,constant: 10)) 
    newConstraints.append(self.ratingView.trailingAnchor.constraintEqualToAnchor(self.view.trailingAnchor,constant: 10))
    newConstraints.append(self.ratingView.centerXAnchor.constraintEqualToAnchor(self.view.centerXAnchor))

    //hides the rating view above the scene
    self.centerYInflection = self.ratingView.centerYAnchor.constraintEqualToAnchor(self.view.centerYAnchor, constant: self.aPointAboveScene)

    //the priority must be set below 1000 if you intend to change it after it has been added to a view
    self.centerYInflection.priority = 750
    newConstraints.append(self.centerYInflection)

    //constraints must be added to the container view of the two items
    self.ratingView.superview?.addConstraints(newConstraints)

}

Nota Bene - UITableViewController上にあります。 self.viewはself.tableViewです。 それらは同じことを指し示しているので、上のself.tableView参照も使用できると思います。

しばらくして... UIControlイベントに応答して、このメソッドを呼び出します。

@IBAction func toggleRatingView (sender:AnyObject?){

    //REQUIRED
    self.ratingView.superview?.layoutIfNeeded()

    UIView.animateWithDuration(1.0, delay: 0.0, usingSpringWithDamping: 0.37, initialSpringVelocity: 0.99, options: [.CurveEaseOut], animations: { () -> Void in

        if CGRectContainsRect(self.view.frame, self.ratingView.frame) {

            //in frame ~ animate away
            //I play a sound to alert the user something is happening 

            self.centerYInflection.constant = self.aPointAboveScene
            self.centerYInflection.priority = UILayoutPriority(950)
            //I disable portions of the UI
            self.disableUIElements(nil)



        } else {

            //out of frame ~ animate in
            //I play a different sound here                

            self.centerYInflection.constant = 0
            self.centerYInflection.priority = UILayoutPriority(950)

            //I enable the UI fully
            self.enableUIElements(nil)


        }
        //REQUIRED
        self.ratingView.superview?.setNeedsLayout()
        self.ratingView.superview?.layoutIfNeeded()


        }) { (success) -> Void in

            //do something else

    }

}

これらのヘルパーメソッドは、ビューの表示中にシーン内の要素へのアクセスを制御するように設定できます。

func disableUIElements(sender:AnyObject?) {
    //UI

}
func enableUIElements(sender:AnyObject?) {

    //UI

}

注意事項

私のビューはストーリーボード内のカスタムビューです(テーブルビューの外側にありながらTableViewコントローラに接続されています)。 ビューには、Number値が2に設定された必須のランタイム属性が定義されたlayer.zPositionがあります(これにより、UITableViewの前に表示されるようになります)。

zPositionを設定したくない場合は、bringSubviewToFront:およびsendSubviewToBack:メソッドを使って試してみることもできます(zPositionの方が使いやすいと思います)。

状況: UITableViewControllerがサービスからデータを非同期にロードしています。 この間、テーブルビューの上にナビゲーションバーを除く全画面ビューを配置して、カスタムインジケータとテキストを表示します。

問題:私が直面している問題は、私のカスタムビュー(背景が赤)がUITableViewの上に置かれると、テーブルビューの行が私のカスタムビューを通して表示されることです(下の画像を参照)。

私が試したこと: insertBelow以上を使おうとしましたが、うまくいきませんでした。 私もやろうとしました:tableview.Hidden = true、しかしこれはまた、画像2で見られるように何らかの理由でカスタムビューを隠します。

画像1:どういうわけか、線が私の見解を投げかけるのを見ることができます。

Image 2:Tableview +カスタムビューがhidden = trueのときに消えています

私のコード:

        public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        UIView view = new UIView (new RectangleF (0, 0, this.TableView.Frame.Width, this.TableView.Frame.Height));
        view.BackgroundColor = UIColor.Red;

        this.TableView.AddSubview (view);

        TableView.Source = new SessionTableViewSource ();
    }

UITableViewController下部にボタンをフックするためにこれを試してください

ボタンを変数として宣言します。

var submitButton: UIButton!

そしてviewDidLoad

submitButton = UIButton(frame: CGRect(x: 5, y: UIScreen.main.bounds.size.height - 50, width: UIScreen.main.bounds.size.width - 10, height: 50))        
submitButton.backgroundColor = UIColor.init(red: 180/255, green: 40/255, blue: 56/255, alpha: 1.0)
submitButton.setTitle("Submit", for: .normal)
submitButton.titleLabel?.font = UIFont(name: "Arial", size: 15)
submitButton.titleLabel?.textColor = .white
submitButton.addTarget(self, action: #selector(submit), for: .touchUpInside)
submitButton.layer.cornerRadius = 5        
self.view.addSubview(submitButton)

そしてこのメ​​ソッドを実装します。

override func scrollViewDidScroll(_ scrollView: UIScrollView) {
  submitButton.frame = CGRect.init(x: submitButton.frame.origin.x, y: UIScreen.main.bounds.size.height + scrollView.contentOffset.y - 50, width: submitButton.frame.width, height: submitButton.frame.height)
}

サブビューを追加するためのビューとしてself.navigationController.viewを使用できます。


問題は、 UITableViewControllerのViewがUITableViewであるため、テーブルの上にあるコントローラにサブビューを追加できないことです。

UITableViewControllerからUITableViewControllerを含む単純なUIViewController切り替えることをお勧めしUITableView 。 このように、コントローラのメインビューはテーブルを含むプレーンなUIViewです。メインのUIViewサブビューを追加すると、それらはテーブルビューの上に配置されます。





xamarin