আমি কীভাবে ইউআইপেজকন্ট্রোলের পৃষ্ঠাগুলি বিন্দুর রঙ পরিবর্তন করতে পারি?


178

আমি একটি অ্যাপ্লিকেশন বিকাশ করছি যেখানে আমি UIPageControlপৃষ্ঠা বাছাই বিন্দুর রঙ বা চিত্র পরিবর্তন করতে চাই । আমি কীভাবে এটি পরিবর্তন করতে পারি? UIpageControlউপরের দৃশ্যে কাস্টমাইজ করা কি সম্ভব ?

উত্তর:


266

হালনাগাদ:

এই উত্তরটি 6 বছরের পুরানো এবং খুব পুরানো, তবে এটি এখনও ভোট এবং মন্তব্যগুলিকে আকর্ষণ করে। আইওএস .0.০ এর পর থেকে আপনার সম্পত্তি pageIndicatorTintColorএবং currentPageIndicatorTintColorবৈশিষ্ট্যগুলি ব্যবহার করা উচিত UIPageControl

মূল উত্তর:

আমি আজ এই সমস্যায় পড়েছি এবং আমার নিজস্ব প্রতিস্থাপনের ক্লাসটি লেখার সিদ্ধান্ত নিয়েছি।

এটি একটি সাবলেসড ইউআইভিউ যা আপনার নির্দিষ্ট রঙগুলিতে বিন্দুগুলি রেন্ডার জন্য কোর গ্রাফিক্স ব্যবহার করে।

আপনি প্রকাশিত বৈশিষ্ট্যগুলি এটি কাস্টমাইজ এবং নিয়ন্ত্রণ করতে ব্যবহার করেন।

আপনি যদি চান, ব্যবহারকারী যখন ছোট পৃষ্ঠার বিন্দুগুলির একটিতে ট্যাপ করেন তবে বিজ্ঞপ্তিগুলি পেতে একটি প্রতিনিধি অবজেক্টটি নিবন্ধভুক্ত করতে পারেন। যদি কোনও প্রতিনিধি নিবন্ধিত না হয় তবে ভিউ টাচ ইনপুটটিতে প্রতিক্রিয়া জানাবে না।

এটি চুলা থেকে সম্পূর্ণ তাজা, তবে কাজ করে বলে মনে হচ্ছে। আপনি যদি এটির সাথে কোনও সমস্যায় পড়ে থাকেন তবে আমাকে জানান।

ভবিষ্যতের উন্নতি:

  • যদি খুব বেশি পরিমাণ থাকে তবে বর্তমান গণ্ডিতে ফিট করতে বিন্দুর আকার পরিবর্তন করুন।
  • অঙ্কনরেখায় সম্পূর্ণ দৃশ্যটি পুনরায় আঁকবেন না:

উদাহরণ ব্যবহার:

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

তাহলে এটা কিভাবে কাজ করে? আমি পেজকন্ট্রোলপেজডড চেঞ্জ পদ্ধতিটি ব্যবহার করছি এবং আমি কিছুই পাচ্ছি না। আমি কোনও বোতামে ক্লিক করতে পারি না
অ্যাডাম

এইচআই হেইবার্গ, আমি আমার স্ক্রোলভিউয়ের পৃষ্ঠাটি পরিবর্তন করতে এটি ব্যবহার করেছি, আপনি কীভাবে এটি আপনার কোড থেকে করেন? [পেজকন্ট্রোল 1 অ্যাডগারেট: স্ব-ক্রিয়া: @ নির্বাচক (চেঞ্জপেজ :) জন্য নিয়ন্ত্রণকারীর জন্য: ইউআইসিএন্ট্রোলভেন্টভ্যালুচেন্জড];
ডেসমন্ড

// ইউআইপেজকন্ট্রোল-এ পৃষ্ঠা পরিবর্তনের জন্য পদক্ষেপ - (অকার্যকর) পরিবর্তনপেজ: (ইউআইপিএজকন্ট্রোল *) নিয়ন্ত্রণ করুন int // ইন্ট পেজ = পৃষ্ঠাকন্ট্রোল.কালিনপেজ; ইন্ট পেজ = পেজকন্ট্রোল.কমেরপেজ; // উপযুক্ত পৃষ্ঠায় স্ক্রোল ভিউ আপডেট করুন সিজিআরেক্ট ফ্রেম = স্ক্রলভিউ.ফ্রেমে; फ्रेम.origin.x = ফ্রেম.সাইজ.উইথ * পৃষ্ঠা; ফ্রেম.রিগিন.ই = 0; [স্ক্রোলভিউ স্ক্রোলরেক্টটওভিজিবল: ফ্রেম অ্যানিমেটেড: হ্যাঁ]; pageControlUsed = হ্যাঁ; }
ডেসমন্ড

এআরসি দিয়ে এই কোডটি চালানোর জন্য আপনাকে কেবল ডেলোক পদ্ধতিটি মুছে ফেলতে হবে, দুর্বলকে নির্ধারিত পরিবর্তনটি পরিবর্তন করতে হবে এবং সম্পর্কিত সম্পত্তি ঘোষণার আগে একটি __weak যুক্ত করতে হবে। খুব সুন্দর. অনেক ধন্যবাদ.
cschuff

এনএসবজেক্ট <পেজকন্ট্রোলডেলিগেট> * প্রতিনিধি __unsafe_unretained id প্রতিনিধি সহ প্রতিস্থাপন করুন; এআরসি সতর্কতা সমাধানের শিরোনামে
মিহির মেহতা

150

আইওএস 6 এ আপনি এর রঙিন রঙটি সেট করতে পারেন UIPageControl:

2 টি নতুন বৈশিষ্ট্য রয়েছে:

  • pageIndicatorTintColor
  • currentPageIndicatorTintColor

আপনি সমস্ত পৃষ্ঠার সূচকের রঙিন রঙ পরিবর্তন করতে উপস্থিতি API ব্যবহার করতে পারেন।

আপনি যদি আইওএস 5 কে টার্গেট করে থাকেন তবে নিশ্চিত হয়ে নিন যে এটি ক্রাশ হয় না:

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

আইওএস 5 নিয়ে কী হবে? আপনি কীভাবে নিশ্চিত হন যে এটি ক্রাশ হয় না?
jjxtra

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

iOS6 এর জন্য কাজ করে


2
আমাকে ধমক দেওয়া হয়েছিল যে আমার ইউআইপেজকন্ট্রোল সাবক্লাস করা দরকার। এই কৌশলটি। এটি # 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

পেজকন্ট্রোল.এম:

#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
পৃষ্ঠার নম্বরটি যদি কোনও স্পর্শের পরে পরিবর্তিত না হয় তবে প্রতিনিধিটির কাছে এটি পাঠানো বন্ধ করার জন্য একটি ছোটখাটো সংযোজন। এনএসআইন্টেজার নতুন পৃষ্ঠা = তল (এক্স / (কেডটডাইমেনস + কেডটস্পেসার)); যদি (স্বতঃকালীনপেজ == নতুন পৃষ্ঠা) ফিরে আসে;
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

অ্যাপডেলিগেটে ডিডফিনিশ লাউচে নিম্নলিখিত কোডটি যুক্ত করুন,

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

সুইফটে, ইউআইপেজভিউ কনট্রোলারের ভিতরে এই কোডটি পৃষ্ঠা সূচকটির একটি রেফারেন্স পেয়েছে এবং এর বৈশিষ্ট্যগুলি সেট করছে setting

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()
}

UIPageControlUIPageViewController
জঙ্গলদেব


4

এটি সুইফট 1.2 এর সাথে সহজ:

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

3
এটি বিশ্বব্যাপী সেট করে। আপনার অ্যাপে যদি একাধিক ইউআইপেজকন্ট্রোল থাকে এবং শ্রেণীর উপর ভিত্তি করে আপনার বিভিন্ন বর্ণের প্রয়োজন হয় তবে UIPageControl.appearanceWhenContainedInInstancesOfClasses([MyClassName.self])পরিবর্তে ব্যবহার করুন UIPageControl.appearance()। আইওএসের প্রয়োজন 9.
জন

4

আপনার পদ্ধতিতে আপনার appdelegate.m ফাইলে নিম্নলিখিত কোড যুক্ত করে আপনি সহজেই এটি ঠিক করতে পারেন didFinishLaunchingWithOptions:

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

3

এটি আইওএস 7 এ আমার জন্য কাজ করা হয়েছে।

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

2

অফিসিয়াল দৃষ্টিকোণ থেকে আইফোন এসডিকে ব্যবহার করা সম্ভব নয়। আপনি ব্যক্তিগত পদ্ধতিগুলি ব্যবহার করে এটি করতে সক্ষম হতে পারেন তবে এটি অ্যাপ স্টোরে উঠতে বাধা হয়ে দাঁড়াবে।

কেবলমাত্র অন্য একটি নিরাপদ সমাধান হল নিজের পৃষ্ঠা নিয়ন্ত্রণ তৈরি করা যা shpuldnt খুব কঠিন হতে পারে যে পৃষ্ঠার নিয়ন্ত্রণটি কেবল বর্তমানে কোন পৃষ্ঠাটি একটি স্ক্রোল দৃশ্যে প্রদর্শিত হচ্ছে তা প্রদর্শন করে।


আমার সমাধানের লিংক নয়। আমার সমাধানটি আপনার মন্তব্যের ঠিক উপরে লেখাটিতে রয়েছে। হয় ব্যক্তিগত পদ্ধতিগুলি অনুসন্ধান করুন (আমি এগুলি কী তা জানতে পারি না) বা আপনার নিজের লিখুন (আমি এটি আপনার জন্য করব না)।
জাসারিন

2

@ জাসারিয়েন আমি মনে করি আপনি কেবল ইউইপেজকন্ট্রোল উপক্লাস করতে পারেন, কেবল আপেল ডক থেকে লাইনটি বেছে নেওয়া হয়েছে "পৃষ্ঠা নিয়ন্ত্রণের চেহারাটি কাস্টমাইজ করে এমন সাবক্লাসগুলি যখন পৃষ্ঠার গণনা পরিবর্তিত হয়" পদ্ধতির আকারের জন্য নম্বরের অফফেজ:


2

আপনি থ্রি 20 লাইব্রেরিও ব্যবহার করতে পারেন যাতে স্টাইলযোগ্য পেজকন্ট্রোল এবং কয়েক ডজন অন্যান্য সহায়ক ইউআই নিয়ন্ত্রণ এবং বিমূর্ততা রয়েছে।


2

এর cased সালে Swift 2.0এবং তার উচ্চ, কোড নিচে কাজ করবে:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.