有没有办法改变页面指示点颜色
Posted
技术标签:
【中文标题】有没有办法改变页面指示点颜色【英文标题】:Is there a way to change page indicator dots color 【发布时间】:2010-08-04 19:57:29 【问题描述】:我是 iphone 编程的新手,我正在尝试开发一个使用页面控制的应用程序。我的视图的背景颜色是白色,页面控制器默认也是白色的,这使得页面控件在我的视图中不可见,因此我更改了页面控件的背景颜色以使其可见。现在,该视图看起来已修补且很糟糕。有没有办法只更改页面控件的点颜色?
提前致谢
【问题讨论】:
重复问题。顺便说一句,看到这个***.com/questions/2942636/…,给定的解决方案是世界上最好的解决方案之一。我个人使用了很多次。 你可以参考这个帖子***.com/questions/26648988/… 【参考方案1】:我们自定义 UIPageControl 以使用自定义图像作为页面指示器,我在下面列出了该类的内容...
GrayPageControl.h
@interface GrayPageControl : UIPageControl
UIImage* activeImage;
UIImage* inactiveImage;
GrayPageControl.m
-(id) initWithCoder:(NSCoder *)aDecoder
self = [super initWithCoder:aDecoder];
activeImage = [[UIImage imageNamed:@"active_page_image.png"] retain];
inactiveImage = [[UIImage imageNamed:@"inactive_page_image.png"] retain];
return self;
-(void) updateDots
for (int i = 0; i < [self.subviews count]; i++)
UIImageView* dot = [self.subviews objectAtIndex:i];
if (i == self.currentPage) dot.image = activeImage;
else dot.image = inactiveImage;
-(void) setCurrentPage:(NSInteger)page
[super setCurrentPage:page];
[self updateDots];
然后在 View Controller 中我们就像普通的 UIPageControl 一样使用它
IBOutlet GrayPageControl* PageIndicator;
编辑:
在具有 GrayPageControl 的视图控制器中,我有一个链接到 GrayPageControl.ValueChanged 事件的 IBAction。
-(IBAction) pageChanged:(id)sender
int page = PageIndicator.currentPage;
// update the scroll view to the appropriate page
CGRect frame = ImagesScroller.frame;
frame.origin.x = frame.size.width * page;
frame.origin.y = 0;
[ImagesScroller scrollRectToVisible:frame animated:YES];
【讨论】:
我还为 layoutSubviews 添加了一个覆盖,它刚刚调用了 updateDots - 它在首次添加控件时消除了轻微的闪烁 :) 我解决了这个问题:dot.frame = CGRectMake(dot.frame.origin.x, dot.frame.origin.y, 20., 20.);谢谢你,你的代码很简单,但很棒! -(void) setCurrentPage:(NSInteger)page 在我点击按钮时没有被调用。 只是让您知道,这在 ios7(使用 Xcode 5 编译)上会崩溃,因为 UIPageControl 子视图不再是 UIImageViews。 在 ios 7 中不起作用。给出异常“无法识别的选择器”,因为 [self.subviews objectAtIndex:i] 返回 UIView 而不是 UIImageview,并且图像不是 UIView 的属性。请检查并为我的[这里的问题]提供一些解决方案(***.com/questions/19024167/…【参考方案2】:应用程序在 iOS7 中崩溃。我有一个适用于 iOS 7 的解决方案:
崩溃原因:
在 iOS 7 中 [self.subViews objectAtIndex: i]
返回 UIView
而不是 UIImageView
和 setImage
不是 UIView
的属性并且应用程序崩溃。我使用以下代码解决了我的问题。
检查子视图是UIView
(适用于iOS7)还是UIImageView
(适用于iOS6或更早版本)。如果是UIView
,我将在该视图上添加UIImageView
作为子视图,瞧它的工作原理,不会崩溃..!!
-(void) updateDots
for (int i = 0; i < [self.subviews count]; i++)
UIImageView * dot = [self imageViewForSubview: [self.subviews objectAtIndex: i]];
if (i == self.currentPage) dot.image = activeImage;
else dot.image = inactiveImage;
- (UIImageView *) imageViewForSubview: (UIView *) view
UIImageView * dot = nil;
if ([view isKindOfClass: [UIView class]])
for (UIView* subview in view.subviews)
if ([subview isKindOfClass:[UIImageView class]])
dot = (UIImageView *)subview;
break;
if (dot == nil)
dot = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, view.frame.size.width, view.frame.size.height)];
[view addSubview:dot];
else
dot = (UIImageView *) view;
return dot;
希望这也能解决 iOS7 的问题。如果 Anypone 找到了最佳解决方案,请发表评论。 :)
愉快的编码
【讨论】:
如果你不想要背景上的白色圆角颜色,只需添加 view.backgroundColor = [UIColor clearColor];在 imageViewForSubview 方法的开头。【参考方案3】:JWD 答案是要走的路。但是,如果您只想更改颜色,为什么不这样做:
此技术仅适用于 iOS6.0 及更高版本!
选择你的 UIPageControl 去属性检查器。多田。
或者您也可以使用以下 2 个属性:
pageIndicatorTintColor property
currentPageIndicatorTintColor property
这很简单。我再次阅读了这个问题,以确保我没有错。你真的只是想改变颜色,不是吗?好的。
你仍然被那些法律点所困扰。使用 JWD 技术制作精美的点图。
【讨论】:
我不想吹嘘。虽然 JWD 的答案非常好,但我是唯一一个真正回答这个问题的人:D 如果我想在 iOS 5 中做同样的事情,我会怎么做? 我按照 appcoda 教程在我的应用程序中构建 uipageview 控制器。我没有找到您上面提到的任何控件。这些控件在 x 代码 6 中仍然可用吗?如果有请帮我提供一些细节。喜欢将所选页面的点更改为蓝色,将其他点更改为后点-提前感谢【参考方案4】:只需一行代码即可满足您的需求。示例设置为黑色。
pageControl.pageIndicatorTintColor = [UIColor blackColor];
【讨论】:
【参考方案5】:DDPageControl 是一个很好的替代品。看看吧!
您也可以查看已归档的博文here。
【讨论】:
谢谢,我解决了这个问题。【参考方案6】:您可以使用以下代码更改页面指示器色调和当前页面指示器色调:
pageControl.pageIndicatorTintColor = [UIColor orangeColor];
pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
【讨论】:
【参考方案7】:如果您只是想更改点的颜色或对其进行自定义,您可以按照 JWD 的建议进行制作,但可以采用另一种方式:
#pragma mark - LifeCycle
- (void)setCurrentPage:(NSInteger)page
[super setCurrentPage:page];
[self updateDots];
#pragma mark - Private
- (void)updateDots
for (int i = 0; i < [self.subviews count]; i++)
UIView* dot = [self.subviews objectAtIndex:i];
if (i == self.currentPage)
dot.backgroundColor = UIColorFromHEX(0x72E7DB);
dot.layer.cornerRadius = dot.frame.size.height / 2;
else
dot.backgroundColor = UIColorFromHEX(0xFFFFFF);
dot.layer.cornerRadius = dot.frame.size.height / 2 - 1;
dot.layer.borderColor = UIColorFromHEX(0x72E7DB).CGColor;
dot.layer.borderWidth = 1;
结果你会得到类似的东西
还有宏:
#define UIColorFromHEX(hexValue) [UIColor colorWithRed:((float)((hexValue & 0xFF0000) >> 16))/255.0 green:((float)((hexValue & 0xFF00) >> 8))/255.0 blue:((float)(hexValue & 0xFF))/255.0 alpha:1.0]
【讨论】:
要正常工作,您必须禁用用户交互。否则有故障!【参考方案8】:最好和最简单的方法是在 AppDelegate.m 的 didFinishLaunchingWithOptions 方法中添加以下代码行
UIPageControl *pageControl = [UIPageControl appearance];
pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
pageControl.backgroundColor = [UIColor whiteColor];
【讨论】:
【参考方案9】:您可能想在另一个*** question 中查看this solution。
【讨论】:
【参考方案10】:这是使用自定义图像的相关答案(如果您很灵活并且可以使用图像而不是直接更改颜色)。
Customize dot with image of UIPageControl at index 0 of UIPageControl
【讨论】:
以上是关于有没有办法改变页面指示点颜色的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法改变按钮后面的背景颜色(button.setBackgroundResource)
Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色