Настройте точку с изображением UIPageControl по индексу 0 UIPageControl
Я новый ученик программирования ios. Я попытался найти другой пример и больше вопросов в stackoverflow, но это не моя цель. Я хочу установить изображение точки с индексом 0 UIPageControl так же, как и на экране поиска iPhone. Есть ли способ сделать это? Пожалуйста, объясните мне какой-нибудь код или другую полезную ссылку.
Заранее спасибо
![enter image description here]()
Ответы
Ответ 1
Попробуйте эту ссылку: -
Ответ с помощью GrayPageControl: -
Есть ли способ изменить цвет точек индикатора страницы
Это действительно хорошо и надежно. Я также использовал этот код.
Возможно, вам придется выполнить еще одну настройку как
-(void) updateDots
{
for (int i = 0; i < [self.subviews count]; i++)
{
UIImageView* dot = [self.subviews objectAtIndex:i];
if (i == self.currentPage) {
if(i==0) {
dot.image = [UIImage imageNamed:@"activesearch.png"];
} else {
dot.image = activeImage;
}
} else {
if(i==0) {
dot.image = [UIImage imageNamed:@"inactivesearch.png"];
} else {
dot.image = inactiveImage;
}
}
}
}
Ответ 2
Я нашел решение этой проблемы. Я знаю, что это не так, но он будет работать до тех пор, пока iOS 8 не будет запущен на рынке.
Причина сбоя:
в iOS 7 [self.subViews objectAtIndex: i] возвращает UIView Вместо UIImageView и setImage не является свойством UIView, и приложение падает. Я решаю свою проблему, используя следующий код.
Проверьте, является ли subview 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;
}
Кроме того, чтобы очистить изображения, которые уже есть, установите цвета оттенков для существующих индикаторов прозрачными:
- (void)awakeFromNib
{
self.pageIndicatorTintColor = [UIColor clearColor];
self.currentPageIndicatorTintColor = [UIColor clearColor];
}
Надеюсь, что это решит проблему ура для iOS 7.
Счастливое кодирование
Ответ 3
Просто измените индикатор страницы UIPageControl Цвет с рисунком Изображение self.pageControl.currentPageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"circle"]];
Ответ 4
Лучший компилятор кода для Swift 3 до заменит первый значок на UIPageControl
маркером местоположения:
import UIKit
class LocationPageControl: UIPageControl {
let locationArrow: UIImage = UIImage(named: "locationArrow")!
let pageCircle: UIImage = UIImage(named: "pageCircle")!
override var numberOfPages: Int {
didSet {
updateDots()
}
}
override var currentPage: Int {
didSet {
updateDots()
}
}
override func awakeFromNib() {
super.awakeFromNib()
self.pageIndicatorTintColor = UIColor.clear
self.currentPageIndicatorTintColor = UIColor.clear
self.clipsToBounds = false
}
func updateDots() {
var i = 0
for view in self.subviews {
var imageView = self.imageView(forSubview: view)
if imageView == nil {
if i == 0 {
imageView = UIImageView(image: locationArrow)
} else {
imageView = UIImageView(image: pageCircle)
}
imageView!.center = view.center
view.addSubview(imageView!)
view.clipsToBounds = false
}
if i == self.currentPage {
imageView!.alpha = 1.0
} else {
imageView!.alpha = 0.5
}
i += 1
}
}
fileprivate func imageView(forSubview view: UIView) -> UIImageView? {
var dot: UIImageView?
if let dotImageView = view as? UIImageView {
dot = dotImageView
} else {
for foundView in view.subviews {
if let imageView = foundView as? UIImageView {
dot = imageView
break
}
}
}
return dot
}
}
Прикрепленные изображения:
![введите описание изображения здесь]()
Ответ 5
Обновление для Swift 3.0... вы знаете, если вы согласны с принятым заявленным риском: "Изменение подсмотров существующего элемента управления является хрупким".
import UIKit
class CustomImagePageControl: UIPageControl {
let activeImage:UIImage = UIImage(named: "SelectedPage")!
let inactiveImage:UIImage = UIImage(named: "UnselectedPage")!
override func awakeFromNib() {
super.awakeFromNib()
self.pageIndicatorTintColor = UIColor.clear
self.currentPageIndicatorTintColor = UIColor.clear
self.clipsToBounds = false
}
func updateDots() {
var i = 0
for view in self.subviews {
if let imageView = self.imageForSubview(view) {
if i == self.currentPage {
imageView.image = self.activeImage
} else {
imageView.image = self.inactiveImage
}
i = i + 1
} else {
var dotImage = self.inactiveImage
if i == self.currentPage {
dotImage = self.activeImage
}
view.clipsToBounds = false
view.addSubview(UIImageView(image:dotImage))
i = i + 1
}
}
}
fileprivate func imageForSubview(_ view:UIView) -> UIImageView? {
var dot:UIImageView?
if let dotImageView = view as? UIImageView {
dot = dotImageView
} else {
for foundView in view.subviews {
if let imageView = foundView as? UIImageView {
dot = imageView
break
}
}
}
return dot
}
}
Ответ 6
Вам просто нужно сделать это так:
((UIImageView *)[[yourPageControl subviews] objectAtIndex:0]).image=[UIImage imageNamed:@"search.png"];
Ответ 7
Я думаю, для этого вам нужно настроить целое UIPageControl
. Подробнее см. Ниже.
Ответ 8
Я создал пользовательский контроллер страницы, который должен работать в основном одинаково, не взламывая внутреннюю часть UIPageControl или имея целую библиотеку для одного маленького виджета.
Просто поместите пустой UIStackView в раскадровку и сделать свой собственный класс, этот класс ниже, и использовать numberOfPages
и currentPage
как обычный UIPageControl. Установите интервал в UIStackView, чтобы изменить расстояние между представлениями.
Swift 4.2
/**
If adding via storyboard, you should not need to set a width and height constraint for this view,
just set a placeholder for each so autolayout doesnt complain and this view will size itself once its populated with pages at runtime
*/
class PageControl: UIStackView {
@IBInspectable var currentPageImage: UIImage = UIImage(named: "whiteCircleFilled")!
@IBInspectable var pageImage: UIImage = UIImage(named: "whiteCircleOutlined")!
/**
Sets how many page indicators will show
*/
var numberOfPages = 3 {
didSet {
layoutIndicators()
}
}
/**
Sets which page indicator will be highlighted with the **currentPageImage**
*/
var currentPage = 0 {
didSet {
setCurrentPageIndicator()
}
}
override func awakeFromNib() {
super.awakeFromNib()
axis = .horizontal
distribution = .equalSpacing
alignment = .center
layoutIndicators()
}
private func layoutIndicators() {
for i in 0..<numberOfPages {
let imageView: UIImageView
if i < arrangedSubviews.count {
imageView = arrangedSubviews[i] as! UIImageView // reuse subview if possible
} else {
imageView = UIImageView()
addArrangedSubview(imageView)
}
if i == currentPage {
imageView.image = currentPageImage
} else {
imageView.image = pageImage
}
}
// remove excess subviews if any
let subviewCount = arrangedSubviews.count
if numberOfPages < subviewCount {
for _ in numberOfPages..<subviewCount {
arrangedSubviews.last?.removeFromSuperview()
}
}
}
private func setCurrentPageIndicator() {
for i in 0..<arrangedSubviews.count {
let imageView = arrangedSubviews[i] as! UIImageView
if i == currentPage {
imageView.image = currentPageImage
} else {
imageView.image = pageImage
}
}
}
}
Работает для моих целей, но я не даю никаких гарантий
Ответ 9
От ответа iProgrammer
Если вы хотите скрыть исходную точку
- (UIImageView *)imageViewForSubview:(UIView *)view {
UIImageView * dot = nil;
[view setBackgroundColor:[UIColor clearColor]]; << add this line