1. 程式人生 > >ios中通過除錯來使用私有api

ios中通過除錯來使用私有api

       iOS不允許使用ios私有api,使用私有api可以獲得意想不到的效果 ,同時使用私有api是一個程式設計師的技術體現之一。至於怎麼通過apple的稽核,其實是有些辦法的,但是不屬於今天討論的範圍。私有api可以通過dump標頭檔案獲得,也可以去github clone一份現成的,但是還是推薦自己去dump。但是我們今天不是討論,如何使用dump到的api,而是通過一個例子來討論如何通過檢視標頭檔案使用私有api。

      我們以UITextfield為例,其實這是個比較簡單的控制元件,有一個藍色輸入的游標,可以在你輸入的時候隱藏或者顯示,但是並沒有給我們提供改變游標顏色的介面,這個時候我們如果要改變游標的顏色,必然要使用私有api(或者通過比較囉嗦的辦法來做這這件事情)。
     我們首先需要dump一包標頭檔案,如何class-dump,不是我們今天討論的要點,現在我們貼上UITextfield的標頭檔案。如果你覺得很長,直接拖到最後面。

/*
 *     Generated by class-dump 3.4 (64 bit).
 *
 *     class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2012 by Steve Nygard.
 */

#import <UIKit/UIControl.h>

#import "NSCoding.h"
#import "UIPopoverControllerDelegate.h"
#import "UITextInput.h"

@class NSArray, NSAttributedString, NSDictionary, NSString, UIButton, UIColor, UIFont, UIImage, UIImageView, UILabel, UITextFieldAtomBackgroundView, UITextFieldBackgroundView, UITextFieldBorderView, UITextFieldLabel, UITextInputTraits, UITextInteractionAssistant, UITextPosition, UITextRange, UIView, _UIBaselineLayoutStrut, _UITextServiceSession;

@interface UITextField : UIControl <UIPopoverControllerDelegate, UITextInput, NSCoding>
{
    NSAttributedString *_text;
    UIColor *_textColor;
    int _borderStyle;
    float _minimumFontSize;
    id _delegate;
    UIImage *_background;
    UIImage *_disabledBackground;
    int _clearButtonMode;
    UIView *_leftView;
    int _leftViewMode;
    UIView *_rightView;
    int _rightViewMode;
    UITextInputTraits *_traits;
    UITextInputTraits *_nonAtomTraits;
    float _fullFontSize;
    float _paddingLeft;
    float _paddingTop;
    float _paddingRight;
    float _paddingBottom;
    NSString *_textFont;
    struct _NSRange _selectionRange;
    int _scrollXOffset;
    int _scrollYOffset;
    float _progress;
    NSString *_style;
    UIButton *_clearButton;
    struct CGSize _clearButtonOffset;
    struct CGSize _leftViewOffset;
    struct CGSize _rightViewOffset;
    UITextFieldBorderView *_backgroundView;
    UITextFieldBorderView *_disabledBackgroundView;
    UITextFieldBackgroundView *_systemBackgroundView;
    UITextFieldLabel *_textLabel;
    UITextFieldLabel *_placeholderLabel;
    UITextFieldLabel *_suffixLabel;
    UITextFieldLabel *_prefixLabel;
    UIImageView *_iconView;
    UILabel *_label;
    float _labelOffset;
    UITextInteractionAssistant *_interactionAssistant;
    UIView *_inputView;
    UIView *_inputAccessoryView;
    UITextFieldAtomBackgroundView *_atomBackgroundView;
    UIColor *_shadowColor;
    struct CGSize _shadowOffset;
    float _shadowBlur;
    struct {
        unsigned int secureTextChanged:1;
        unsigned int guard:1;
        unsigned int delegateRespondsToHandleKeyDown:1;
        unsigned int verticallyCenterText:1;
        unsigned int isAnimating:4;
        unsigned int inactiveHasDimAppearance:1;
        unsigned int becomesFirstResponderOnClearButtonTap:1;
        unsigned int clearsOnBeginEditing:1;
        unsigned int clearsPlaceholderOnBeginEditing:1;
        unsigned int adjustsFontSizeToFitWidth:1;
        unsigned int fieldEditorAttached:1;
        unsigned int canBecomeFirstResponder:1;
        unsigned int shouldSuppressShouldBeginEditing:1;
        unsigned int inResignFirstResponder:1;
        unsigned int undoDisabled:1;
        unsigned int contentsRTL:1;
        unsigned int explicitAlignment:1;
        unsigned int implementsCustomDrawing:1;
        unsigned int needsClearing:1;
        unsigned int suppressContentChangedNotification:1;
        unsigned int allowsEditingTextAttributes:1;
        unsigned int usesAttributedText:1;
        unsigned int backgroundViewState:2;
        unsigned int clearsOnInsertion:1;
    } _textFieldFlags;
    _UITextServiceSession *_definitionSession;
    _UITextServiceSession *_learnSession;
    BOOL _deferringBecomeFirstResponder;
    BOOL _avoidBecomeFirstResponder;
    BOOL _setSelectionRangeAfterFieldEditorIsAttached;
    NSArray *_baselineLayoutConstraints;
    _UIBaselineLayoutStrut *_baselineLayoutLabel;
}

@property(retain) UIView *inputView; // @synthesize inputView=_inputView;
@property(nonatomic) int rightViewMode; // @synthesize rightViewMode=_rightViewMode;
@property(retain, nonatomic) UIView *rightView; // @synthesize rightView=_rightView;
@property(nonatomic) int leftViewMode; // @synthesize leftViewMode=_leftViewMode;
@property(retain, nonatomic) UIView *leftView; // @synthesize leftView=_leftView;
@property(nonatomic) int clearButtonMode; // @synthesize clearButtonMode=_clearButtonMode;
@property(retain, nonatomic) UIImage *disabledBackground; // @synthesize disabledBackground=_disabledBackground;
@property(retain, nonatomic) UIImage *background; // @synthesize background=_background;
@property(nonatomic) id <UITextFieldDelegate> delegate; // @synthesize delegate=_delegate;
@property(nonatomic) float minimumFontSize; // @synthesize minimumFontSize=_minimumFontSize;
@property(nonatomic) int borderStyle; // @synthesize borderStyle=_borderStyle;
@property(retain, nonatomic, setter=_setBaselineLayoutLabel:) _UIBaselineLayoutStrut *_baselineLayoutLabel; // @synthesize _baselineLayoutLabel;
@property(copy, nonatomic, setter=_setBaselineLayoutConstraints:) NSArray *_baselineLayoutConstraints; // @synthesize _baselineLayoutConstraints;
- (void)setSelectionGranularity:(int)arg1;
- (int)selectionGranularity;
- (id)_findWebViewWordBoundaryFromPosition:(id)arg1;
@property(nonatomic) int selectionAffinity;
- (id)characterRangeAtPoint:(struct CGPoint)arg1;
- (id)closestPositionToPoint:(struct CGPoint)arg1 withinRange:(id)arg2;
- (id)closestPositionToPoint:(struct CGPoint)arg1;
- (struct CGRect)caretRectForPosition:(id)arg1;
- (struct CGRect)firstRectForRange:(id)arg1;
- (void)setBaseWritingDirection:(int)arg1 forRange:(id)arg2;
- (int)baseWritingDirectionForPosition:(id)arg1 inDirection:(int)arg2;
- (id)characterRangeByExtendingPosition:(id)arg1 inDirection:(int)arg2;
- (id)positionWithinRange:(id)arg1 farthestInDirection:(int)arg2;
@property(readonly, nonatomic) id <UITextInputTokenizer> tokenizer;
@property(nonatomic) id <UITextInputDelegate> inputDelegate;
- (int)offsetFromPosition:(id)arg1 toPosition:(id)arg2;
- (int)comparePosition:(id)arg1 toPosition:(id)arg2;
- (id)positionFromPosition:(id)arg1 inDirection:(int)arg2 offset:(int)arg3;
- (id)positionFromPosition:(id)arg1 offset:(int)arg2;
- (id)textRangeFromPosition:(id)arg1 toPosition:(id)arg2;
@property(readonly, nonatomic) UITextPosition *endOfDocument;
@property(readonly, nonatomic) UITextPosition *beginningOfDocument;
- (void)unmarkText;
- (void)setMarkedText:(id)arg1 selectedRange:(struct _NSRange)arg2;
@property(copy, nonatomic) NSDictionary *markedTextStyle;
@property(readonly, nonatomic) UITextRange *markedTextRange;
@property(copy) UITextRange *selectedTextRange;
- (void)replaceRange:(id)arg1 withText:(id)arg2;
- (id)textInRange:(id)arg1;
- (BOOL)hasText;
- (id)metadataDictionariesForDictationResults;
- (struct CGRect)frameForDictationResultPlaceholder:(id)arg1;
- (void)removeDictationResultPlaceholder:(id)arg1 willInsertResult:(BOOL)arg2;
- (id)insertDictationResultPlaceholder;
- (void)insertDictationResult:(id)arg1 withCorrectionIdentifier:(id)arg2;
- (void)insertText:(id)arg1;
- (void)deleteBackward;
- (id)_proxyTextInput;
- (BOOL)canPerformAction:(SEL)arg1 withSender:(id)arg2;
- (BOOL)inPopover;
- (void)_promptForReplace:(id)arg1;
- (void)replace:(id)arg1;
- (void)_showTextStyleOptions:(id)arg1;
- (void)toggleUnderline:(id)arg1;
- (void)toggleItalics:(id)arg1;
- (void)toggleBoldface:(id)arg1;
- (void)makeTextWritingDirectionLeftToRight:(id)arg1;
- (void)makeTextWritingDirectionRightToLeft:(id)arg1;
- (void)selectAll:(id)arg1;
- (void)select:(id)arg1;
- (void)paste:(id)arg1;
- (void)_addShortcut:(id)arg1;
- (void)_selectionMayChange:(id)arg1;
- (BOOL)_isDisplayingReferenceLibraryViewController;
- (void)_define:(id)arg1;
- (void)copy:(id)arg1;
- (void)cut:(id)arg1;
- (id)webView;
- (struct CGPoint)constrainedPoint:(struct CGPoint)arg1;
- (unsigned int)offsetInMarkedTextForSelection:(id)arg1;
- (struct CGRect)closestCaretRectInMarkedTextRangeForPoint:(struct CGPoint)arg1;
- (id)selectedAttributedText;
- (id)selectedText;
- (id)selectionRectsForRange:(id)arg1;
- (struct CGRect)_selectionClipRect;
- (id)interactionAssistant;
- (id)selectionView;
- (void)cancelAutoscroll;
- (void)startAutoscroll:(struct CGPoint)arg1;
- (BOOL)hasSelection;
- (id)_fieldEditor;
- (void)endSelectionChange;
- (void)beginSelectionChange;
- (BOOL)isEditable;
- (id)undoManager;
- (int)atomStyle;
- (void)setAtomStyle:(int)arg1;
- (BOOL)drawsAsAtom;
- (void)setDrawsAsAtom:(BOOL)arg1;
- (void)setClearButtonOffset:(struct CGSize)arg1;
- (void)_clearButtonClicked:(id)arg1;
- (BOOL)isUndoEnabled;
- (void)setUndoEnabled:(BOOL)arg1;
- (void)setTextCentersVertically:(BOOL)arg1;
- (void)setTextCentersHorizontally:(BOOL)arg1;
- (void)setLabel:(id)arg1;
- (id)textLabel;
- (void)setLabelOffset:(float)arg1;
- (BOOL)hasMarkedText;
- (void)setProgress:(float)arg1;
- (struct CGRect)iconRect;
- (void)setBecomesFirstResponderOnClearButtonTap:(BOOL)arg1;
- (struct CGSize)clearButtonOffset;
- (void)setIcon:(id)arg1;
- (unsigned int)characterOffsetAtPoint:(struct CGPoint)arg1;
- (void)setSelectionRange:(struct _NSRange)arg1;
- (struct _NSRange)selectionRange;
- (void)clearText;
- (void)layoutTilesNow;
- (void)_resetSelectionUI;
- (void)_clearSelectionUI;
- (void)selectAll;
- (void)setEnabled:(BOOL)arg1;
- (void)_setEnabled:(BOOL)arg1 animated:(BOOL)arg2;
- (void)setInactiveHasDimAppearance:(BOOL)arg1;
- (void)setTextFont:(id)arg1;
- (float)paddingRight;
- (void)setPaddingRight:(float)arg1;
- (float)paddingBottom;
- (void)setPaddingBottom:(float)arg1;
- (float)paddingTop;
- (void)setPaddingTop:(float)arg1;
- (float)paddingLeft;
- (void)setPaddingLeft:(float)arg1;
- (void)setPaddingTop:(float)arg1 paddingLeft:(float)arg2;
- (void)drawBorder:(struct CGRect)arg1;
- (void)drawRect:(struct CGRect)arg1;
- (BOOL)_canDrawContent;
- (BOOL)_implementsCustomDrawing;
- (struct CGRect)editRect;
- (struct CGRect)textRect;
- (struct CGRect)clearButtonRect;
- (void)setClearButtonStyle:(int)arg1;
- (void)setTextAutorresizesToFit:(BOOL)arg1;
- (void)setAutoresizesTextToFit:(BOOL)arg1;
- (id)documentFragmentForPasteboardItemAtIndex:(int)arg1;
- (id)_dictationInterpretations;
- (id)supportedPasteboardTypesForCurrentSelection;
- (BOOL)fieldEditor:(id)arg1 shouldReplaceWithText:(id)arg2;
- (BOOL)fieldEditor:(id)arg1 shouldInsertText:(id)arg2 replacingRange:(struct _NSRange)arg3;
- (void)fieldEditorDidChangeSelection:(id)arg1;
- (struct _NSRange)fieldEditor:(id)arg1 willChangeSelectionFromCharacterRange:(struct _NSRange)arg2 toCharacterRange:(struct _NSRange)arg3;
- (void)selectAllFromFieldEditor:(id)arg1;
- (void)fieldEditorDidChange:(id)arg1;
- (id)customOverlayContainer;
- (void)keyboardInputChangedSelection:(id)arg1;
- (BOOL)keyboardInputChanged:(id)arg1;
- (BOOL)keyboardInputShouldDelete:(id)arg1;
- (BOOL)keyboardInput:(id)arg1 shouldReplaceTextInRange:(struct _NSRange)arg2 replacementText:(id)arg3;
- (BOOL)keyboardInput:(id)arg1 shouldInsertText:(id)arg2 isMarkedText:(BOOL)arg3;
- (void)_applicationResuming:(id)arg1;
- (void)willDetachFieldEditor:(id)arg1;
- (void)attachFieldEditor:(id)arg1;
- (void)willAttachFieldEditor:(id)arg1;
- (void)_drawTextInRect:(struct CGRect)arg1 forLabel:(id)arg2;
- (void)drawPrefixInRect:(struct CGRect)arg1;
- (void)drawSuffixInRect:(struct CGRect)arg1;
- (void)drawPlaceholderInRect:(struct CGRect)arg1;
- (void)drawTextInRect:(struct CGRect)arg1;
- (struct CGRect)rightViewRectForBounds:(struct CGRect)arg1;
- (struct CGRect)leftViewRectForBounds:(struct CGRect)arg1;
- (struct CGRect)_baselineLeftViewRectForBounds:(struct CGRect)arg1;
- (struct CGRect)clearButtonRectForBounds:(struct CGRect)arg1;
- (struct CGRect)editingRectForBounds:(struct CGRect)arg1;
- (struct CGRect)placeholderRectForBounds:(struct CGRect)arg1;
- (struct CGRect)textRectForBounds:(struct CGRect)arg1;
- (struct CGRect)borderRectForBounds:(struct CGRect)arg1;
@property(retain) UIView *inputAccessoryView;
@property(readonly, nonatomic, getter=isEditing) BOOL editing;
- (id)backgroundColor;
- (void)setBackgroundColor:(id)arg1;
@property(copy, nonatomic) NSDictionary *typingAttributes;
@property(nonatomic) BOOL allowsEditingTextAttributes;
@property(nonatomic) BOOL adjustsFontSizeToFitWidth;
- (void)setClearsPlaceholderOnBeginEditing:(BOOL)arg1;
- (BOOL)clearsPlaceholderOnBeginEditing;
@property(nonatomic) BOOL clearsOnBeginEditing;
- (void)_setPrefix:(id)arg1;
- (void)_setSuffix:(id)arg1 withColor:(id)arg2;
@property(copy, nonatomic) NSAttributedString *attributedPlaceholder;
@property(copy, nonatomic) NSString *placeholder;
- (void)createPlaceholderIfNecessary;
- (void)finishedSettingPlaceholder;
- (id)createTextLabelWithTextColor:(id)arg1;
- (void)_createBaselineLayoutLabelIfNecessary;
- (id)createPlaceholderLabelWithFont:(id)arg1 andTextAlignment:(int)arg2;
- (void)setContentVerticalAlignment:(int)arg1;
@property(nonatomic) int textAlignment;
@property(retain, nonatomic) UIFont *font;
- (void)disableClearsOnInsertion;
@property(nonatomic) BOOL clearsOnInsertion;
- (float)shadowBlur;
- (void)setShadowBlur:(float)arg1;
- (struct CGSize)shadowOffset;
- (void)setShadowOffset:(struct CGSize)arg1;
- (id)shadowColor;
- (void)setShadowColor:(id)arg1;
@property(retain, nonatomic) UIColor *textColor;
- (void)_updateTextColor;
@property(copy, nonatomic) NSAttributedString *attributedText;
- (void)_setAttributedText:(id)arg1 onFieldEditorAndSetCaretSelectionAfterText:(BOOL)arg2;
- (void)_transferTextFieldPropertiesFromText:(id)arg1;
- (void)_transferAttribute:(id)arg1 fromString:(id)arg2 andSetPropertyWith:(SEL)arg3 usingValueClass:(Class)arg4;
@property(copy, nonatomic) NSString *text;
- (void)finishedSettingTextOrAttributedText;
- (id)searchText;
- (BOOL)_hasContent;
- (id)_attributedText;
- (id)_text;
@property(nonatomic, getter=isSecureTextEntry) BOOL secureTextEntry; // @dynamic secureTextEntry;
- (void)_updateTextLabel;
- (BOOL)respondsToSelector:(SEL)arg1;
- (id)methodSignatureForSelector:(SEL)arg1;
- (void)forwardInvocation:(id)arg1;
- (id)textInputTraits;
- (BOOL)_shouldSendContentChangedNotificationsIfOnlyMarkedTextChanged;
- (id)_textLabelView;
- (id)_placeholderLabel;
- (id)_placeholderView;
- (id)_placeholderColor;
- (void)_setSystemBackgroundViewActive:(BOOL)arg1;
- (BOOL)_fieldEditorAttached;
- (Class)_systemBackgroundViewClass;
- (void)_setRightViewOffset:(struct CGSize)arg1;
- (struct CGSize)_rightViewOffset;
- (void)_setLeftViewOffset:(struct CGSize)arg1;
- (struct CGSize)_leftViewOffset;
- (struct CGPoint)_scrollOffset;
- (id)actualFont;
- (float)actualMinimumFontSize;
- (struct CGRect)adjustedCaretRectForCaretRect:(struct CGRect)arg1;
- (void)_updateRTLStateForText:(id)arg1 updateAlignment:(BOOL)arg2;
- (void)_setImplicitAlignment;
- (void)_clearBackgroundViews;
- (void)_updateBackgroundViewsAnimated:(BOOL)arg1;
- (BOOL)_shouldEndEditing;
- (void)layoutSubviews;
- (struct CGRect)_prefixFrame;
- (struct CGRect)_suffixFrame;
- (void)updateConstraints;
- (void)_setUpBaselineLayoutConstraints;
- (struct CGRect)_frameForLabel:(id)arg1 inTextRect:(struct CGRect)arg2;
- (void)_updateLabel;
- (struct CGRect)_textRectExcludingButtonsForBounds:(struct CGRect)arg1;
- (struct CGRect)_textRectForBounds:(struct CGRect)arg1 forEditing:(BOOL)arg2;
- (BOOL)_isShowingPrefix;
- (BOOL)_isShowingPlaceholder;
- (BOOL)_showsRightView;
- (BOOL)_showsLeftView;
- (BOOL)_showsClearButtonWhenEmpty;
- (BOOL)_showsClearButton:(BOOL)arg1;
- (BOOL)_showsClearButtonWhenNonEmpty:(BOOL)arg1;
- (void)_updateAtomBackground;
- (BOOL)_showsAtomBackground;
- (BOOL)_partsShouldBeMini;
- (BOOL)_heightShouldBeMini;
- (struct CGRect)_atomBackgroundViewFrame;
- (void)_updateAutosizeStyleIfNeeded;
- (void)_updateButtons;
- (id)_clearButton;
- (id)clearButton;
- (id)_clearButtonImageForState:(unsigned int)arg1;
- (void)_endedEditing;
- (id)_style;
- (id)_createCSSStyleDeclarationForWebView:(id)arg1;
- (float)_marginTop;
- (id)_copyFont:(id)arg1 newSize:(float)arg2 maxSize:(float)arg3;
- (void)setFont:(id)arg1 fullFontSize:(float)arg2;
- (id)hitTest:(struct CGPoint)arg1 withEvent:(id)arg2;
- (void)touchesEnded:(id)arg1 withEvent:(id)arg2;
- (void)touchesCancelled:(id)arg1 withEvent:(id)arg2;
- (void)_resignFirstResponder;
- (void)_windowBecameKey;
- (BOOL)resignFirstResponder;
- (void)_removeShortcutController;
- (void)_removeDefinitionController;
- (void)_becomeFirstResponder;
- (void)_updatePlaceholderPosition;
- (int)_currentTextAlignment;
- (void)__resumeBecomeFirstResponder;
- (void)_becomeFirstResponderAndMakeVisible;
- (BOOL)_requiresKeyboardResetOnReload;
- (id)_keyboardResponder;
- (BOOL)canResignFirstResponder;
- (BOOL)canBecomeFirstResponder;
- (struct CGSize)sizeThatFits:(struct CGSize)arg1;
- (struct CGSize)_intrinsicSizeWithinSize:(struct CGSize)arg1;
- (id)viewForBaselineLayout;
- (struct CGSize)_textSize;
- (struct CGSize)_textSizeUsingFullFontSize:(BOOL)arg1;
- (void)setAnimating:(BOOL)arg1;
- (void)setBounds:(struct CGRect)arg1;
- (void)setFrame:(struct CGRect)arg1;
- (void)_sizeChanged:(BOOL)arg1;
- (void)_setNeedsStyleRecalc;
- (void)_clearStyle;
- (void)dealloc;
- (void)_encodeBackgroundColorWithCoder:(id)arg1;
- (void)encodeWithCoder:(id)arg1;
- (void)_populateArchivedSubviews:(id)arg1;
- (id)initWithCoder:(id)arg1;
- (id)initWithFrame:(struct CGRect)arg1;
- (void)_invalidateBaselineLayoutConstraints;
- (id)_scriptingInfo;
- (void)decodeRestorableStateWithCoder:(id)arg1;
- (void)encodeRestorableStateWithCoder:(id)arg1;
- (BOOL)isElementAccessibilityExposedToInterfaceBuilder;
- (BOOL)isAccessibilityElementByDefault;

// Remaining properties
@property(nonatomic) int autocapitalizationType; // @dynamic autocapitalizationType;
@property(nonatomic) int autocorrectionType; // @dynamic autocorrectionType;
@property(nonatomic) BOOL enablesReturnKeyAutomatically; // @dynamic enablesReturnKeyAutomatically;
@property(nonatomic) int keyboardAppearance; // @dynamic keyboardAppearance;
@property(nonatomic) int keyboardType; // @dynamic keyboardType;
@property(nonatomic) int returnKeyType; // @dynamic returnKeyType;
@property(nonatomic) int spellCheckingType; // @dynamic spellCheckingType;
@property(readonly, nonatomic) UIView *textInputView;

@end

首先我們看它宣告的方法,關於cursor 的函式,或者表示類似顏色設定的函式,一看之下,沒有。這個時候我們注意到有一個函式是 - (id)textInputTraits;

字面意思上是文字輸入特徵的意思,這個很有可能是我們需要的設定游標的顏色,ok,現在我們開始寫程式碼。

省略建立project的步驟,直接上程式碼


我們看到private 下面,有一行是標識color的,很可能這個就是我們找的游標樣色的屬性。同樣我們看一下 UITextfieldTraits的標頭檔案,找到我們需要呼叫的函式。

/*
 *     Generated by class-dump 3.4 (64 bit).
 *
 *     class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2012 by Steve Nygard.
 */

#import "NSObject.h"

#import "NSCopying.h"
#import "UITextInputTraits.h"
#import "UITextInputTraits_Private.h"

@class UIColor, UIImage;

@interface UITextInputTraits : NSObject <UITextInputTraits, UITextInputTraits_Private, NSCopying>
{
    int autocapitalizationType;
    int autocorrectionType;
    int spellCheckingType;
    unsigned int keyboardType:8;
    unsigned int keyboardAppearance:8;
    int returnKeyType;
    BOOL enablesReturnKeyAutomatically;
    BOOL secureTextEntry;
    struct __CFCharacterSet *textTrimmingSet;
    UIColor *insertionPointColor;
    UIColor *selectionBarColor;
    UIColor *selectionHighlightColor;
    UIImage *selectionDragDotImage;
    unsigned int insertionPointWidth;
    int textLoupeVisibility;
    int textSelectionBehavior;
    id textSuggestionDelegate;
    BOOL contentsIsSingleValue;
    BOOL acceptsEmoji;
    BOOL returnKeyGoesToNextResponder;
    BOOL acceptsFloatingKeyboard;
    BOOL acceptsSplitKeyboard;
    BOOL displaySecureTextUsingPlainText;
    BOOL learnsCorrections;
    int emptyContentReturnKeyType;
    int shortcutConversionType;
    BOOL suppressReturnKeyStyling;
    BOOL forceEnableDictation;
    BOOL useInterfaceLanguageForLocalization;
    BOOL deferBecomingResponder;
}

+ (BOOL)keyboardTypeRequiresASCIICapable:(int)arg1;
+ (id)traitsByAdoptingTraits:(id)arg1;
+ (id)defaultTextInputTraits;
@property(nonatomic) BOOL deferBecomingResponder; // @synthesize deferBecomingResponder;
@property(nonatomic) BOOL useInterfaceLanguageForLocalization; // @synthesize useInterfaceLanguageForLocalization;
@property(nonatomic) BOOL forceEnableDictation; // @synthesize forceEnableDictation;
@property(nonatomic) BOOL suppressReturnKeyStyling; // @synthesize suppressReturnKeyStyling;
@property(nonatomic) int shortcutConversionType; // @synthesize shortcutConversionType;
@property(nonatomic) BOOL learnsCorrections; // @synthesize learnsCorrections;
@property(nonatomic) BOOL displaySecureTextUsingPlainText; // @synthesize displaySecureTextUsingPlainText;
@property(nonatomic) BOOL acceptsSplitKeyboard; // @synthesize acceptsSplitKeyboard;
@property(nonatomic) BOOL acceptsFloatingKeyboard; // @synthesize acceptsFloatingKeyboard;
@property(nonatomic) BOOL returnKeyGoesToNextResponder; // @synthesize returnKeyGoesToNextResponder;
@property(nonatomic) int emptyContentReturnKeyType; // @synthesize emptyContentReturnKeyType;
@property(nonatomic) BOOL acceptsEmoji; // @synthesize acceptsEmoji;
@property(nonatomic) BOOL contentsIsSingleValue; // @synthesize contentsIsSingleValue;
@property(nonatomic) int textSelectionBehavior; // @synthesize textSelectionBehavior;
@property(nonatomic) int textLoupeVisibility; // @synthesize textLoupeVisibility;
@property(nonatomic) unsigned int insertionPointWidth; // @synthesize insertionPointWidth;
@property(retain, nonatomic) UIImage *selectionDragDotImage; // @synthesize selectionDragDotImage;
@property(retain, nonatomic) UIColor *selectionHighlightColor; // @synthesize selectionHighlightColor;
@property(retain, nonatomic) UIColor *selectionBarColor; // @synthesize selectionBarColor;
@property(retain, nonatomic) UIColor *insertionPointColor; // @synthesize insertionPointColor;
@property(nonatomic, getter=isSecureTextEntry) BOOL secureTextEntry; // @synthesize secureTextEntry;
@property(nonatomic) BOOL enablesReturnKeyAutomatically; // @synthesize enablesReturnKeyAutomatically;
@property(nonatomic) int returnKeyType; // @synthesize returnKeyType;
@property(nonatomic) int keyboardAppearance; // @synthesize keyboardAppearance;
@property(nonatomic) int keyboardType; // @synthesize keyboardType;
@property(nonatomic) int spellCheckingType; // @synthesize spellCheckingType;
@property(nonatomic) int autocorrectionType; // @synthesize autocorrectionType;
@property(nonatomic) int autocapitalizationType; // @synthesize autocapitalizationType;
- (BOOL)isEqual:(id)arg1;
- (id)description;
- (id)copyWithZone:(struct _NSZone *)arg1;
- (void)takeTraitsFrom:(id)arg1;
- (void)setToDefaultValues;
- (void)dealloc;
- (id)init;
@property(nonatomic) id textSuggestionDelegate; // @dynamic textSuggestionDelegate;
@property(nonatomic) struct __CFCharacterSet *textTrimmingSet; // @dynamic textTrimmingSet;
- (id)dictionaryRepresentation;
- (void)setToSecureValues;

@end

我們找到一個property : insertionPointColor,字面意思上基本上確定這個就是我們要找的設定游標的函式。

經過嘗試果然如此,現在貼上結果


各位看官,這次的關於私有api的分析就結束了,其實整個過程沒這麼順利,只是我省掉了一些,本身這個做法我也沒有用到專案中,而是選擇一個開源的專案,但是對於私有api的熟悉也體現一個程式設計師對於apple這套東西的熟悉,同時我們可以模仿私有的實現,做一些事情,但是不推薦大家直接使用私有api。