Da UIBarButtonItem
die Klasse UIView
nicht ableitet, ist es unmöglich, die normalen Eigenschaften wie frame
zu erhalten.
Eine Möglichkeit, dies zu tun, ist [barButtonItem valueForKey:@"view"]
Dies funktioniert perfekt und Sie können einen GestureRecognizer (zum Beispiel) zum zugrunde liegenden UIView
hinzufügen.
Ist dies jedoch eine private UIKit
API-Verletzung?
Dies ist nicht privat in Bezug auf die sofortige Ablehnung bei der Validierung, aber es ist privat genug, um als fragil angesehen zu werden (das heißt, eine neue iOS-Version kann Ihre bestehende App im App-Store, der den Code verwendet, beschädigen).
Ich kann sagen, dass ein ähnlicher Code (das den iView BackgroundView von UIToolbar via KVC holt) die Validierung des Appstores bestanden hat und in der Produktion verwendet wird.
Im Falle von möglichen schlimmen Dingen müssen Sie die Methode in @try { ... } @catch
umbrechen, damit Sie KVC abfangen können, was möglicherweise in einer neueren iOS-Version fehlschlägt.
Fünf Beweise für "Es ist nicht privat"
Es ist eine Eigenschaft, die Sie auf andere Weise erreichen können. Versuchen Sie es, und eine dieser Ansichten ist in der Tat die _view
ivar der UIBarButtonItem
in Frage. Dies zeigt an, dass der Zugriff auf dieses UIView
nicht selbst verboten ist, obwohl der KVO-Weg möglicherweise fraglich ist (aber ich bezweifle es).
Sie lösen die KVO für diese Eigenschaft aus. Ivars müssen die KVO-API nicht auslösen, oder?
@Farcaller erwähnt einen ähnlichen Fall, der im App Store zum Verkauf steht. Da er / sie innerhalb der ersten 20 Minuten der Frage, die da oben ist, geantwortet hat, ist es vernünftig (aber nicht sicher!) Anzunehmen, dass es im App Store Tausende von Apps gibt, die dies tun.
Diese UIView wird bei jedem Drücken der Schaltfläche ausgeblendet, sodass Sie beispielsweise nicht einfach einen Gestenerkennungserkenner darauf setzen können. Sie können jedoch immer den gleichen Gestenerkenner einstellen, wenn view
ersetzt wird. Für mich ist dies eher ein Beweis dafür, dass es sich nicht um eine private API-Sache handelt, sondern Sie müssen sehr vorsichtig sein, wenn Sie es verwenden (und KVO verwenden, um sicherzustellen, dass Sie das Neueste haben).
Meine App steht im App Store zum Verkauf und macht das.
Tags und Links objective-c ios app-store uikit