UIPageControl 自定义类 - 发现 nil 将图像更改为点
Posted
技术标签:
【中文标题】UIPageControl 自定义类 - 发现 nil 将图像更改为点【英文标题】:UIPageControl custom class - found nil changing image to the dots 【发布时间】:2015-01-14 10:53:51 【问题描述】:我需要使用自定义图像而不是普通点来实现 UIPageControl
。所以我创建了一个自定义类并通过故事板连接它。
由于 ios7 UIPageControl 的子视图包含UIView
而不是UIImageView
。结果 UIView
(UIIpageControl
subviews) 的子视图不包含任何子视图,所以我收到错误:
致命错误:在展开可选值时意外发现 nil。
我可能错在哪里?
class WhitePageControl:UIPageControl
let activeImage = UIImage(named: "dot_white")
let inactiveImage = UIImage(named: "dot_white_e")
override init(frame: CGRect)
super.init(frame: frame)
required init(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
func updateDots()
println(self.subviews.count) // 3
println(self.numberOfPages) // 3
for var index = 0; index < self.subviews.count; index++
println(index)
var dot:UIImageView!
var dotView:UIView = self.subviews[index] as UIView
println("1")
for subview in dotView.subviews // NIL HERE
println("2")
if subview.isKindOfClass(UIImageView)
println("3")
dot = subview as UIImageView
if index == self.currentPage dot.image = activeImage
else dot.image = inactiveImage
func setCurrentPage(value:Int)
super.currentPage = value
self.updateDots()
【问题讨论】:
你找到解决办法了吗? 【参考方案1】:这是我的解决方案:
import Foundation
class PageControl: UIPageControl
var activeImage: UIImage!
var inactiveImage: UIImage!
override var currentPage: Int
//willSet
didSet //so updates will take place after page changed
self.updateDots()
convenience init(activeImage: UIImage, inactiveImage: UIImage)
self.init()
self.activeImage = activeImage
self.inactiveImage = inactiveImage
self.pageIndicatorTintColor = UIColor.clearColor()
self.currentPageIndicatorTintColor = UIColor.clearColor()
func updateDots()
for var i = 0; i < count(subviews); i++
var view: UIView = subviews[i] as! UIView
if count(view.subviews) == 0
self.addImageViewOnDotView(view, imageSize: activeImage.size)
var imageView: UIImageView = view.subviews.first as! UIImageView
imageView.image = self.currentPage == i ? activeImage : inactiveImage
// MARK: - Private
func addImageViewOnDotView(view: UIView, imageSize: CGSize)
var frame = view.frame
frame.origin = CGPointZero
frame.size = imageSize
var imageView = UIImageView(frame: frame)
imageView.contentMode = UIViewContentMode.Center
view.addSubview(imageView)
【讨论】:
滚动时 self.currentPage 不正确。我滚动到第 1 页,但 self.currentPage 仍然为 0 在使用 ImageView 和 Label 作为页码的自定义 UIView 进行页面控件时,您有什么建议?这可能吗? 也为我工作...谢谢。我已经修改了它(@IBDesignable),所以我可以在情节提要中使用它。效果很好:-) @JamesLaurenstin 请你在这里分享它(@IBDesignable)【参考方案2】:将 setCurrentPage 更改为 Current Page ,因为这是 Obj C 属性
func currentPage(page: Int)
super.currentPage = page
self.updateDots()
试试这个。
【讨论】:
以上是关于UIPageControl 自定义类 - 发现 nil 将图像更改为点的主要内容,如果未能解决你的问题,请参考以下文章
具有 UIPageControl 性能问题的自定义 UIScrollview