在这篇文章中,我们将带领您了解objective-c–如何复制UIRefreshControl的“拉嚼口香糖”外观?的全貌,同时,我们还将为您介绍有关之自我实现篇、iOS10UIRefreshCont
在这篇文章中,我们将带领您了解objective-c – 如何复制UIRefreshControl的“拉嚼口香糖”外观?的全貌,同时,我们还将为您介绍有关
- objective-c – 如何复制UIRefreshControl的“拉嚼口香糖”外观?
之自我实现篇 - iOS 10 UIRefreshControl的简单使用
- ios – RxSwift:使用rx_refreshing进行uirefreshcontrol
- ios – UIAlertController有时会阻止UIRefreshControl隐藏
objective-c – 如何复制UIRefreshControl的“拉嚼口香糖”外观?
背景是我想在Mac上复制这种行为,并且Mountain Lion中没有任何等效的UIRefreshControl.
注意:这是iOS 6 – How can I get the “release to refresh” animation thing? like in mail?的延续
解决方法
我在github上找到了2个项目:
https://github.com/ishkawa/ISRefreshControl
https://github.com/dbsGen/SlimeRefresh
之自我实现篇
上一篇文章完整的介绍了UIRefreshControl的实现方法,但是有时想在已有的程序的tableview中使用UIRefreshControl实现下拉刷新效果但是之前却没有定义相应的UITableViewController对象,经过自己试验发现可以使用以下方法简单的实现。
//初始化一个UIRefreshControl对象,将其加入tableview的子视图中
-(void)createRefreshView
{
UIRefreshControl *refresh = [[UIRefreshControl alloc] init];
refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"下拉刷新"];
refresh.tintColor = [UIColor lightGrayColor];
[refresh addTarget:self action:@selector(refreshView:) forControlEvents:UIControlEventValueChanged];
_refreshView = refresh;
}
-(void)createTableView
{
....
_tableView.delegate=self;
_tableView.dataSource=self;
_tableView.separatorStyle=UITableViewCellSeparatorStyleNone;
[_tableView addSubview:_refreshView]
....
}
iOS 10 UIRefreshControl的简单使用
不多说,直接上代码
//
// ViewController.m
// test
//
// Created by siqiyang on 16/10/28.
// Copyright © 2016年 MXJ. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
{
UIScrollView *ScrollView;
}
@property (nonatomic,strong) UIRefreshControl *refresh;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
CGFloat height = [UIScreen mainScreen].bounds.size.height;
CGFloat width = [UIScreen mainScreen].bounds.size.width;
ScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(10, 10, width -20, height -20)];
ScrollView.backgroundColor = [UIColor lightGrayColor];
ScrollView.scrollEnabled = YES;
[self.view addSubview:ScrollView];
//ios10新特性 自带刷新控件
self.refresh = [[UIRefreshControl alloc]init];
self.refresh.tintColor = [UIColor purpleColor];//控制菊花的颜色
NSAttributedString *string = [[NSAttributedString alloc] initWithString:@"下拉刷新"];
self.refresh.attributedTitle = string;//菊花下面的文字,可利用NSAttributedString设置各种文字属性
[self.refresh addTarget:self action:@selector(start1) forControlEvents:(UIControlEventValueChanged)];//刷新方法
ScrollView.refreshControl = self.refresh;
}
- (void)start1{
NSAttributedString *string = [[NSAttributedString alloc] initWithString:@"正在刷新..."];
self.refresh.attributedTitle = string;//菊花下面的文字,可利用NSAttributedString设置各种文字属性
[self performSelector:@selector(end) withObject:nil afterDelay:3.5];
}
- (void)end{
[ScrollView.refreshControl endRefreshing]; //结束刷新
[self performSelector:@selector(refresh1) withObject:nil afterDelay:1.0];
}
- (void)refresh1{
NSAttributedString *string1 = [[NSAttributedString alloc] initWithString:@"下拉刷新"];
self.refresh.attributedTitle = string1;//菊花下面的文字,可利用NSAttributedString设置各种文字属性
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
ios – RxSwift:使用rx_refreshing进行uirefreshcontrol
然而,它正在起作用,以下对我来说是错误的:
1)我知道RXCocoa扩展中有一个rx_refreshing变量,但我无法让它在这个上下文中工作.
2)我绑定答案(这是一个变量的数组)两次.一旦我加载视图控制器,当UIRefreshControl刷新时再次加载.
3)我检查UIRefreshControl是否令人耳目一新的部分看起来很尴尬.感觉它是否违背了使用反应的目的?
... let answers: Variable<[Answer]> = Variable([]) override func viewDidLoad() { loadAnswers() .shareReplay(1) .bindTo(answers) .adddisposableto(self.disposeBag) setupRx() } func loadAnswers() -> Observable<[Answer]> { return Network.rxArrayRequest(Spark.Answers) } func setupRx() { rc.rx_controlEvent(.ValueChanged) .map { _ in !self.rc.refreshing } .filter { $0 == false } .flatMapLatest { [uNowned self] _ in return self.loadAnswers() } .bindTo(answers) .adddisposableto(self.disposeBag) rc.rx_controlEvent(.ValueChanged) .map { _ in self.rc.refreshing } .filter { $0 == true } .subscribeNext { [uNowned self] _ in self.rc.endRefreshing() } .adddisposableto(self.disposeBag) } ...
解决方法
// `rc.rx_controlEvent(.ValueChanged)` only gets called once,// when the user pulls down. rc.rx_controlEvent(.ValueChanged) // user pulled down to refresh .map { _ in !self.rc.refreshing } // !true -> false .filter { $0 == false } // false == false .flatMapLatest { [uNowned self] _ in return self.loadAnswers() // request answers } .bindTo(answers) .adddisposableto(self.disposeBag) rc.rx_controlEvent(.ValueChanged) // user pulled down to refresh .map { _ in self.rc.refreshing } // true -> true .filter { $0 == true } // true == true .subscribeNext { [uNowned self] _ in self.rc.endRefreshing() // end refreshing } .adddisposableto(self.disposeBag)
为了解决问题1,你是对的,你可以使用rx_refreshing来关闭刷新而不是endRefreshing().
为了解决问题2,我认为变量不是必需的或有用的,至少在这个例子中是这样.你仍然可以使用它.此外,没有必要在两个地方loadAnswers().
为了解决问题3,是的,你可以简化这一点并使用Rx多一点.
这里的代码实际上可以工作,使用rx_refreshing,并简化了很多事情:
let initial = Observable<Void>.just(()) let refresh = rc.rx_controlEvent(.ValueChanged).map { _ in () } let answers = Observable.of(initial,refresh) .merge() .flatMapLatest{ _ in self.loadAnswers() } .shareReplayLatestWhileConnected() answers .map { _ in false } .bindTo(rc.rx_refreshing) .adddisposableto(disposeBag) // also use `answers` to bind to your data source,etc.
ios – UIAlertController有时会阻止UIRefreshControl隐藏
这是我使用的代码,所有UI的东西都很好地在主线程上完成:
if(refreshControl.refreshing) { dispatch_async(dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_DEFAULT,0),^{ [self refreshItems]; dispatch_async(dispatch_get_main_queue(),^{ [refreshControl endRefreshing]; [self.tableView reload]; [self showUpdateInfo]; }); }); }
知道是什么原因引起的吗?
编辑:这是我在代码中创建刷新控件的方法(在viewDidLoad中):
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString: @"Checking for updates…"]; [refreshControl addTarget: self action: @selector(refreshOutdatedItems) forControlEvents: UIControlEventValueChanged]; self.refreshControl = refreshControl;
解决方法
这是我的代码
- (void)refreshOutdatedItems { NSLog(@"refresh"); if (self.refreshControl.refreshing) { dispatch_async(dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_DEFAULT,^{ for (double i = 0 ; i < 100000000; i++){ }; dispatch_async(dispatch_get_main_queue(),^{ [self.refreshControl endRefreshing]; [self performSelector:@selector(showUpdateInfo) withObject:nil afterDelay:0.5]; }); }); } }
如果有帮助,请告诉我.
今天的关于objective-c – 如何复制UIRefreshControl的“拉嚼口香糖”外观?的分享已经结束,谢谢您的关注,如果想了解更多关于
本文标签: