私はiosプログラミングの新しい学習者です。stackoverflow で別の例とその他の質問を検索しようとしましたが、それは私の目標ではありません。UIPageControl のインデックス 0 に、iPhone の検索ホーム画面と同じようにドットの画像を設定したいと考えています。それを行う方法はありますか?いくつかのコードまたは別の便利なリンクで説明してください。
前もって感謝します
この問題の解決策を見つけました。そうではないことはわかっていますが、iOS 8 が市場に投入されるまでは機能します。
クラッシュの理由:
iOS 7 では [self.subViews objectAtIndex: i] は UIImageView の代わりに UIView を返し、setImage は UIView のプロパティではなく、アプリがクラッシュします。この次のコードを使用して問題を解決します。
サブビューがUIView(iOS7の場合)かUIImageView(iOS6以前の場合)か確認してください。そして、それがUIViewの場合、そのビューのサブビューとしてUIImageViewを追加し、動作してクラッシュしないようにします..!!
-(void) updateDots
{
for (int i = 0; i < [self.subviews count]; i++)
{
UIImageView * dot = [self imageViewForSubview: [self.subviews objectAtIndex: i]];
if (i == self.currentPage) dot.image = activeImage;
else dot.image = inactiveImage;
}
}
- (UIImageView *) imageViewForSubview: (UIView *) view
{
UIImageView * dot = nil;
if ([view isKindOfClass: [UIView class]])
{
for (UIView* subview in view.subviews)
{
if ([subview isKindOfClass:[UIImageView class]])
{
dot = (UIImageView *)subview;
break;
}
}
if (dot == nil)
{
dot = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, view.frame.size.width, view.frame.size.height)];
[view addSubview:dot];
}
}
else
{
dot = (UIImageView *) view;
}
return dot;
}
また、既に存在する画像をクリアするには、既存のインジケーターの色合いを透明に設定します。
- (void)awakeFromNib
{
self.pageIndicatorTintColor = [UIColor clearColor];
self.currentPageIndicatorTintColor = [UIColor clearColor];
}
これで iOS 7 の問題が解決することを願っています。
ハッピーコーディング
このリンクを試してください:-
GrayPageControl で回答:- ページ インジケーターのドットの色を変更する方法はありますか
それは本当に良くて信頼できます。私もこのコードを使用しました。
次のように、さらにカスタマイズする必要があるかもしれません
-(void) updateDots
{
for (int i = 0; i < [self.subviews count]; i++)
{
UIImageView* dot = [self.subviews objectAtIndex:i];
if (i == self.currentPage) {
if(i==0) {
dot.image = [UIImage imageNamed:@"activesearch.png"];
} else {
dot.image = activeImage;
}
} else {
if(i==0) {
dot.image = [UIImage imageNamed:@"inactivesearch.png"];
} else {
dot.image = inactiveImage;
}
}
}
}
UIPageControl ページインジケーターの色をパターン画像で変更するだけですself.pageControl.currentPageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"circle"]];
Swift 3 の最初のアイコンを場所マーカーに置き換えるためのコードの最適なコンパイル:UIPageControl
import UIKit
class LocationPageControl: UIPageControl {
let locationArrow: UIImage = UIImage(named: "locationArrow")!
let pageCircle: UIImage = UIImage(named: "pageCircle")!
override var numberOfPages: Int {
didSet {
updateDots()
}
}
override var currentPage: Int {
didSet {
updateDots()
}
}
override func awakeFromNib() {
super.awakeFromNib()
self.pageIndicatorTintColor = UIColor.clear
self.currentPageIndicatorTintColor = UIColor.clear
self.clipsToBounds = false
}
func updateDots() {
var i = 0
for view in self.subviews {
var imageView = self.imageView(forSubview: view)
if imageView == nil {
if i == 0 {
imageView = UIImageView(image: locationArrow)
} else {
imageView = UIImageView(image: pageCircle)
}
imageView!.center = view.center
view.addSubview(imageView!)
view.clipsToBounds = false
}
if i == self.currentPage {
imageView!.alpha = 1.0
} else {
imageView!.alpha = 0.5
}
i += 1
}
}
fileprivate func imageView(forSubview view: UIView) -> UIImageView? {
var dot: UIImageView?
if let dotImageView = view as? UIImageView {
dot = dotImageView
} else {
for foundView in view.subviews {
if let imageView = foundView as? UIImageView {
dot = imageView
break
}
}
}
return dot
}
}
添付画像:
UIPageControl の内部をハッキングしたり、1 つの小さなウィジェット用のライブラリ全体を使用したりすることなく、ほとんど同じように機能するカスタム ページ コントローラーを作成しました。
空の UIStackView をストーリーボードに配置し、そのカスタム クラスをこのクラスの下に作成し、通常の UIPageControlnumberOfPages
と同じように使用します。currentPage
UIStackView の間隔を設定して、ビュー間のスペースを変更します。
スウィフト 4.2
/**
If adding via storyboard, you should not need to set a width and height constraint for this view,
just set a placeholder for each so autolayout doesnt complain and this view will size itself once its populated with pages at runtime
*/
class PageControl: UIStackView {
@IBInspectable var currentPageImage: UIImage = UIImage(named: "whiteCircleFilled")!
@IBInspectable var pageImage: UIImage = UIImage(named: "whiteCircleOutlined")!
/**
Sets how many page indicators will show
*/
var numberOfPages = 3 {
didSet {
layoutIndicators()
}
}
/**
Sets which page indicator will be highlighted with the **currentPageImage**
*/
var currentPage = 0 {
didSet {
setCurrentPageIndicator()
}
}
override func awakeFromNib() {
super.awakeFromNib()
axis = .horizontal
distribution = .equalSpacing
alignment = .center
layoutIndicators()
}
private func layoutIndicators() {
for i in 0..<numberOfPages {
let imageView: UIImageView
if i < arrangedSubviews.count {
imageView = arrangedSubviews[i] as! UIImageView // reuse subview if possible
} else {
imageView = UIImageView()
addArrangedSubview(imageView)
}
if i == currentPage {
imageView.image = currentPageImage
} else {
imageView.image = pageImage
}
}
// remove excess subviews if any
let subviewCount = arrangedSubviews.count
if numberOfPages < subviewCount {
for _ in numberOfPages..<subviewCount {
arrangedSubviews.last?.removeFromSuperview()
}
}
}
private func setCurrentPageIndicator() {
for i in 0..<arrangedSubviews.count {
let imageView = arrangedSubviews[i] as! UIImageView
if i == currentPage {
imageView.image = currentPageImage
} else {
imageView.image = pageImage
}
}
}
}
私の目的のために動作しますが、私は保証しません
Swift 3.0 の更新 ... 「既存のコントロールのサブビューを変更することは脆弱です」という記載されたリスクを受け入れることに問題がないかどうかはわかります。
import UIKit
class CustomImagePageControl: UIPageControl {
let activeImage:UIImage = UIImage(named: "SelectedPage")!
let inactiveImage:UIImage = UIImage(named: "UnselectedPage")!
override func awakeFromNib() {
super.awakeFromNib()
self.pageIndicatorTintColor = UIColor.clear
self.currentPageIndicatorTintColor = UIColor.clear
self.clipsToBounds = false
}
func updateDots() {
var i = 0
for view in self.subviews {
if let imageView = self.imageForSubview(view) {
if i == self.currentPage {
imageView.image = self.activeImage
} else {
imageView.image = self.inactiveImage
}
i = i + 1
} else {
var dotImage = self.inactiveImage
if i == self.currentPage {
dotImage = self.activeImage
}
view.clipsToBounds = false
view.addSubview(UIImageView(image:dotImage))
i = i + 1
}
}
}
fileprivate func imageForSubview(_ view:UIView) -> UIImageView? {
var dot:UIImageView?
if let dotImageView = view as? UIImageView {
dot = dotImageView
} else {
for foundView in view.subviews {
if let imageView = foundView as? UIImageView {
dot = imageView
break
}
}
}
return dot
}
}
次のようにするだけです。
((UIImageView *)[[yourPageControl subviews] objectAtIndex:0]).image=[UIImage imageNamed:@"search.png"];
これには全体をカスタマイズする必要があると思いますUIPageControl
。以下のリンクで詳細をご覧ください
iOS 14 以降では、次のメソッドを使用してインジケーター イメージを取得および設定できます。
@available(iOS 14.0, *)
open func indicatorImage(forPage page: Int) -> UIImage?
@available(iOS 14.0, *)
open func setIndicatorImage(_ image: UIImage?, forPage page: Int)