在UIPageControl的索引0处自定义带有UIPageControl图像的点

Sov*_*ith 27 iphone ios

我是ios编程的新学习者.我试图在stackoverflow上搜索另一个例子和更多问题,但这不是我的目标.我想在UIPageControl的索引0处设置一个点的图像,类似于iPhone搜索主屏幕.有办法吗?请用一些代码或其他有用的链接向我解释.

提前致谢

在此输入图像描述

Sah*_*jan 34

我找到了解决这个问题的方法.我知道这不是方法,但它会一直有效,直到iOS 8将在市场上推出.

崩溃原因:

在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;
}
Run Code Online (Sandbox Code Playgroud)

此外,要清除已存在的图像,请将现有指示器的色调颜色设置为透明:

- (void)awakeFromNib
{   
    self.pageIndicatorTintColor = [UIColor clearColor];
    self.currentPageIndicatorTintColor = [UIColor clearColor];
}
Run Code Online (Sandbox Code Playgroud)

希望这能解决iOS 7的问题.

快乐的编码


Gyp*_*psa 13

试试这个链接: -

使用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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 嘿,我已经为iOS 7崩溃提出了解决方案.请看一看: ) (4认同)

小智 10

只需使用图案图像更改UIPageControl页面指示器颜色 self.pageControl.currentPageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"circle"]];


Dmi*_*try 9

对于夫特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
    }
}
Run Code Online (Sandbox Code Playgroud)

附图:

在此输入图像描述 在此输入图像描述


Fon*_*nix 8

我创建了一个自定义页面控制器,它应该以几乎相同的方式运行,而无需侵入 UIPageControl 的内部结构或为一个小部件拥有一个完整的库。

只需在您的故事板中放置一个空的 UIStackView 并将其自定义类设置为下面的这个类,并像普通的 UIPageControl 一样使用numberOfPages和使用currentPage。在 UIStackView 上设置间距以更改视图之间有多少空间。

斯威夫特 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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

适用于我的目的,但我不做任何保证