GVKun编程网logo

objective-c – 如何复制UIRefreshControl的“拉嚼口香糖”外观?

4

在这篇文章中,我们将带领您了解objective-c–如何复制UIRefreshControl的“拉嚼口香糖”外观?的全貌,同时,我们还将为您介绍有关之自我实现篇、iOS10UIRefreshCont

在这篇文章中,我们将带领您了解objective-c – 如何复制UIRefreshControl的“拉嚼口香糖”外观?的全貌,同时,我们还将为您介绍有关之自我实现篇、iOS 10 UIRefreshControl的简单使用、ios – RxSwift:使用rx_refreshing进行uirefreshcontrol、ios – UIAlertController有时会阻止UIRefreshControl隐藏的知识,以帮助您更好地理解这个主题。

本文目录一览:

objective-c – 如何复制UIRefreshControl的“拉嚼口香糖”外观?

objective-c – 如何复制UIRefreshControl的“拉嚼口香糖”外观?

在iOS 6的Mail应用程序中,有一个“释放刷新”动画,看起来像一个口香糖或橡胶被拉出然后被释放.有人知道如何使用Core Graphics复制这个控件的绘图?

背景是我想在Mac上复制这种行为,并且Mountain Lion中没有任何等效的UIRefreshControl.

注意:这是iOS 6 – How can I get the “release to refresh” animation thing? like in mail?的延续

解决方法

我目前还没有为Mountain Lion找到任何UIRefreshControl(或等效的)实现.但是,iOS 4和iOS 5都有等效控件的实现(因为这些系统没有UIRefreshControl).因此,您可以尝试将这些代码的端口添加到OSX.

我在github上找到了2个项目:

https://github.com/ishkawa/ISRefreshControl

https://github.com/dbsGen/SlimeRefresh

<UIRefreshControl>之自我实现篇

之自我实现篇

上一篇文章完整的介绍了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的简单使用

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

ios – RxSwift:使用rx_refreshing进行uirefreshcontrol

我正在使用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.endRefreshing()之前,您实际上并没有等待网络请求完成.相反,您只是进行网络调用,然后立即调用endRefreshing().
// `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隐藏

ios – UIAlertController有时会阻止UIRefreshControl隐藏

我在我的tableview上使用UIRefreshControl来更新项目.最后,我展示了一个UIAlertController,告知用户更新已完成,以及更新了多少项.非常简单,它适用于一件事.如果我连续多次刷新,有时即使解除警报后刷新控制也不会被解除.我需要向上滑动桌子才能让它消失.

这是我使用的代码,所有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;

解决方法

我相信它真的与tableView在UIAlertController呈现之前没有滚动回来有关.我试图设置showUpdateInfo方法的延迟,这似乎有效.我猜当用户只拉一次它需要半秒钟来显示UIAlertController检查是否有帮助.
这是我的代码
- (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的“拉嚼口香糖”外观?的分享已经结束,谢谢您的关注,如果想了解更多关于之自我实现篇、iOS 10 UIRefreshControl的简单使用、ios – RxSwift:使用rx_refreshing进行uirefreshcontrol、ios – UIAlertController有时会阻止UIRefreshControl隐藏的相关知识,请在本站进行查询。

本文标签: