xamarin ios pullRefresh 下拉重新整理,下拉載入更多
阿新 • • 發佈:2019-01-28
如果用tableviewcontroller 下拉重新整理會自帶,而且tableview 會自動適應螢幕。這樣做的話這個介面的內容就要完全用cell承載了。
tableview pullRefresh 主要就是需要需要做下拉載入更多,這種需求,本人曾用兩種的辦法解決。題外話(如果不一定要上拉載入更多,可在構造最後一個cell後,多構造一個cell(button -》 載入更多))
1)在getcell 方法中判斷如果 cell 為當前資料的最後一個。那麼就去請求更多的資料。這樣做的話只要構造最後一個cell的時候就會去載入資料,有一點不好控制使用者是否真的想去請求資料。該方法實現簡單,本文不展示程式碼。
2)在scroll中判斷,如果使用者上拉的距離達到一定高度是,則表明使用者需要請求資料。
如下程式碼主要繼承 talbesource ,來實現。其中用到兩個xib ,分別是 上拉重新整理,和下拉載入更多的 樣式xib。
public class PLTableViewSource :UITableViewSource { UITableView tableview; public UIView headerView; public UIView footerView; RectangleF headerviewFrame; //bool isDragging; public bool isRefreshing; public bool isLoadingMore; public bool isCanLoadMore = true; public bool pullRefreshEnable=true; public bool clearSelectionOnViewWillApper; public const float DEFAULT_HEIGHT_OFFSET = 52f; public PLTableViewSource (UITableView p_tb) { this.tableview = p_tb; //set headerview var temp_views= NSBundle.MainBundle.LoadNib ("PLHeaderXib", this, null); this.headerView = MonoTouch.ObjCRuntime.Runtime.GetNSObject(temp_views.ValueAt (0)) as UIView; SetHeaderView (this.headerView); //set footerview temp_views= NSBundle.MainBundle.LoadNib ("PLFooterXib", this, null); this.footerView = MonoTouch.ObjCRuntime.Runtime.GetNSObject(temp_views.ValueAt (0)) as UIView; SetFooterView (this.footerView); //SetFooterViewVisibility (true); } #region Set Header View public void SetHeaderView(UIView hView) { if (tableview==null) { return; } if (null!=headerView&&headerView.IsDescendantOfView(tableview)) { headerView.RemoveFromSuperview (); } headerView.DangerousRelease (); headerView = null; if (hView!=null) { headerView = (UIView)hView.DangerousRetain(); RectangleF f=headerView.Frame; headerviewFrame= headerView.Frame = new RectangleF (f.Location.X, 0 - f.Size.Height, f.Size.Width, f.Size.Height); tableview.AddSubview (headerView); } } public virtual float HeaderRefreshHeight() { if (headerviewFrame!=RectangleF.Empty) { return headerviewFrame.Size.Height; } return DEFAULT_HEIGHT_OFFSET; } protected virtual void PinHeaderView() { UIView.Animate (0.2, () => { this.tableview.ContentInset = new UIEdgeInsets(this.HeaderRefreshHeight(),0,0,0); }); ((PLHeaderXib)this.headerView).SetActivityAndMsg(string.Empty,true); } protected virtual void UnPinHeaderView(){ UIView.Animate (0.2, () => { this.tableview.ContentInset = UIEdgeInsets.Zero; }); ((PLHeaderXib)this.headerView).SetActivityAndMsg(string.Empty,false); } private void WillBeginRefresh() { if (pullRefreshEnable) { PinHeaderView (); } } private void WillShowHeaderView(UIScrollView scrollview) { } private void HeaderViewDidScroll(bool willRefreshonRelease,UIScrollView scrollview) { } public virtual bool ReFresh() { if (isRefreshing) { return false; } this.WillBeginRefresh (); isRefreshing = true; return true; } public virtual void RefreshCompleted() { isRefreshing = false; if (pullRefreshEnable) { this.UnPinHeaderView (); } } #endregion #region Set Footer View private void SetFooterView(UIView fview) { if (null==tableview) { return; } tableview.TableFooterView = null; footerView.DangerousRelease (); footerView = null; if (null!=fview) { footerView = (UIView)fview.DangerousRetain(); tableview.TableFooterView = footerView; } } private void WillBeginLoadingMore(){} public virtual void LoadMoreCompleted() { isLoadingMore = false; SetFooterViewVisibility(false); } public virtual bool LoadMore() { if (isLoadingMore) return false; this.WillBeginLoadingMore(); isLoadingMore = true; SetFooterViewVisibility(true); return true; } public float FooterLoadMoreHeight() { if (null!=footerView) { return footerView.Frame.Size.Height; } return DEFAULT_HEIGHT_OFFSET; } public void SetFooterViewVisibility(bool visible) { if (visible&&this.tableview.TableFooterView!=footerView) { this.tableview.TableFooterView = footerView; }else if (!visible) { this.tableview.TableFooterView = null; } } #endregion #region all load completed public void AllLoadingCompleted() { if (isRefreshing) { this.RefreshCompleted (); } if (isLoadingMore) { this.LoadMoreCompleted (); } } #endregion #region tableview Source public override int RowsInSection (UITableView tableview, int section){return 0;} public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath){return null;} #endregion #region scrollview delegate public override void WillEndDragging (UIScrollView scrollView, PointF velocity, ref PointF targetContentOffset) { if (isRefreshing||isLoadingMore) { return; } if (scrollView.ContentOffset.Y<=0-HeaderRefreshHeight()) { if (pullRefreshEnable) { ReFresh (); } }else if (scrollView.ContentSize.Height - scrollView.Frame.Size.Height - scrollView.ContentOffset.Y<FooterLoadMoreHeight()) { if (isCanLoadMore) { LoadMore (); } } } #endregion