我有一个标准的UITableView。我想将单元格shadowColor
的{{1}}设置为textLabel
,但仅限于触摸单元格时。为此,我使用以下代码。它是一个自定义的UITableViewCell子类,它覆盖setSelected / setHighlighted:
[UIColor whiteColor]
这种方法的问题在于,取消选择时,单元格的周期非常短,标签的文本和阴影都是白色。请参阅此截图,这是在确切的时刻拍摄的。取消选择:
这与这两个帖子的方法基本相同:
UILabel shadow from custom cell selected color
Removing text shadow in UITableViewCell when it's selected
我在后一个问题中使用了接受答案的方法。
我创建了一个非常简单的代码项目 uploaded it to github 。它显示了我的问题。它只是一个显示单个单元格的UITableViewController。
除此之外,没什么好看的。 UITableView委托方法:
@implementation ExampleTableViewCell
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
[self setShadowColorSelected:selected];
}
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
[super setHighlighted:highlighted animated:animated];
[self setShadowColorSelected:highlighted];
}
- (void)setShadowColorSelected:(BOOL)selected {
if (selected) {
self.textLabel.shadowColor = [UIColor blackColor];
}else {
self.textLabel.shadowColor = [UIColor whiteColor];
}
}
@end
有什么想法吗?
答案 0 :(得分:5)
如果我理解了这个问题,你需要显示阴影颜色,直到细胞选择被动画化为止。我不确定你尝试的方式有什么不对,更直接的解决方案可以正常工作。
请注意,一旦不需要,您将需要删除观察者。
<强> ExampleTableViewCell.h 强>
@interface ExampleTableViewCell : UITableViewCell {
}
- (void) setSelectionShadowOfColor:(UIColor *) selColor;
@end
<强> ExampleTableViewCell.m 强>
@implementation ExampleTableViewCell
- (void) setSelectionShadowOfColor:(UIColor *) selColor {
self.textLabel
[self addObserver:self
forKeyPath:@"textLabel.highlighted" // not isHighlighted as that is a getter name of the highlighted property
options:NSKeyValueObservingOptionNew
context:NULL];
}
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
BOOL isHighlighted = [[change objectForKey:NSKeyValueChangeNewKey] boolValue];
if (isHighlighted) {
self.textLabel.shadowColor = [UIColor blackColor];
} else {
self.textLabel.shadowColor = [UIColor whiteColor];
}
}
@end
<强> ExampleTableViewController.m 强>
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
ExampleTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; // note the type ExampleTableViewCell is used here to avoid the interface lookup mess
if (!cell) {
cell = [[ExampleTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
[cell setSelectionShadowOfColor:[UIColor blackColor]];
}
cell.textLabel.text = @"test";
return cell;
}
答案 1 :(得分:2)
将以下内容添加到您的UITableViewDelegate:
NSIndexPath *selectedIndex;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell) {
cell = [[ExampleTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = @"test";
if(indexpath == selectedIndex)
{
cell.textlabel.shadowColor = [UIColor blackColor];
}
else
{
cell.textlabel.shadowColor = [UIColor whiteColor];
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self.tableView beginUpdates];
selectedIndex = indexpath;
[self.tableView endUpdates];
}
答案 2 :(得分:0)
这是我能做的最好的事情:
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:NO];
[self setShadowColorSelected:selected];
}
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
[super setHighlighted:highlighted animated:YES];
[self setShadowColorSelected:highlighted];
}
- (void)setShadowColorSelected:(BOOL)selected {
[self.textLabel setBackgroundColor:[UIColor clearColor]];
if (selected)
{
[self.textLabel setTextColor:[UIColor whiteColor]];
[self.textLabel setShadowColor:[UIColor blackColor]];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView transitionWithView:self.textLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
if (selected)
{
[self.textLabel setTextColor:[UIColor whiteColor]];
[self.textLabel setShadowColor:[UIColor blackColor]];
}
else
{
[self.textLabel setTextColor:[UIColor blackColor]];
[self.textLabel setShadowColor:[UIColor whiteColor]];
}
} completion:nil];
}
else
{
[self.textLabel setTextColor:[UIColor blackColor]];
[self.textLabel setShadowColor:[UIColor whiteColor]];
}
}
答案 3 :(得分:0)
根据我的理解,您可以通过使用以下代码更改tableview的颜色来消除此问题
[tableView setBackgroundColor:[UIColor "GrayColor"]];
答案 4 :(得分:0)
这是实现目标的简单方法:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
self.textLabel.shadowColor = [UIColor blackColor];
[super touchesBegan:touches withEvent:event];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
self.textLabel.shadowColor = [UIColor whiteColor];
[super touchesEnded:touches withEvent:event];
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
self.textLabel.shadowColor = [UIColor whiteColor];
[super touchesCancelled:touches withEvent:event];
}
答案 5 :(得分:0)
我猜您应该使用与UITableView用于动画选择/取消选择的相同持续时间来更改文本/阴影颜色的动画。根据我的理解,你可以在tableView 开始动画显示选择高亮显示(dis)的确切时刻更改文本/阴影颜色,所以你得到的是你的颜色瞬间变化,而选择突出显示需要一些时间来动画从一个状态到另一个状态
尝试这样的事情:
__block UIColor *newShadowColor = selected ? [UIColor blackColor] : [UIColor whiteColor];
[UIView animateWithDuration:0.2
animations:^{
/* change your label/shadow color here. */
self.textLabel.shadowColor = newShadowColor;
}
completion:^(BOOL finished){
/* this is where the cell is no longer selected
or highlighted. You may do some additional style changes to your
label here */ }];
答案 6 :(得分:0)
我有同样的问题。我查看的所有解决方案都需要进行分段/过多的额外代码。
我最后做的是在主要UILabel
下创建第二个UILabel
以充当阴影。
不要在主标签和阴影标签上设置阴影。对于阴影标签,将“正常颜色”设置为您想要的阴影颜色,并将突出显示的颜色设置为“清除颜色”。
显然,每次更新主标签时都必须更新阴影标签。在许多情况下,付出的代价不是很高。
希望有所帮助!
答案 7 :(得分:0)
我也遇到了同样的问题。
您可以使用UIButton代替使用默认标签,并解决您的问题。
将自定义按钮放入单元格。
我的要求得到了解决。它可能会对你有帮助。