मैं UIPageControl के पृष्ठांकन बिंदुओं का रंग कैसे बदल सकता हूं?


178

मैं एक एप्लिकेशन विकसित कर रहा हूं जिसमें मैं या तो रंग बदलना चाहता हूं या UIPageControlपृष्ठांकन डॉट्स की छवि । मैं इसे बदलने में किस तरह सक्षम हूं? क्या UIpageControlउपरोक्त परिदृश्य पर कस्टमाइज़ करना संभव है?

जवाबों:


266

अपडेट करें:

यह उत्तर 6 साल पुराना है और बहुत पुराना है, लेकिन यह अभी भी वोट और टिप्पणियों को आकर्षित कर रहा है। जब से iOS 6.0 आप पर pageIndicatorTintColorऔर currentPageIndicatorTintColorगुणों का उपयोग किया जाना चाहिए UIPageControl

मूल ANSWER:

मैं आज इस समस्या में भाग गया और अपने स्वयं के साधारण प्रतिस्थापन वर्ग को लिखने का फैसला किया।

यह एक उपश्रेणी उविवि है जो आपके द्वारा निर्दिष्ट रंगों में डॉट्स को प्रस्तुत करने के लिए कोर ग्राफिक्स का उपयोग करता है।

आप इसे अनुकूलित और नियंत्रित करने के लिए उजागर गुणों का उपयोग करते हैं।

यदि आप चाहते हैं कि उपयोगकर्ता एक छोटे पृष्ठ बिंदुओं पर टैप करने पर सूचनाएं प्राप्त करने के लिए एक प्रतिनिधि ऑब्जेक्ट पंजीकृत कर सकें। यदि कोई प्रतिनिधि पंजीकृत नहीं है, तो दृश्य स्पर्श इनपुट पर प्रतिक्रिया नहीं करेगा।

यह ओवन से पूरी तरह से ताजा है, लेकिन काम करने लगता है। यदि आप इसके साथ किसी भी समस्या में भाग लेते हैं तो मुझे बताएं।

भविष्य में सुधार:

  • यदि बहुत अधिक हैं तो वर्तमान सीमा को फिट करने के लिए डॉट्स का आकार बदलें।
  • ड्राअर में संपूर्ण दृश्य को फिर से न करें:

उदाहरण का उपयोग करें:

CGRect f = CGRectMake(0, 0, 320, 20); 
PageControl *pageControl = [[[PageControl alloc] initWithFrame:f] autorelease];
pageControl.numberOfPages = 10;
pageControl.currentPage = 5;
pageControl.delegate = self;
[self addSubview:pageControl];

शीर्ष लेख फ़ाइल:

//
//  PageControl.h
//
//  Replacement for UIPageControl because that one only supports white dots.
//
//  Created by Morten Heiberg <morten@heiberg.net> on November 1, 2010.
//

#import <UIKit/UIKit.h>

@protocol PageControlDelegate;

@interface PageControl : UIView 
{
@private
    NSInteger _currentPage;
    NSInteger _numberOfPages;
    UIColor *dotColorCurrentPage;
    UIColor *dotColorOtherPage;
    NSObject<PageControlDelegate> *delegate;
    //If ARC use __unsafe_unretained id delegate;
}

// Set these to control the PageControl.
@property (nonatomic) NSInteger currentPage;
@property (nonatomic) NSInteger numberOfPages;

// Customize these as well as the backgroundColor property.
@property (nonatomic, retain) UIColor *dotColorCurrentPage;
@property (nonatomic, retain) UIColor *dotColorOtherPage;

// Optional delegate for callbacks when user taps a page dot.
@property (nonatomic, retain) NSObject<PageControlDelegate> *delegate;

@end

@protocol PageControlDelegate<NSObject>
@optional
- (void)pageControlPageDidChange:(PageControl *)pageControl;
@end

कार्यान्वयन फ़ाइल:

//
//  PageControl.m
//
//  Replacement for UIPageControl because that one only supports white dots.
//
//  Created by Morten Heiberg <morten@heiberg.net> on November 1, 2010.
//

#import "PageControl.h"

// Tweak these or make them dynamic.
#define kDotDiameter 7.0
#define kDotSpacer 7.0

@implementation PageControl

@synthesize dotColorCurrentPage;
@synthesize dotColorOtherPage;
@synthesize delegate;

- (NSInteger)currentPage
{
    return _currentPage;
}

- (void)setCurrentPage:(NSInteger)page
{
    _currentPage = MIN(MAX(0, page), _numberOfPages-1);
    [self setNeedsDisplay];
}

- (NSInteger)numberOfPages
{
    return _numberOfPages;
}

- (void)setNumberOfPages:(NSInteger)pages
{
    _numberOfPages = MAX(0, pages);
    _currentPage = MIN(MAX(0, _currentPage), _numberOfPages-1);
    [self setNeedsDisplay];
}

    - (id)initWithFrame:(CGRect)frame
{
    if ((self = [super initWithFrame:frame]))
    {
        // Default colors.
        self.backgroundColor = [UIColor clearColor];
        self.dotColorCurrentPage = [UIColor blackColor];
        self.dotColorOtherPage = [UIColor lightGrayColor];

        UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedRight:)];
        [swipeRight setDirection:UISwipeGestureRecognizerDirectionRight];
        [self addGestureRecognizer:swipeRight];




        UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedLeft:)];
        [swipe setDirection:UISwipeGestureRecognizerDirectionLeft];
        [self addGestureRecognizer:swipe];

    }
    return self;
}
-(void) swipedLeft:(UISwipeGestureRecognizer *) recognizer
{
    self.currentPage++;
}
-(void) swipedRight:(UISwipeGestureRecognizer *) recognizer
{
    self.currentPage--;
}

- (void)drawRect:(CGRect)rect 
{
    CGContextRef context = UIGraphicsGetCurrentContext();   
    CGContextSetAllowsAntialiasing(context, true);

    CGRect currentBounds = self.bounds;
    CGFloat dotsWidth = self.numberOfPages*kDotDiameter + MAX(0, self.numberOfPages-1)*kDotSpacer;
    CGFloat x = CGRectGetMidX(currentBounds)-dotsWidth/2;
    CGFloat y = CGRectGetMidY(currentBounds)-kDotDiameter/2;
    for (int i=0; i<_numberOfPages; i++)
    {
        CGRect circleRect = CGRectMake(x, y, kDotDiameter, kDotDiameter);
        if (i == _currentPage)
        {
            CGContextSetFillColorWithColor(context, self.dotColorCurrentPage.CGColor);
        }
        else
        {
            CGContextSetFillColorWithColor(context, self.dotColorOtherPage.CGColor);
        }
        CGContextFillEllipseInRect(context, circleRect);
        x += kDotDiameter + kDotSpacer;
    }
}

- (void)dealloc 
{
    [dotColorCurrentPage release];
    [dotColorOtherPage release];
    [delegate release];
    [super dealloc];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!self.delegate) return;

    CGPoint touchPoint = [[[event touchesForView:self] anyObject] locationInView:self];

    CGFloat dotSpanX = self.numberOfPages*(kDotDiameter + kDotSpacer);
    CGFloat dotSpanY = kDotDiameter + kDotSpacer;

    CGRect currentBounds = self.bounds;
    CGFloat x = touchPoint.x + dotSpanX/2 - CGRectGetMidX(currentBounds);
    CGFloat y = touchPoint.y + dotSpanY/2 - CGRectGetMidY(currentBounds);

    if ((x<0) || (x>dotSpanX) || (y<0) || (y>dotSpanY)) return;

    self.currentPage = floor(x/(kDotDiameter+kDotSpacer));
    if ([self.delegate respondsToSelector:@selector(pageControlPageDidChange:)])
    {
        [self.delegate pageControlPageDidChange:self];
    }
}

@end

यह कैसे काम करता है? मैं pagecontrolPageDidChange विधि का उपयोग कर रहा हूं और मुझे कुछ भी नहीं मिल रहा है। मैं किसी भी बटन पर क्लिक नहीं कर सकता
एडम

HI हाइबरग, मैंने स्क्रोलव्यू के मेरे पेज को बदलने के लिए इसका उपयोग किया, आप इसे अपने कोड से कैसे करते हैं? [pageControl1 addTarget: self action: @selector (changePage :) forControlEvents: UIControlEventValueChanged];
डेसमंड

// UIPageControl - (शून्य) परिवर्तन पृष्ठ पर पेज बदलने की कार्रवाई: (UIPageControl *) नियंत्रण {// int पेज = pageControl.currentPage; int पेज = pageControl.currentPage; // स्क्रॉल दृश्य को उपयुक्त पृष्ठ CGRect फ्रेम = स्क्रॉलव्यू.फ्रेम में अपडेट करें; फ़्रेम .origin.x = फ्रेम.साइज़। उपलब्धता * पृष्ठ; फ्रेम.कोरिन.य = ०; [स्क्रोलव्यू स्क्रॉलट्रैक्टट्विविज़ुअल: फ्रेम एनिमेटेड: यस]; pageControlUsed = YES; }
डेसमंड

एआरसी के साथ इस कोड को चलाने के लिए, आपको बस डीलॉक विधि को हटाने की आवश्यकता होगी, कमजोर को असाइन करें और संबंधित संपत्ति घोषणा से पहले __weak जोड़ें। बहुत अच्छा। बहुत बहुत धन्यवाद।
cschuff

NSObject को बदलें <PageControlDelegate> * प्रतिनिधि __unsafe_unretain id प्रतिनिधि के साथ; हेडर में ARC चेतावनी को हल करने के लिए
मिहिर मेहता

150

IOS 6 में आप टिंट कलर सेट कर सकते हैं UIPageControl :

2 नए गुण हैं:

  • pageIndicatorTintColor
  • currentPageIndicatorTintColor

आप सभी पृष्ठ संकेतकों के रंग को बदलने के लिए उपस्थिति API का उपयोग कर सकते हैं।

यदि आप iOS 5 को लक्षित कर रहे हैं तो सुनिश्चित करें कि यह दुर्घटनाग्रस्त न हो:

if ([pageControl respondsToSelector:@selector(setPageIndicatorTintColor:)]) {
    pageControl.pageIndicatorTintColor = [UIColor whiteColor];
}

IOS 5 का क्या? आप यह कैसे सुनिश्चित करते हैं कि यह दुर्घटना नहीं है?
jjxtra

41
pageControl.pageIndicatorTintColor = [UIColor redColor];
pageControl.currentPageIndicatorTintColor = [UIColor redColor];

iOS6 के लिए काम करता है


2
मुझे लगता है कि मैं UIPageControl उपवर्ग की जरूरत जा रहा था bummed था। यह चाल चली। यह स्थिति # 1 पर होनी चाहिए।
फॉरेस्ट

ऐसा जटिल उत्तर शीर्ष मतदान वाले को क्यों दिया जाता है जब यह शाब्दिक रूप से आपकी आवश्यकता है?
टेलरएलेड

23

यदि कोई इसके बारे में एआरसी / आधुनिक संस्करण चाहता है (आइवर के रूप में संपत्तियों को फिर से परिभाषित करने की कोई आवश्यकता नहीं है, कोई सौदा नहीं है, और इंटरफ़ेस बिल्डर के साथ काम करता है):

#import <UIKit/UIKit.h>

@protocol PageControlDelegate;

@interface PageControl : UIView 

// Set these to control the PageControl.
@property (nonatomic) NSInteger currentPage;
@property (nonatomic) NSInteger numberOfPages;

// Customize these as well as the backgroundColor property.
@property (nonatomic, strong) UIColor *dotColorCurrentPage;
@property (nonatomic, strong) UIColor *dotColorOtherPage;

// Optional delegate for callbacks when user taps a page dot.
@property (nonatomic, weak) NSObject<PageControlDelegate> *delegate;

@end

@protocol PageControlDelegate<NSObject>
@optional
- (void)pageControlPageDidChange:(PageControl *)pageControl;
@end

PageControl.m:

#import "PageControl.h"


// Tweak these or make them dynamic.
#define kDotDiameter 7.0
#define kDotSpacer 7.0

@implementation PageControl

@synthesize dotColorCurrentPage;
@synthesize dotColorOtherPage;
@synthesize currentPage;
@synthesize numberOfPages;
@synthesize delegate;

- (void)setCurrentPage:(NSInteger)page
{
    currentPage = MIN(MAX(0, page), self.numberOfPages-1);
    [self setNeedsDisplay];
}

- (void)setNumberOfPages:(NSInteger)pages
{
    numberOfPages = MAX(0, pages);
    currentPage = MIN(MAX(0, self.currentPage), numberOfPages-1);
    [self setNeedsDisplay];
}

- (id)initWithFrame:(CGRect)frame 
{
    if (self = [super initWithFrame:frame]) 
    {
        // Default colors.
        self.backgroundColor = [UIColor clearColor];
        self.dotColorCurrentPage = [UIColor blackColor];
        self.dotColorOtherPage = [UIColor lightGrayColor];
    }
    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder])
    {
        self.dotColorCurrentPage = [UIColor blackColor];
        self.dotColorOtherPage = [UIColor lightGrayColor];
    }
    return self;
}

- (void)drawRect:(CGRect)rect 
{
    CGContextRef context = UIGraphicsGetCurrentContext();   
    CGContextSetAllowsAntialiasing(context, true);

    CGRect currentBounds = self.bounds;
    CGFloat dotsWidth = self.numberOfPages*kDotDiameter + MAX(0, self.numberOfPages-1)*kDotSpacer;
    CGFloat x = CGRectGetMidX(currentBounds)-dotsWidth/2;
    CGFloat y = CGRectGetMidY(currentBounds)-kDotDiameter/2;
    for (int i=0; i<self.numberOfPages; i++)
    {
        CGRect circleRect = CGRectMake(x, y, kDotDiameter, kDotDiameter);
        if (i == self.currentPage)
        {
            CGContextSetFillColorWithColor(context, self.dotColorCurrentPage.CGColor);
        }
        else
        {
            CGContextSetFillColorWithColor(context, self.dotColorOtherPage.CGColor);
        }
        CGContextFillEllipseInRect(context, circleRect);
        x += kDotDiameter + kDotSpacer;
    }
}


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!self.delegate) return;

    CGPoint touchPoint = [[[event touchesForView:self] anyObject] locationInView:self];

    CGFloat dotSpanX = self.numberOfPages*(kDotDiameter + kDotSpacer);
    CGFloat dotSpanY = kDotDiameter + kDotSpacer;

    CGRect currentBounds = self.bounds;
    CGFloat x = touchPoint.x + dotSpanX/2 - CGRectGetMidX(currentBounds);
    CGFloat y = touchPoint.y + dotSpanY/2 - CGRectGetMidY(currentBounds);

    if ((x<0) || (x>dotSpanX) || (y<0) || (y>dotSpanY)) return;

    self.currentPage = floor(x/(kDotDiameter+kDotSpacer));
    if ([self.delegate respondsToSelector:@selector(pageControlPageDidChange:)])
    {
        [self.delegate pageControlPageDidChange:self];
    }
}

@end

1
यदि पृष्ठ संख्या वास्तव में एक स्पर्श के बाद नहीं बदली तो प्रतिनिधि को भेजने के लिए इसे रोकने के लिए एक मामूली जोड़। NSInteger newPage = फर्श (x / (kDotDiameter + kDotSpacer)); अगर (self.currentPage == newPage) वापसी;
TheLastNightTrain

15

हाइबरग द्वारा प्रदान किया गया उत्तर वास्तव में अच्छी तरह से काम करता है, हालांकि पृष्ठ नियंत्रण सेब के समान व्यवहार नहीं करता है।

यदि आप चाहते हैं कि पृष्ठ नियंत्रण ऐप्पल की तरह व्यवहार करे (हमेशा वर्तमान पृष्ठ को एक से बढ़ाए, यदि आप दूसरी छमाही को छूते हैं, तो अन्यथा एक की कमी करें), इस टचबेजन-विधि को इसके बजाय आज़माएं:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    CGPoint touchPoint = [[[event touchesForView:self] anyObject] locationInView:self];

    CGRect currentBounds = self.bounds;
    CGFloat x = touchPoint.x - CGRectGetMidX(currentBounds);

    if(x<0 && self.currentPage>=0){
        self.currentPage--;
        [self.delegate pageControlPageDidChange:self]; 
    }
    else if(x>0 && self.currentPage<self.numberOfPages-1){
        self.currentPage++;
        [self.delegate pageControlPageDidChange:self]; 
    }   
}

8

AppDelegate में DidFinishLauch में निम्न कोड जोड़ें,

UIPageControl *pageControl = [UIPageControl appearance];
pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
pageControl.backgroundColor = [UIColor whiteColor];

आशा है कि यह मदद करेगा।


6

कोडिंग के लिए इसका उपयोग करें

if ([pageControl respondsToSelector:@selector(setPageIndicatorTintColor:)]) {
    pageControl.pageIndicatorTintColor = [UIColor whiteColor];
}

या स्टोरीबोर्ड से आप वर्तमान पृष्ठ टिंट से बदल सकते हैं

यहां छवि विवरण दर्ज करें


धन्यवाद ... शेयर करते रहिये :)
तीर्थ ० '

6

स्विफ्ट में, UIPageViewController के अंदर इस कोड को पेज इंडिकेटर का संदर्भ मिल रहा है और इसके गुणों को सेट करना है

override func viewDidLoad() {
    super.viewDidLoad()

    //Creating the proxy
    let pageControl = UIPageControl.appearance()
    //Customizing
    pageControl.pageIndicatorTintColor = UIColor.lightGrayColor()
    pageControl.currentPageIndicatorTintColor = UIColor.darkGrayColor()
    //Setting the background of the view controller so the dots wont be on a black background   
    self.view.backgroundColor = UIColor.whiteColor()
}

UIPageControlके रूप में ही नहीं हैUIPageViewController
जुंगलेव


4

स्विफ्ट 1.2 के साथ यह आसान है:

UIPageControl.appearance().pageIndicatorTintColor           = UIColor.lightGrayColor()
UIPageControl.appearance().currentPageIndicatorTintColor    = UIColor.redColor()

3
यह इसे विश्व स्तर पर स्थापित करता है। यदि आपके ऐप में कई UIPageControls हैं और आपको कक्षा के आधार पर अलग-अलग रंगों की आवश्यकता है, तो UIPageControl.appearanceWhenContainedInInstancesOfClasses([MyClassName.self])इसके बजाय उपयोग करें UIPageControl.appearance()। IOS 9. की आवश्यकता है
जॉन

4

आप अपनी विधि में अपने appdelegate.m फ़ाइल में निम्न कोड जोड़कर इसे आसानी से ठीक कर सकते हैं didFinishLaunchingWithOptions:

UIPageControl *pageControl = [UIPageControl appearance];
pageControl.pageIndicatorTintColor = [UIColor darkGrayColor];
pageControl.currentPageIndicatorTintColor = [UIColor orangeColor];
pageControl.backgroundColor = [UIColor whiteColor]

3

यह मेरे लिए iOS 7 में काम किया है।

pageControl.pageIndicatorTintColor = [UIColor purpleColor];
pageControl.currentPageIndicatorTintColor = [UIColor magentaColor];

2

एक आधिकारिक दृष्टिकोण से iPhone एसडीके का उपयोग करना संभव नहीं है। आप इसे निजी तरीकों का उपयोग करने में सक्षम हो सकते हैं, लेकिन यह ऐप स्टोर पर प्राप्त होने में बाधा होगी।

केवल दूसरा सुरक्षित उपाय है कि आप स्वयं पृष्ठ नियंत्रण बनायें, जो कि श्पुल्दन्त को भी कठिन लगता है, क्योंकि पृष्ठ नियंत्रण केवल यह प्रदर्शित करता है कि पृष्ठ वर्तमान में स्क्रॉल दृश्य में क्या दिखाया गया है।


Theere मेरे समाधान के लिए एक कड़ी नहीं है। मेरी टिप्पणी के ऊपर पाठ में मेरा समाधान है। या तो निजी तरीकों की तलाश करें (मुझे नहीं पता होगा कि ये क्या हैं) या अपना खुद का लिखें (मैं आपके लिए ऐसा नहीं करने जा रहा हूं)।
जसारीन

2

@Jasarien मुझे लगता है कि आप UIPageControll को subclass कर सकते हैं, Apple doc से ली गई लाइन "Subclasses जो पेज कंट्रोल की उपस्थिति को कस्टमाइज़ करती है, पेज साइज़ को बदलने के लिए पेज कंट्रोल को रीसाइज़ करने के लिए इस विधि का उपयोग कर सकती है" Method size के लिए "ForNumberOfPages:


2

आप थ्री20 लाइब्रेरी का भी उपयोग कर सकते हैं जिसमें एक शैलीगत पेजकंट्रोल और दर्जनों अन्य सहायक यूआई नियंत्रण और अंश शामिल हैं।


2

Swift 2.0नीचे और ऊपर के आवरण में , निम्न कोड काम करेगा:

pageControl.pageIndicatorTintColor = UIColor.whiteColor()
pageControl.currentPageIndicatorTintColor = UIColor.redColor()

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.