2016-02-01 52 views
2

我最近已交給一個私人硬件SDK集成到我公司的移動應用程序。除非他們使用UIAlertView作爲某種不透明方法調用的結果,否則一切都很好,我的設計團隊想要將其品牌化。我無法訪問SDK的源代碼。有沒有一種方法可以安全地調整UIAlertView以保留所有功能並簡單修改UIAlertView的外觀,使其更符合應用程序外觀的品牌/一致性?如果是這樣,我會重載drawRect或其他東西,我怎麼會找出UIAlertView中的標籤名稱,以便我可以繪製他們的尺寸,形狀和顏色,我想要的?更改UIAlertView與swizzling

爲了增加詳細信息,該應用程序當前不使用UIAlertViewUIAlertViewController,因此理論上,swizzling只會影響該閉源SDK的所有操作。

+0

您是否在應用中標記了其他alertViews,或者您使用'UIAlertController's和品牌? – Avi

+0

@Avi除了通過這個API,我們不使用UIAlertController(並且不打算像我們做自定義視圖一樣)。 – helloB

+0

我會建議創建一個自定義控制器,然後嘗試調劑。 – uchiha

回答

2

這根本不是直截了當的。


如果SDK使用UIAlertView,然後嘗試swizzlingshow方法。

你的實現應該做大致如下:

1)不要讓原來的UIAlertView中顯示 - 這是很難進行定製。

2)保持舊的.delegate的引用,以便能夠在需要時通知它。

3)創建您自己的自定義UIView並使用[[UIApplication sharedApplication].keyWindow addSubview:myCustomAlertView];

4)我相信你可以得到所有以前的UIAlertView中的變量(即按鈕標題,文本框等),利用其特性,如

@property(nonatomic,copy) NSString *title; 
@property(nullable,nonatomic,copy) NSString *message; 
- (nullable NSString *)buttonTitleAtIndex:(NSInteger)buttonIndex; 
@property(nonatomic,readonly) NSInteger numberOfButtons; 
@property(nonatomic) NSInteger cancelButtonIndex; 

5)創建您自己的設計和調用相應的委託方法需要的時候。


其他方法是使用Apple的Private API,但這可能會導致不好的結果。

這是一個非常困難的方法。首先,你不能保證它甚至可以工作。其次,您的應用可能會被拒絕。因此,我不會真的建議吧...

但是,如果你真的想要去使用這種方法,然後再嘗試這樣做:

[myAlertView show];看看它的性能有一定的延遲後(即0.01秒就夠了):

enter image description here

現在查找可疑的性質(可能是UIView類),這可能具有UI相關的信息。例如,__representer看起來很有趣 - 它有限制,它有labelContainerView ...嘗試使用這些屬性進行播放。

爲了得到__representer,使用KVC和KVO(即從id theAlertController = [myAlertView valueForKey:@"_alertController"];開始)。然後下潛越來越深。

希望你能找到有用的屬性,並能夠通過KVC改變它們的值。

+0

感謝這個非常徹底的答案。我會嘗試一下,讓你知道發生了什麼。 – helloB

+0

您還應該檢查私有SDK是否使用'UIAlertView'或'UIAlertViewController'。希望,不是兩種情況......如果他們同時使用這兩種方法,則必須將方法調整到兩個類中... – OlDor