РЕДАКТИРОВАТЬ:
Этот ответ получил несколько голосов. Спасибо, но для всех, кто пришел сюда, пожалуйста, поймите, что UIPageControl очень легко реализовать самостоятельно ! Более конкретно, взгляните на мой ответ и пример кода ниже для некоторых идей, но вы действительно не должны использовать его в производственном коде. Бросьте свой собственный подкласс UIControl, если вам нужно изменить внешний вид UIPageControl.
ОРИГИНАЛЬНЫЙ ОТВЕТ:
UIPageControl не делает ничего особенного. Для большинства представлений само представление либо делает все свои рисунки в drawRect: либо добавляет подпредставления, и те рисуют сами. Переопределяя drawRect: и не вызывая [super drawRect:], вы гарантируете, что, если реализация основана на drawRect: -b, у вас будет собственный код для рисования. В случае UIPageControl, он опирается на подпредставления, которые были добавлены в UIPageControl. Вы действительно не должны знать, какого рода, хотя и не должны заботиться. Это реализация Apple, и она может быть изменена.
Но поскольку вы знаете, что это должен быть либо drawRect: либо основанный на подвиде, вы можете просто удалить подпредставления UIPageControl, а затем переопределить drawRect: будет работать так, как вы ожидаете (в основном, вы должны сделайте немного дополнительной работы, чтобы убедиться, что вы перерисовываете в нужное время).
Вот пример, который показывает, как создать свой собственный 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