UIRepreshControl을 UIScrol View에서 사용할 수 있습니까?
5개 정도 있습니다.UIScrollView
가 이미 내 앱에 있고, 모두 여러 개를 로드합니다..xib
파일. 우리는 이제 A를 사용하기를 원합니다.UIRefreshControl
. UITableViewController와 함께 사용할 수 있도록 설계되었습니다(UIRefreshControl 클래스 참조에 따라).나는 모든 5개의 방법을 다시 하고 싶지 않습니다.UIScrollView
work. 나는 이미 사용을 시도했습니다.UIRefreshControl
내 안에UIScrollView
그리고 몇 가지를 제외하고는 예상대로 작동합니다.
새로 고침 이미지가 로더로 변경된 직후에
UIScrollView
약 10 픽셀 아래로 점프하는데, 이것은 내가 매우 조심스럽게 드래그할 때에만 발생하지 않습니다.UIScrollview
아주 천천히 내려갑니다.스크롤을 내려 다시 로드를 시작할 때는
UIScrollView
,그UIScrollView
내가 놔둔 곳에 머물러 있을 겁니다다시 로드가 완료되면UIScrollView
애니메이션 없이 정상으로 뛰어오릅니다.
여기 내 코드가 있습니다.
-(void)viewDidLoad
{
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[myScrollView addSubview:refreshControl];
}
-(void)handleRefresh:(UIRefreshControl *)refresh {
// Reload my data
[refresh endRefreshing];
}
시간을 많이 절약해서 사용할 수 있는 방법이 없을까요?UIRefreshControl
일순간에UIScrollView
?
감사합니다!!!
나는.UIRefreshControl
일을 하다UIScrollView
:
- (void)viewDidLoad
{
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
scrollView.userInteractionEnabled = TRUE;
scrollView.scrollEnabled = TRUE;
scrollView.backgroundColor = [UIColor whiteColor];
scrollView.contentSize = CGSizeMake(500, 1000);
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(testRefresh:) forControlEvents:UIControlEventValueChanged];
[scrollView addSubview:refreshControl];
[self.view addSubview:scrollView];
}
- (void)testRefresh:(UIRefreshControl *)refreshControl
{
refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Refreshing data..."];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[NSThread sleepForTimeInterval:3];//for 3 seconds, prevent scrollview from bouncing back down (which would cover up the refresh view immediately and stop the user from even seeing the refresh text / animation)
dispatch_async(dispatch_get_main_queue(), ^{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMM d, h:mm a"];
NSString *lastUpdate = [NSString stringWithFormat:@"Last updated on %@", [formatter stringFromDate:[NSDate date]]];
refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:lastUpdate];
[refreshControl endRefreshing];
NSLog(@"refresh end");
});
});
}
별도의 스레드에서 데이터 업데이트를 해야 합니다. 그렇지 않으면 메인 스레드(UI를 업데이트할 때 사용하는)가 잠깁니다.따라서 메인 스레드가 데이터를 업데이트하느라 바쁘지만 UI 또한 잠기거나 정지되어 매끄러운 애니메이션이나 스피너를 볼 수 없습니다.
편집: 네, OP와 동일한 작업을 수행하고 있으며 이제 텍스트에 텍스트를 추가했습니다(즉, "새로 고침으로 끌어오기"). 텍스트를 업데이트하려면 메인 스레드로 돌아가야 합니다.
업데이트된 답변.
위의 답변에 추가하여 일부 상황에서는 내용 크기를 설정할 수 없거나(아마도 자동 레이아웃을 사용하여?) 내용 크기의 높이가 UIScrollView의 높이보다 작거나 같습니다.이 경우 UIScrollView가 바운스되지 않으므로 UIRefreshControl이 작동하지 않습니다.
이를 수정하려면 속성을 항상 BounceVertical을 TRUE로 설정합니다.
iOS 10 UIScrollView에는 이미 refreshControl 속성이 있습니다.이 refreshControl은 UIRefreshControl을 생성하고 이 속성에 할당할 때 나타납니다.
UIReferreshControl을 더 이상 하위 보기로 추가할 필요가 없습니다.
func configureRefreshControl () {
// Add the refresh control to your UIScrollView object.
myScrollingView.refreshControl = UIRefreshControl()
myScrollingView.refreshControl?.addTarget(self, action:
#selector(handleRefreshControl),
for: .valueChanged)
}
@objc func handleRefreshControl() {
// Update your content…
// Dismiss the refresh control.
DispatchQueue.main.async {
self.myScrollingView.refreshControl?.endRefreshing()
}
}
UIRefreshControl 개체는 UIScrollView 개체에 연결하는 표준 컨트롤입니다.
https://developer.apple.com/documentation/uikit/uirefreshcontrol 의 코드 및 견적
iOS 10+를 지원할 수 있을 정도로 운이 좋다면 이제 간단하게 설정할 수 있습니다.refreshControl
UIScrollView
의 합니다와 한 방식으로 동작합니다.refreshControl
위에UITableView
.
C# / 모노터치에서 이 작업을 수행하는 방법은 다음과 같습니다.C#에 대한 샘플을 어디에서도 찾을 수가 없어서 여기 있습니다.로그139 감사합니다!
public override void ViewDidLoad ()
{
//Create a scrollview object
UIScrollView MainScrollView = new UIScrollView(new RectangleF (0, 0, 500, 600));
//set the content size bigger so that it will bounce
MainScrollView.ContentSize = new SizeF(500,650);
// initialise and set the refresh class variable
refresh = new UIRefreshControl();
refresh.AddTarget(RefreshEventHandler,UIControlEvent.ValueChanged);
MainScrollView.AddSubview (refresh);
}
private void RefreshEventHandler (object obj, EventArgs args)
{
System.Threading.ThreadPool.QueueUserWorkItem ((callback) => {
InvokeOnMainThread (delegate() {
System.Threading.Thread.Sleep (3000);
refresh.EndRefreshing ();
});
});
}
swift2를 사용하는 경우 swift 버전은 다음과 같습니다.
import UIKit
class NoJumpRefreshScrollView: UIScrollView {
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
// Drawing code
}
*/
override var contentInset:UIEdgeInsets {
willSet {
if self.tracking {
let diff = newValue.top - self.contentInset.top;
var translation = self.panGestureRecognizer.translationInView(self)
translation.y -= diff * 3.0 / 2.0
self.panGestureRecognizer.setTranslation(translation, inView: self)
}
}
}
}
스위프트 3에서 하는 방법:
override func viewDidLoad() {
super.viewDidLoad()
let scroll = UIScrollView()
scroll.isScrollEnabled = true
view.addSubview(scroll)
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(pullToRefresh(_:)), for: .valueChanged)
scroll.addSubview(refreshControl)
}
func pullToRefresh(_ refreshControl: UIRefreshControl) {
// Update your conntent here
refreshControl.endRefreshing()
}
제가 만든UIRefreshControl
안에서 UIScrollView
. 나는 상속을 받았습니다UIScrollView
, Inset 및 함:
class ScrollViewForRefreshControl : UIScrollView {
override var contentOffset : CGPoint {
get {return super.contentOffset }
set {
if newValue.y < -_contentInset.top || _contentInset.top == 0 {
super.contentOffset = newValue
}
}
}
private var _contentInset = UIEdgeInsetsZero
override var contentInset : UIEdgeInsets {
get { return _contentInset}
set {
_contentInset = newValue
if newValue.top == 0 && contentOffset.y < 0 {
self.setContentOffset(CGPointZero, animated: true)
}
}
}
}
점프 문제의 경우 내용을 재정의합니다.인셋은 iOS 9 이전에만 해결합니다. 점프 문제를 피하는 방법을 시도했을 뿐입니다.
let scrollView = UIScrollView()
let refresh = UIRefreshControl()
// scrollView.refreshControl = UIRefreshControl() this will cause the jump issue
refresh.addTarget(self, action: #selector(handleRefreshControl), for: .valueChanged)
scrollView.alwaysBounceVertical = true
//just add refreshControl and send it to back will avoid jump issue
scrollView.addSubview(refresh)
scrollView.sendSubviewToBack(refresh)
iOS 91011 등에서 작동하며, 저는 그들(Apple)이 그 문제를 그냥 해결하기를 바랍니다.
iOS 10부터 UIScrollView에는 UIRefreshControl로 설정할 수 있는 refreshControl 속성이 있습니다.항상 그렇듯이 컨트롤의 프레임을 관리할 필요가 없습니다.컨트롤을 구성하고 valueChanged event에 대한 target-action을 설정한 후 속성에 할당하면 됩니다.
일반 스크롤 보기를 사용하는지 여부에 관계없이 테이블 보기 또는 모음 보기에서 새로 고침 컨트롤을 만드는 단계는 동일합니다.
if #available(iOS 10.0, *) {
let refreshControl = UIRefreshControl()
refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
refreshControl.addTarget(self,
action: #selector(refreshOptions(sender:)),
for: .valueChanged)
scrollView.refreshControl = refreshControl
}
@objc private func refreshOptions(sender: UIRefreshControl) {
// Perform actions to refresh the content
// ...
// and then dismiss the control
sender.endRefreshing()
}
간단히 새로 고침 컨트롤의 인스턴스를 만들고 스크롤 보기 상단에 추가할 수 있습니다.그런 다음, 딜러 메소드에서 요구 사항에 맞게 동작을 조정합니다.
언급URL : https://stackoverflow.com/questions/14905382/can-i-use-a-uirefreshcontrol-in-a-uiscrollview
'programing' 카테고리의 다른 글
PowerShell로 텍스트 파일 맨 위 줄 제거 (0) | 2023.10.19 |
---|---|
입력 요소에는 자동 완성 속성이 있어야 합니다. (0) | 2023.10.14 |
Mysql, 긴/큰 데이터에서 넓은 데이터로 재구성 (0) | 2023.10.14 |
JS 파일 내 PHP 상수 (0) | 2023.10.14 |
Swift ios는 ios9 및 ios10에서 원격 푸시 알림이 활성화되어 있는지 확인합니다. (0) | 2023.10.14 |