programing

iOS 7 UIRefreshControl tintColor가 beginRefresh에 대해 작동하지 않음

topblog 2023. 8. 6. 09:05
반응형

iOS 7 UIRefreshControl tintColor가 beginRefresh에 대해 작동하지 않음

UIRfreshControl(iOS 7 기반)에 tintColor를 설정하려고 합니다. 다음 를 하도록 설정했습니다.viewDidLoad방법 i는 다음을 수행했습니다.

[self.refreshControl setTintColor:[UIColor redColor]];

이제 새로 고침을 하려고 하면 새로 고침 컨트롤의 색상이 빨간색이 됩니다.

redSpiny

내 보기가 나타날 때 자동으로 업데이트되기를 원하기 때문에 다음 작업을 수행했습니다.

- (void)viewDidAppear:(BOOL)animated{
    [self.refreshControl beginRefreshing];
}

https://stackoverflow.com/a/16250679/1809736, 에 따르면 그것은 회전하는 바퀴를 보여주지 않았습니다.

[self.tableView setContentOffset:CGPointMake(0, -self.refreshControl.frame.size.height) animated:NO];

억지로 보여주기 위해서.표시되지만 이제 기본 색상으로 돌아갑니다.

enter image description here

나중에 수동으로 당겨서 새로 고치려고 하면 빨간색입니다.

iOS6에서 구축해봤는데 제대로 작동하는데, iOS7 버그인가요?

추신: 시뮬레이터의 문제가 아닙니다. 저는 그것을 장치로 만들어 보았습니다. 같은 버그입니다.

추신: 제가 예시 프로젝트를 만들었는데, 같은 버그가 있는지, 제 코드에 문제가 있는지 알 수 있을까요?링크는 다음과 같습니다. http://d.pr/f/pGrV

정말 고마워.

방금 이 문제에 발을 들여놓았습니다.

흥미롭게도 먼저 내용 오프셋을 설정한 다음 beginRefresh를 호출하여 코드를 수정했습니다.

if(self.tableView.contentOffset.y == 0){
    self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height);
    [self.refreshControl beginRefreshing];
}

이 프로세스를 애니메이션화할 수 있습니다.

[UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^(void){
    self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height);
} completion:^(BOOL finished) {
    [self.refreshControl beginRefreshing];
}];

이것이 도움이 되길 바랍니다.

W

Solution! Solution에 합니다! 다음 코드를 삽입합니다.viewDidLoad:

self.refreshControl.tintColor = UIColor.orangeColor()
self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height)
self.refreshControl.beginRefreshing()

스위프트 3.1

self.refreshControl.tintColor = UIColor.orange
self.tableView.contentOffset = CGPoint(x:0, y:-self.refreshControl.frame.size.height)
self.refreshControl.beginRefreshing()

@https://field포탈의 대답은 저를 올바른 방향으로 이끌었지만, 이상한 자동 레이아웃 애니메이션 문제를 일으켰습니다.

여기 제게 도움이 된 버전이 있습니다.

- (void)programaticallyRefresh {
    // Hack necessary to keep UIRefreshControl's tintColor
    [self.scrollView setContentOffset:CGPointMake(0, -1.0f) animated:NO];
    [self.scrollView setContentOffset:CGPointMake(0, -self.refreshControl.frame.size.height) animated:YES];
    [self.refreshControl beginRefreshing];
    [self refresh];
}

-refresh는 에연된 에 입니다.UIRefreshControl.

UIResfreshControl에 대한 확장을 추가합니다.

extension UIRefreshControl {
    func beginRefreshingManually() {
        self.tintColor = UIColor.white
        if let scrollView = superview as? UIScrollView {
            scrollView.setContentOffset(CGPoint(x: 0, y:scrollView.contentOffset.y - frame.height), animated: false)
        }
        beginRefreshing()
    }
}

iOS8에서 이러한 답변 중 어느 것도 제대로 작동하지 않습니다. 가장 가까운 답변은 @jpsim의 답변이지만 페이드인 애니메이션 중에 보기 흉한 검은색 새로 고침 컨트롤이 남아 있습니다(애니메이션이 진행되는 동안 검은색과 검은색 사이에 교차 페이드가 발생함).

제가 해결할 수 있었던 해결책은 제 보기 DidLoad에 새로 고침 컨트롤을 만든 후 바로 이 기능을 적용하는 것이었습니다.

self.refreshControl = [[UIRefreshControl alloc] init];
self.refreshControl.tintColor = [UIColor whiteColor];
...
self.refreshControlHeight = self.refreshControl.frame.size.height;
[self.tableView setContentOffset:CGPointMake(0, -1) animated:NO];
[self.tableView setContentOffset:CGPointMake(0, 0) animated:NO];

그런 다음 UI 새로 고침 컨트롤을 프로그래밍 방식으로 표시하려면 다음을 수행합니다.

[self.tableView setContentOffset:CGPointMake(0, self.tableView.contentOffset.y-self.refreshControlHeight) animated:YES];
[self.refreshControl beginRefreshing];

새로 고침 컨트롤의 높이를 저장해야 했습니다. 첫 번째 호출에 대해 설정되어 있는 동안 후속 호출의 높이는 0입니다.

tintColor 문제에 대한 해결책: viewDidLoad에 추가합니다.

[self.refreshControl setTintColor:[UIColor whiteColor]];
[self.refreshControl tintColorDidChange];

이제 beginRefresh를 수동으로 호출하면 흰색 표시기가 나타납니다.

스위프트:

저는 스위프트와 > iOS8을 사용하고 있습니다.설명된 대부분의 해결 방법은 저에게 효과가 없었습니다.그렇게 작동하게 되었습니다.

뷰에서 DidLoad:

customRefreshControl.tintColor = UIColor.clearColor()

다음은 viewDidLoad 내부에 있을 필요가 없습니다.테이블을 업데이트할 때마다 호출되는 추가 기능에 넣었습니다. 보기:

private func startRefreshControlAnimation() {

    self.tableView.setContentOffset(CGPointMake(0, -self.customRefreshControl.frame.size.height), animated: true)

    CATransaction.begin()
    self.customRefreshControl.beginRefreshing()
    CATransaction.commit()

}

저는 이전 답변들 중 일부를 결합했습니다.이것은 iOS 9와 Swift 2에서 작동합니다.

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let contentOffset = self.tableView.contentOffset.y
    UIView.animateWithDuration(0, delay: 0, options: .BeginFromCurrentState, animations: {
        print(self.tableView.contentOffset.y)
            self.tableView.setContentOffset(CGPointMake(0, -self.refreshControl.frame.size.height), animated: false)
        }, completion: { finished in
            self.refreshControl.beginRefreshing()
            self.tableView.setContentOffset(CGPointMake(0, contentOffset/2-self.refreshControl.frame.size.height), animated: true)
            self.refresh() // Code that refresh table data
    })        
}

저는 Xamarin(C#)을 사용하여 iOS용으로 개발하고 있으며 동일한 문제를 발견했습니다.

저는 컬러링 문제를 수정했습니다.AttributedTitle의 시대의RefreshControl:

private CGPoint originalOffset;
...
public override void ViewDidLoad ()
{
     base.ViewDidLoad ();
     ...
     originalOffset = TableView.ContentOffset; // Store the original offset of the table view
     RefreshControl = new UIRefreshControl (){ TintColor = UIColor.Red };
     RefreshControl.ValueChanged += ((s,e) => { Update (this, EventArgs.Empty); });
     // Hack so the TintColor of the RefreshControl will be properly set
     RefreshControl.AttributedTitle = new NSAttributedString ("Fetching data");
}

내 업데이트 방법은 다음과 같습니다.

private async void Update(object sender, EventArgs args)
{
     try {
          TableView.UserInteractionEnabled = false;
          // I find -100 to be a big enough offset
          TableView.SetContentOffset (new CGPoint (0, -100), true);
          RefreshControl.BeginRefreshing ();
          ... // Fetch data & update table source 
          TableView.ReloadData ();
      } catch(Exception) {
          // Respond to exception
      } finally {
          // Put the offset back to the original
          TableView.SetContentOffset (originalOffset, true);
          RefreshControl.EndRefreshing ();
          TableView.UserInteractionEnabled = true;
      }
}

원스 더ViewDidAppear부를게요Update에 제 이었을 겁니다제목을 정하기 전에, 제 스피너는 검은색이었을 것입니다.이제 그것은 적절한 빨간색을 가지고 있습니다.

이 '해크/픽스'에는 두 번째 버그도 함께 발생한다는 점에 주목할 필요가 있습니다.처으로새고를다같음은이것있을다점는이과치로면(음)가 됩니다.AttributedTitle표시되지 않습니다.두 번째(, 세 번째, 네 번째,...) 시간을 새로 고치면 제목이 올바르게 표시됩니다.하지만 제목을 원하지 않으면 빈 문자열로 초기화하면 됩니다. 이것은 여러분에게 큰 문제가 되지 않습니다.

저는 이것이 다른 사람들에게 도움이 되기를 바랍니다.

이 해킹은 매우 효과적입니다.

var refreshWasProgramBeginning: Bool = false

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if !refreshWasProgramBeginning {
        UIView.animate(withDuration: 0.25, animations: {
            self.tableView.contentOffset = CGPoint.init(x: 0, y: -self.refreshControl.frame.height)
        }) { (_) in
            self.refreshControl.beginRefreshing()
            self.refreshWasProgramBeginning = true
        }
    }
}

저는 Xamarin C#(iOS 10)과 함께 작업하고 있으며, 이러한 모든 답변이 저를 해결해 준다는 것을 알게 되었습니다.

내 안에서ViewDidLoad다음 항목이 있습니다.

    RefreshControl = new UIRefreshControl();
    RefreshControl.TintColor = UIColor.White;
    RefreshControl.ValueChanged += OnRefresh;
    RefreshControl.BackgroundColor = UIColor.Clear;

나중에 프로그래밍 방식으로 새로 고침 애니메이션을 호출합니다.ViewDidAppear다음을 포함합니다.

    BeginInvokeOnMainThread(() =>
    {
        UIView.Animate(0, 0.2, UIViewAnimationOptions.BeginFromCurrentState, () =>
        {
            TableView.SetContentOffset(new CGPoint(0, TableView.ContentOffset.Y - RefreshControl.Frame.Size.Height), true);
            RefreshControl.AttributedTitle = new NSAttributedString("");
        },
        () =>
        {
            RefreshControl.BeginRefreshing();
        });
    });

속성된 제목과 애니메이션 블록의 설정은 제가 놓친 부분이었습니다.RefreshControl제 하얀 색을 가져가기 위해서요.

이 질문에 기여한 모든 분들께 감사드립니다.

호출 시 발생하는 버그입니다.beginRefreshing() tintColor 성속에서 )viewDidLoad()(여기에 표시).그러나, 다음과 같은 간단한 해결 방법이 있습니다.beginRefreshing()부에전에 defer 4문(Swift 4):

override func viewDidLoad() {
    super.viewDidLoad()
    refreshControl.tintColor = .red
    defer {
        refreshControl.beginRefreshing()
    }
}

회전을 시작하기 전에 테이블 보기/스크롤 보기에 대한 내용 오프셋을 수동으로 설정합니다.

tableView.setContentOffset(CGPoint(x: 0, y: tableView.contentOffset.y - (refreshControl.frame.size.height)), animated: true)
refreshControl.beginRefreshing()
......

내용을 조정하지 않는 솔루션입니다.

따라서 원래 활동 표시기를 사용자의 활동 표시기(또는 Lottie AnimationView와 같은 사용자 정의 보기)로 대체하여 숨길 수 있습니다.


import UIKit

final class CustomRefreshControl: UIRefreshControl {

    private let loaderView = UIActivityIndicatorView(frame: .zero)

    override init() {

        super.init(frame: .zero)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {

        super.init(coder: aDecoder)
        self.setup()
    }

    override func beginRefreshing() {

        super.beginRefreshing()
        self.loaderView.startAnimating()
    }

    override func endRefreshing() {

        super.endRefreshing()
        self.loaderView.stopAnimating()
    }

    override func didAddSubview(_ subview: UIView) {

        super.didAddSubview(subview)
        subview.alpha = subview === self.loaderView ? 1 : 0
    }
}

// MARK: - Private

private extension CustomRefreshControl {

    func setup() {

        self.tintColor = .clear // hides default indicator view only when user pulls
        self.addSubview(self.loaderView)
        self.loaderView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.loaderView.centerXAnchor.constraint(equalTo: self.centerXAnchor),
            self.loaderView.centerYAnchor.constraint(equalTo: self.centerYAnchor),
            self.loaderView.heightAnchor.constraint(equalToConstant: 32),
            self.loaderView.widthAnchor.constraint(equalToConstant: 32)
        ])

        self.addTarget(self, action: #selector(self.beginRefreshing), for: .valueChanged)
    }
}

WillAppear 보기에서 UIRfreshControl의 tintColor를 설정해 보십시오.

나는 몇 가지 일을 찾았습니다. 나는 그것이 당신에게 효과가 있기를 바랍니다.

 [_TBL setContentOffset:CGPointMake(0,_TBL.contentOffset.y-_refreshControl.frame.size.height) animated:YES];
[_refreshControl performSelector:@selector(beginRefreshing) withObject:nil afterDelay:0.25];
[self getLatestUpdates];

이 문제를 해결하는 드롭인 UIRfreshControl+beginRefreshControl 카테고리를 만들었습니다.

요약하면 tintColor 문제와 수동으로 tableView adjust contentOffset을 수정하여 새로 고침 컨트롤이 표시되도록 합니다.시도해 보세요 :)

설정할 때

tableView.refreshControl = refreshControl 

refreshControl이 매번 다른 인스턴스인 경우 여러 번 새로 고침 컨트롤 색상이 항상 검은색이고 틴트 색상을 다른 값으로 설정해도 문제가 발생했습니다.

그래서 내가 설정한tableView.refreshControl = refreshControl한 번만 숨기면 이 스레드에서 알파 값, 더 자세한 정보를 설정합니다.

UIRfreshControl을 "숨기는" 방법은 무엇을 해야 합니까?

사용.UIView.animate스위프트 4에서는 작동하지 않았습니다.

제가 사용하게 된 것은 다음과 같습니다.

extension UIRefreshControl {
    func beginRefreshingManually(with scrollView: UIScrollView, isFirstTime: Bool) {
        if self.isRefreshing { return }

        // Workaround: If we call setContentOffset on the first time that the screen loads
        // we get a black refreshControl with the wrong size.
        // We could just set the scrollView.contentOffset everytime, but it does not animate the scrolling.
        // So for every other time, we call the setContentOffset animated.
        if isFirstTime {
            scrollView.contentOffset = CGPoint(x: 0, y: -self.frame.size.height)
        } else {
            scrollView.setContentOffset(CGPoint(x: 0, y: -self.frame.size.height), animated: true)
        }
        self.beginRefreshing()
    }
}

저도 이 문제로 며칠째 고민하고 있습니다.제 프로젝트에서 수정한 방법은 다음과 같습니다.

VC에 새로 고침 컨트롤에 대한 속성이 있습니다.

private lazy var refreshControl: UIRefreshControl = {
    let refresh = UIRefreshControl()
    refresh.tintColor = UIColor.yellow
    refresh.addTarget(self, action: #selector(doSomething), for: .valueChanged)
    return refresh
}()

나의viewDidAppear내가 사용하던 방법

override func viewDidAppear(_ animated: Bool) {
     super.viewDidAppear(animated)

     tableView.setContentOffset(CGPoint(x: 0, y: -refreshControl.frame.height), animated: true)
     refreshControl.beginRefreshing()
}

음, 만약 당신이 그것을 설정한다면.animated의 재산.setContentOffsetfalse로, 처음부터 새로 고침 컨트롤 색조가 올바르게 표시됩니다...

수정된 코드, 나를 위해 일하는 것:

override func viewDidAppear(_ animated: Bool) {
     super.viewDidAppear(animated)

     tableView.setContentOffset(CGPoint(x: 0, y: -refreshControl.frame.height), animated: false)
     refreshControl.beginRefreshing()
 }

enter image description here

setTintColor를 강제로 메인 스레드에서 실행합니다. (메인 스레드는 UI를 업데이트합니다.)

[[NSOperationQueue mainQueue] addOperationWithBlock:^ {
    [self.refreshControl setTintColor:[UIColor redColor]];
    [self.refreshControl beginRefreshing];
}];

언급URL : https://stackoverflow.com/questions/19026351/ios-7-uirefreshcontrol-tintcolor-not-working-for-beginrefreshing

반응형