1

私は興味深い問題を抱えており、正しい軌道に乗っていると思いますが、正しい方向に向ける必要があります。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 メソッドを使用して、スーパー ビューのサブビューを配置するように指示されています。私もそれを試しましたが、動作に違いはありませんでした。再考する必要がありますか?

他のコードを見る必要がある場合はお知らせください。どんな助けでも大歓迎です。

神のご加護を!

4

0 に答える 0