iOS 7 UIRefreshControl tintColor가 beginRefresh에 대해 작동하지 않음
UIRfreshControl(iOS 7 기반)에 tintColor를 설정하려고 합니다. 다음 를 하도록 설정했습니다.viewDidLoad
방법 i는 다음을 수행했습니다.
[self.refreshControl setTintColor:[UIColor redColor]];
이제 새로 고침을 하려고 하면 새로 고침 컨트롤의 색상이 빨간색이 됩니다.
내 보기가 나타날 때 자동으로 업데이트되기를 원하기 때문에 다음 작업을 수행했습니다.
- (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];
억지로 보여주기 위해서.표시되지만 이제 기본 색상으로 돌아갑니다.
나중에 수동으로 당겨서 새로 고치려고 하면 빨간색입니다.
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
의 재산.setContentOffset
false로, 처음부터 새로 고침 컨트롤 색조가 올바르게 표시됩니다...
수정된 코드, 나를 위해 일하는 것:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
tableView.setContentOffset(CGPoint(x: 0, y: -refreshControl.frame.height), animated: false)
refreshControl.beginRefreshing()
}
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
'programing' 카테고리의 다른 글
JavaScript에서 target="_blank"를 시뮬레이션하는 방법 (0) | 2023.08.06 |
---|---|
mysql 전체 텍스트 검색 오른쪽 색인 (0) | 2023.08.06 |
'Element'에서 'setAttribute'를 실행하지 못했습니다. ']'은(는) 올바른 특성 이름이 아닙니다. 각 4 (0) | 2023.08.06 |
Swift에서 선택기에 인수 전달 (0) | 2023.08.06 |
0에서 1.0 php 사이의 임의 부동 소수 (0) | 2023.08.06 |