Использовать UIRefreshControl для UIWebView
Я видел UIRefreshControl в iOS 6, и мой вопрос в том, можно ли обновить WebView, потянув его вниз, и пусть он появится, как в почте?
Код, который я использовал rabih, - это WebView:
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[rabih addSubview:rabih];
Ответы
Ответ 1
Вот как вы можете использовать pull down для обновления в UIWebview:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// Make webView a delegate to itself
// I am going to add URL information
NSString *fullURL = @"http://www.umutcankoseali.com/";
NSURL *url = [NSURL URLWithString:fullURL];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
_webView.delegate = (id)self;
[_webView loadRequest:requestObj];
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[_webView.scrollView addSubview:refreshControl]; //<- this is point to use. Add "scrollView" property.
}
-(void)handleRefresh:(UIRefreshControl *)refresh {
// Reload my data
NSString *fullURL = @"http://www.umutcankoseali.com/";
NSURL *url = [NSURL URLWithString:fullURL];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[_webView loadRequest:requestObj];
[refresh endRefreshing];
}
Ответ 2
В Swift используйте это,
Предположим, вы хотите, чтобы в WebView обновлялись,
Итак, попробуйте этот код:
override func viewDidLoad() {
super.viewDidLoad()
addPullToRefreshToWebView()
}
func addPullToRefreshToWebView(){
var refreshController:UIRefreshControl = UIRefreshControl()
refreshController.bounds = CGRectMake(0, 50, refreshController.bounds.size.width, refreshController.bounds.size.height) // Change position of refresh view
refreshController.addTarget(self, action: Selector("refreshWebView:"), forControlEvents: UIControlEvents.ValueChanged)
refreshController.attributedTitle = NSAttributedString(string: "Pull down to refresh...")
YourWebView.scrollView.addSubview(refreshController)
}
func refreshWebView(refresh:UIRefreshControl){
YourWebView.reload()
refresh.endRefreshing()
}
В Objective-C я использовал это:
- (void)addPullToRefreshToWebView{
UIColor *whiteColor = [UIColor whiteColor];
UIRefreshControl *refreshController = [UIRefreshControl new];
NSString *string = @"Pull down to refresh...";
NSDictionary *attributes = @{ NSForegroundColorAttributeName : whiteColor };
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:string attributes:attributes];
refreshController.bounds = CGRectMake(0, 0, refreshController.bounds.size.width, refreshController.bounds.size.height);
refreshController.attributedTitle = attributedString;
[refreshController addTarget:self action:@selector(refreshWebView:) forControlEvents:UIControlEventValueChanged];
[refreshController setTintColor:whiteColor];
[self.webView.scrollView addSubview:refreshController];
}
- (void)refreshWebView:(UIRefreshControl*)refreshController{
[self.webView reload];
[refreshController endRefreshing];
}
Ответ 3
Я только что добавил это очень быстро в свой код:
[webserver.scrollView addSubview:refreshControl]
Итак, кажется, что UIWebView
имеет сам UIScrollView
, к которому вы можете просто подключиться. Надеюсь, это будет полезно для вас.
Ответ 4
Я действительно пробовал это и получил следующее сообщение.
* Завершение приложения из-за неперехваченного исключения "NSInternalInconsistencyException", причина: "UIRefreshControl может управляться только с помощью UITableViewController"
Я мог бы использовать в UIScrollView и UICollectionView, хотя.
Ответ 5
Сейчас я не верю, что это так. Фактически вы не можете использовать его только с любым UITableView. TableView должен быть участником UITableViewController, который будет использоваться должным образом.
Тем не менее, возможно, вам удастся уйти, придерживаясь одного над вашим UIWebView и контролируя его фрейм и значения вручную. Вещи, которые UITableViewController был обновлен, чтобы сделать это самостоятельно с его свойством refreshControl.
Ответ 6
Посмотрите CKRefreshControl, который вы можете настроить под свои нужды.
Ответ 7
Расширение @umut-can-köseali отвечает за лучший контроль над UIRefreshControl при завершении обновления:
- (void)viewDidLoad {
[super viewDidLoad];
_refreshControl = [[UIRefreshControl alloc] init];
[_refreshControl addTarget:self action:@selector(handleWebViewRefresh:) forControlEvents:UIControlEventValueChanged];
[self.webView.scrollView addSubview:_refreshControl]; //<- this is point to use. Add "scrollView" property.
}
- (void)webView:(UIWebView *)_webView didFailLoadWithError:(NSError *)error {
[_refreshControl endRefreshing];
}
- (void)webViewDidFinishLoad:(UIWebView *)_webView {
NSString *navigatorUrl = _webView.request.URL.absoluteString;
if( navigatorUrl && ![navigatorUrl isEqualToString:@""]) {
NSString *host=_webView.request.URL.host;
NSString *path=_webView.request.URL.path;
[_refreshControl endRefreshing];
}
}
Ответ 8
Мой ответ основан на ответе @Zaid Pathan, но обновлен для Swift 4.
class WebViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {
var refreshController:UIRefreshControl!
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
//Your webView initializing
webView.scrollView.bounces = true //DONT FORGET IT!!!
refreshController = UIRefreshControl()
refreshController.bounds = CGRect(x: 0, y: 50, width: refreshController.bounds.size.width, height: refreshController.bounds.size.height)
refreshController.addTarget(self, action: #selector(self.refreshWebView(refresh:)) , for: UIControlEvents.valueChanged)
refreshController.tintColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
webView.scrollView.addSubview(refreshController)
}
@objc func refreshWebView(refresh:UIRefreshControl){
webView.reload()
}
Наконец, не забудьте остановить перезагрузку:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
if refreshController.isRefreshing{
refreshController.endRefreshing()
}
}