web-dev-qa-db-ja.com

showScopeBar = YESの場合のiOS8でのUISearchBarの高さ

アプリでUISearchBarを使用しており、showsScopeBar=YES。 iOS8(シミュレーターとデバイスの両方)で実行すると、スコープバーは非表示になり、検索バーの高さは予想される88ではなく44のままになります。Xcode6の新しいビューデバッガーを使用すると、スコープバーが実際にあることがわかります。存在しますが、テキストフィールドの後ろに隠れたままです。

私がこれまでに見つけた唯一の方法は、検索バーの高さを手動で88に設定することです。これは、もちろんひどいハックです。

文書化された非互換性が欠落していますか、それともこれはバグですか?

13
Gereon

私もこの問題に遭遇しました。 Apples開発者フォーラムで検索した後、私はこのスレッドを見つけました: https://devforums.Apple.com/thread/235803?start=0&tstart=

そして、どうやらSearchBarは、想定されているときにsizeToFitを自動的に実行しないようです。そのため、スコープボタンに合わせる代わりに、高さは44のままになります。このバグはiOS8GMでは修正されていません。

ViewWillAppearで単純な[self.searchBarsizeToFit]を実行しましたが、これで解決しました。

23
Janne

この問題は、iOS8リリースバージョンでも発生しています。これらの2行をviewWillAppear:に追加しましたが、これで解決しました。

- (void)adjustSearchBarToShowScopeBar{ [self.searchBar sizeToFit]; self.tableView.tableHeaderView = self.searchBar; } [self.searchBar sizeToFit]を追加するだけで、テーブルビューの最初の行が隠されていました。 tableviewヘッダーを更新するだけで、問題が完全に修正されました。

8
megha

これはiOS8のバグではなく、Xcode 6 GMコンパイルされたストーリーボードのバグです。iOS6/ 7でも発生します。

提案されているように、sizeToFitの検索バーでviewWillAppearを呼び出すことで修正されます。

コントローラではなくビューから実行したい場合は、willMoveToWindow内に配置してみてください。


このバグは、iOS8のXcode5.xビルドおよびすべてのシステムのXcode6 GMビルドに影響するようです。

4
Rivera

Janneの答え を使用して、メソッドスウィズリングでこれを自動的に行う方法を共有することが役立つと思いました。

@implementation UISearchBar (iOS8)

static dispatch_once_t dispatchOnceToken;

+ (void)load {
    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8)
    {
        dispatch_once(&dispatchOnceToken, ^{
            Class class = [self class];

            SEL originalViewWillAppearSelector = @selector(layoutSubviews);
            SEL swizzledViewWillAppearSelector = @selector(swizzled_layoutSubviews);

            Method originalViewWillAppearMethod = class_getInstanceMethod(class, originalViewWillAppearSelector);
            Method swizzledViewWillAppearMethod = class_getInstanceMethod(class, swizzledViewWillAppearSelector);

            if(class_addMethod(class, originalViewWillAppearSelector, method_getImplementation(swizzledViewWillAppearMethod), method_getTypeEncoding(swizzledViewWillAppearMethod)))
            {
                class_replaceMethod(class, swizzledViewWillAppearSelector, method_getImplementation(originalViewWillAppearMethod), method_getTypeEncoding(originalViewWillAppearMethod));
            }
            else
            {
                method_exchangeImplementations(originalViewWillAppearMethod, swizzledViewWillAppearMethod);
            }
        });
    }
}

- (void)swizzled_layoutSubviews
{
    [self swizzled_layoutSubviews];
    [self sizeToFit];
}

@end
0
Bryan Way