我正试图找到一种方法来替换UIPageControl的点,其标题为"Y页面X",因为我可能有> 50项.我只是熟悉Cocoa,我想知道最好的方法是什么.我可以继承UIPageControl吗?我应该使用带标签的自定义视图吗?或者是其他东西?
编辑:
我结束了使用此代码由马特·格尔实现我的页面视图.它也更有效,因为它重新使用两个视图,而不是一次创建所有视图,就像在PageControl的Apple示例代码中所做的那样.
编辑:
这个答案收到了几个赞成票.谢谢你们,但是对于所有来到这里的人们,请注意UIPageControl 很容易实现!更重要的是,请查看我的回复和示例代码以获取一些想法,但您真的不应该在生产代码中使用它.如果需要修改UIPageControl的外观,请滚动自己的UIControl子类.
原始答案:
UIPageControl没有做任何花哨的事情.对于大多数视图,视图本身要么在drawRect中绘制所有绘图,要么添加子视图并自己绘制.通过重写drawRect:而不是调用[super drawRect:],你确保如果实现是drawRect:-based你将拥有自己的绘图代码.对于UIPageControl,它依赖于已添加到UIPageControl的子视图.你真的不需要知道什么样的,你也不应该关心.这是Apple的实施,它可能会发生变化.
但是因为你知道它必须是drawRect:或基于子视图,你可以简单地删除UIPageControl的子视图,然后你的drawRect:override将按照你的期望工作(大多数情况下,你必须做一点一些额外的工作,以确保您在正确的时间重绘).
这是一个示例,说明如何制作自己的自定义UIPageControl.精明的读者会注意到,一旦你遇到麻烦这样做,你可能刚刚创建了自己的页面控件作为UIControl的子类,并简单地实现了UIPageControl API.
// // RedGreyPageControl.m // @interface RedGreyPageControl : UIPageControl { NSArray *originalSubviews; } @end @implementation RedGreyPageControl // This assumes you're creating the control from a nib. Depending on your // usage you might do this step in initWithFrame: - (void) awakeFromNib { // retain original subviews in case apple's implementation // relies on the retain count being maintained by the view's // presence in its superview. originalSubviews = [[NSArray alloc] initWithArray: self.subviews]; for ( UIView *view in self.subviews ) [view removeFromSuperview]; // make sure the view is redrawn not scaled when the device is rotated self.contentMode = UIViewContentModeRedraw; } - (void) dealloc { [originalSubviews release]; [super dealloc]; } - (void) drawRect:(CGRect) iRect { UIImage *grey, *image, *red; int i; CGRect rect; const CGFloat kSpacing = 10.0; iRect = self.bounds; if ( self.opaque ) { [self.backgroundColor set]; UIRectFill( iRect ); } if ( self.hidesForSinglePage && self.numberOfPages == 1 ) return; red = [UIImage imageNamed: @"circle_graphic_red.png"]; grey = [UIImage imageNamed: @"circle_graphic_grey.png"]; rect.size.height = red.size.height; rect.size.width = self.numberOfPages * red.size.width + ( self.numberOfPages - 1 ) * kSpacing; rect.origin.x = floorf( ( iRect.size.width - rect.size.width ) / 2.0 ); rect.origin.y = floorf( ( iRect.size.height - rect.size.height ) / 2.0 ); rect.size.width = red.size.width; for ( i = 0; i < self.numberOfPages; ++i ) { image = i == self.currentPage ? red : grey; [image drawInRect: rect]; rect.origin.x += red.size.width + kSpacing; } } // you must override the setCurrentPage: and setNumberOfPages: // methods to ensure that your control is redrawn when its values change - (void) setCurrentPage:(NSInteger) iPage { [super setCurrentPage: iPage]; [self setNeedsDisplay]; } - (void) setNumberOfPages:(NSInteger) iPages { [super setNumberOfPages: iPages]; [self setNeedsDisplay]; } @end