私は興味深い問題を抱えており、正しい軌道に乗っていると思いますが、正しい方向に向ける必要があります。UITabBar のサブクラスを作成しようとしましたが、実行時にタブ バーの「上」にオフセットされた UIButton を追加したいと考えています。また、そのボタンをタップして、タブ バーを表示または非表示にするアニメーションを作成したいと考えています。私はすでに同様の投稿を見てきましたが、解決策は、ボタンを UITabBar 内で機能させようとするのではなく、UITabBarController のビューに追加することを示しています。
UIButton をサブビューとして UITabBar に追加する
私はそれをUIToolBarに追加したい、または追加すべきではない理由と、UITabBarControllerアプローチが優れている/より効率的である/よりクリーンである理由などを知りたいです。これが私の CollapsibleToolbar 実装ファイルです (アニメーション化するコードを除く)。私はまだiOSにかなり慣れていないので、非常に単純なことを間違ってやっている可能性があります。
#import "CollapsibleTabBar.h"
@interface CollapsibleTabBar () {
BOOL _isCollapsed;
double _imageHeight;
double _imageWidth;
}
@property (nonatomic, retain) UIImage *buttonImage;
@property (nonatomic, retain) UIButton *slideButton;
@end
@implementation CollapsibleTabBar
@synthesize slideButton;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if (self){
_isCollapsed = YES;
// Place button in UI
_imageHeight = 40;
_imageWidth = 40;
// Create button image
self.buttonImage = [UIImage imageNamed:@"tab-bar-expander-button.png"];
// Create an hook up button
self.slideButton = [UIButton buttonWithType:UIButtonTypeCustom];
self.slideButton.backgroundColor = [UIColor colorWithPatternImage:self.buttonImage];
[self.slideButton addTarget:self action:@selector(slideButtonTapped) forControlEvents:UIControlEventTouchUpInside];
// Set button frame
self.slideButton.frame = CGRectMake((self.center.x - (_imageWidth/2.0)), -1*_imageHeight, _imageWidth, _imageHeight);
double yOriginOffset = self.frame.origin.y - _imageHeight;
// Must increase the bounds to allow the slide button to receive touch events?
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height + _imageHeight);
// Add button as sub view
[self addSubview:self.slideButton];
}
return self;
}
- (void)slideButtonTapped {
// Animate that junk ...
}
- (void)dealloc{
// Remove target
[self.slideButton removeTarget:self action:@selector(slideButtonTapped) forControlEvents:UIControlEventTouchUpInside];
self.buttonImage = nil;
self.slideButton = nil;
}
ペン先に UITabBar をドラッグ/ドロップし、そのクラスを CollapsibleTabBar に設定したため、initWithCoder を使用しています。このため、initWithFrame は起動しないと思います。
とにかく、これはボタンを希望する場所に正確に配置しますが、slideButtonTapped メソッドは決して起動しません。UIButton のフレームを次のように変更すると、ボタンの下半分が UITabBar のタップ可能な領域に公開され、slideButtonTapped イベントが発生します。
self.slideButton.frame = CGRectMake((self.center.x - (_imageWidth/2.0)), -1*_imageHeight/2.0, _imageWidth, _imageHeight);
これから、フレーム/境界の問題であることがわかります。ボタンは表示されますが、UITTabBar のタップ可能な領域の外にあるため、タップできません。そのため、UITTabBar のフレームをいじり始め (Dave H. が上記のリンクの回答として示唆しているように)、ボタンがタップ イベントに応答することを期待して、UIButton を囲むようにサイズを大きくしました。
スーパービューのこの Y 位置にフレームを配置し、ボタンの高さだけ高さを増やすことは論理的に思えますが、これで UITabBar + UIButton のフレームを正しく配置できませんでした。
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y-_imageHeight, self.frame.size.width, self.frame.size.height + _imageHeight);
さらに悪いことに、これによりボタンのタップが無効になり、UITabBar が間違った場所にレンダリングされます。ドキュメントを読みましたが、何が間違っているのかまだわかりません。
その他の質問:
- これは正しいアプローチですか?ビュー コントローラーに乱雑なフレーム アニメーション コードを使用せずに、すぐに回転をサポートしたいことを思い出してください。
- UIViewのタップ可能領域はどのように制御されますか? それはフレームまたは境界のプロパティですか、それとも何か他のものですか?
- Apple ドキュメントでは、UIView の layoutSubviews メソッドを使用して、スーパー ビューのサブビューを配置するように指示されています。私もそれを試しましたが、動作に違いはありませんでした。再考する必要がありますか?
他のコードを見る必要がある場合はお知らせください。どんな助けでも大歓迎です。
神のご加護を!