奇怪但易于理解的错误...... UIActivityIndicatorView stopAnimating 不起作用
Weird but simple to understand bug... UIActivityIndicatorView stopAnimating is not working
编辑:UIActivityIndicatorView 认为它不在屏幕上...所有值都表明它不在,但是当您查看屏幕时,它就在那里。
所以...这有点让我发疯。
我正在使用 https://github.com/fphilipe/PHFComposeBarView
我正在对其进行编辑,以便在加载时可以用 UIActivityIndicatorView 代替右侧的按钮...
就目前而言,我可以完美地开始为 UIActivityIndicatorView 设置动画...但是当我必须停止为它设置动画时,它不会停止也不会消失。
我有 hidesWhenStopped = true
并且我知道一切都在主线程上发生。
事实上,当我使用 println
或 NSLog
时,我看到 UIActivityIndicatorView 认为它是隐藏的...但显然不是。
有人知道为什么它可能不起作用吗?
编辑:我什至试图通过让 UIActivityIndicatorView 始终处于动画状态并将其添加到视图或将其从其超级视图中删除来缓解这种情况......同样,当我需要删除它时,它不会工作...
- (void)startLoading {
dispatch_async(dispatch_get_main_queue(), ^{
[[self loadIndicator] startAnimating];
});
}
- (void)stopLoading {
dispatch_async(dispatch_get_main_queue(), ^{
[[self loadIndicator] stopAnimating];
});
}
@synthesize button = _button;
- (UIButton *)button {
if (!_button) {
_button = [PHFComposeBarView_Button buttonWithType:UIButtonTypeCustom];
CGRect frame = CGRectMake([self bounds].size.width - kHorizontalSpacing - kButtonRightMargin - kButtonTouchableOverlap,
[self bounds].size.height - kButtonBottomMargin - kButtonHeight,
2 * kButtonTouchableOverlap,
kButtonHeight);
[_button setFrame:frame];
[_button setTitleEdgeInsets:UIEdgeInsetsMake(0.5f, 0, 0, 0)];
[_button setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleTopMargin];
[_button setTitle:[self buttonTitle] forState:UIControlStateNormal];
UIColor *disabledColor = [UIColor colorWithHue:240.0f/360.0f saturation:0.03f brightness:0.58f alpha:1.0f];
[_button setTitleColor:disabledColor forState:UIControlStateDisabled];
UIColor *enabledColor = [UIColor colorWithHue:211.0f/360.0f saturation:1.0f brightness:1.0f alpha:1.0f];
[_button setTitleColor:enabledColor forState:UIControlStateNormal];
[_button addTarget:self action:@selector(didPressButton) forControlEvents:UIControlEventTouchUpInside];
UILabel *label = [_button titleLabel];
[label setFont:[UIFont boldSystemFontOfSize:kFontSize]];
}
return _button;
}
@synthesize loadIndicator = _loadIndicator;
- (UIActivityIndicatorView *)loadIndicator {
if (!_loadIndicator) {
UIButton *rightButton = [self button];
_loadIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake([rightButton frame].origin.x + [rightButton frame].size.width / 2.0f - [rightButton frame].size.height / 2.0f, [rightButton frame].origin.y, [rightButton frame].size.height, [rightButton frame].size.height)];
[_loadIndicator setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleTopMargin];
_loadIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
_loadIndicator.hidesWhenStopped = true;
}
return _loadIndicator;
}
应该是相关代码...
在我的 ViewController:
var composeBarView: PHFComposeBarView {
var viewBounds = self.view
var frame = CGRectMake(0, viewBounds.frame.height - PHFComposeBarViewInitialHeight, viewBounds.frame.width, PHFComposeBarViewInitialHeight)
var composeBarView = PHFComposeBarView(frame: frame)
composeBarView.maxLinesCount = 6
composeBarView.placeholder = "Write some text"
composeBarView.buttonTitle = "Reply"
composeBarView.delegate = self
composeBarView.buttonTintColor = UIColor(hexString: "056A85")
composeBarView.textView.backgroundColor = UIColor.whiteColor()
return composeBarView
}
因为您使用的是计算 属性,而不是惰性 属性,所以每次调用 self.composeBarView
都会创建一个新实例。您的代码使用传递的视图开始动画,但要停止动画,您总是在创建一个显然尚未显示的新视图。
将您的代码更改为:
lazy var composeBarView: PHFComposeBarView = {
var viewBounds = self.view
var frame = CGRectMake(0, viewBounds.frame.height - PHFComposeBarViewInitialHeight, viewBounds.frame.width, PHFComposeBarViewInitialHeight)
var composeBarView = PHFComposeBarView(frame: frame)
composeBarView.maxLinesCount = 6
composeBarView.placeholder = "Write some text"
composeBarView.buttonTitle = "Reply"
composeBarView.delegate = self
composeBarView.textView.backgroundColor = UIColor.whiteColor()
return composeBarView
}()
编辑:UIActivityIndicatorView 认为它不在屏幕上...所有值都表明它不在,但是当您查看屏幕时,它就在那里。
所以...这有点让我发疯。
我正在使用 https://github.com/fphilipe/PHFComposeBarView
我正在对其进行编辑,以便在加载时可以用 UIActivityIndicatorView 代替右侧的按钮...
就目前而言,我可以完美地开始为 UIActivityIndicatorView 设置动画...但是当我必须停止为它设置动画时,它不会停止也不会消失。
我有 hidesWhenStopped = true
并且我知道一切都在主线程上发生。
事实上,当我使用 println
或 NSLog
时,我看到 UIActivityIndicatorView 认为它是隐藏的...但显然不是。
有人知道为什么它可能不起作用吗?
编辑:我什至试图通过让 UIActivityIndicatorView 始终处于动画状态并将其添加到视图或将其从其超级视图中删除来缓解这种情况......同样,当我需要删除它时,它不会工作...
- (void)startLoading {
dispatch_async(dispatch_get_main_queue(), ^{
[[self loadIndicator] startAnimating];
});
}
- (void)stopLoading {
dispatch_async(dispatch_get_main_queue(), ^{
[[self loadIndicator] stopAnimating];
});
}
@synthesize button = _button;
- (UIButton *)button {
if (!_button) {
_button = [PHFComposeBarView_Button buttonWithType:UIButtonTypeCustom];
CGRect frame = CGRectMake([self bounds].size.width - kHorizontalSpacing - kButtonRightMargin - kButtonTouchableOverlap,
[self bounds].size.height - kButtonBottomMargin - kButtonHeight,
2 * kButtonTouchableOverlap,
kButtonHeight);
[_button setFrame:frame];
[_button setTitleEdgeInsets:UIEdgeInsetsMake(0.5f, 0, 0, 0)];
[_button setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleTopMargin];
[_button setTitle:[self buttonTitle] forState:UIControlStateNormal];
UIColor *disabledColor = [UIColor colorWithHue:240.0f/360.0f saturation:0.03f brightness:0.58f alpha:1.0f];
[_button setTitleColor:disabledColor forState:UIControlStateDisabled];
UIColor *enabledColor = [UIColor colorWithHue:211.0f/360.0f saturation:1.0f brightness:1.0f alpha:1.0f];
[_button setTitleColor:enabledColor forState:UIControlStateNormal];
[_button addTarget:self action:@selector(didPressButton) forControlEvents:UIControlEventTouchUpInside];
UILabel *label = [_button titleLabel];
[label setFont:[UIFont boldSystemFontOfSize:kFontSize]];
}
return _button;
}
@synthesize loadIndicator = _loadIndicator;
- (UIActivityIndicatorView *)loadIndicator {
if (!_loadIndicator) {
UIButton *rightButton = [self button];
_loadIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake([rightButton frame].origin.x + [rightButton frame].size.width / 2.0f - [rightButton frame].size.height / 2.0f, [rightButton frame].origin.y, [rightButton frame].size.height, [rightButton frame].size.height)];
[_loadIndicator setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleTopMargin];
_loadIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
_loadIndicator.hidesWhenStopped = true;
}
return _loadIndicator;
}
应该是相关代码...
在我的 ViewController:
var composeBarView: PHFComposeBarView {
var viewBounds = self.view
var frame = CGRectMake(0, viewBounds.frame.height - PHFComposeBarViewInitialHeight, viewBounds.frame.width, PHFComposeBarViewInitialHeight)
var composeBarView = PHFComposeBarView(frame: frame)
composeBarView.maxLinesCount = 6
composeBarView.placeholder = "Write some text"
composeBarView.buttonTitle = "Reply"
composeBarView.delegate = self
composeBarView.buttonTintColor = UIColor(hexString: "056A85")
composeBarView.textView.backgroundColor = UIColor.whiteColor()
return composeBarView
}
因为您使用的是计算 属性,而不是惰性 属性,所以每次调用 self.composeBarView
都会创建一个新实例。您的代码使用传递的视图开始动画,但要停止动画,您总是在创建一个显然尚未显示的新视图。
将您的代码更改为:
lazy var composeBarView: PHFComposeBarView = {
var viewBounds = self.view
var frame = CGRectMake(0, viewBounds.frame.height - PHFComposeBarViewInitialHeight, viewBounds.frame.width, PHFComposeBarViewInitialHeight)
var composeBarView = PHFComposeBarView(frame: frame)
composeBarView.maxLinesCount = 6
composeBarView.placeholder = "Write some text"
composeBarView.buttonTitle = "Reply"
composeBarView.delegate = self
composeBarView.textView.backgroundColor = UIColor.whiteColor()
return composeBarView
}()