4

UISearchBarの下部をよく見るとUISearchDisplayController、微妙なドロップシャドウがあることがわかります。この影は、現在作業しているアプリのデザインに合わないため、削除/非表示にしようとしています。残念ながら、私はまだ成功していません。

このドロップシャドウの調査中に、それがの一部ではないUISearchBarことがわかりました。のスーパービューからUISearchDisplayController'sを削除すると、シャドウは表示されたままになります。UISearchBar- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller

UISearchDisplayController's searchResultsTableView影は:の一部であることが判明しました。を非表示にするsearchResultsTableViewと、影が消えます。ただし、レイヤーに影があるビューを追跡することはできませんでした。表示されているすべてのビューを再帰的に繰り返し([[UIApplication sharedApplication] window]から開始)、各ビューのドロップシャドウを非表示にして、そのclipsToBoundsプロパティをYESに設定しようとしましたが、これも目的の結果が得られませんでした。

何か案は?

4

2 に答える 2

3

私はついに解決策を見つけました。YESに設定clipsToBoundsし、階層内の各ビューのドロップシャドウを非表示にすることは機能しなかったため、シャドウが画像であることは明らかです。のすべてのサブビューを繰り返し処理し、searchResultsTableViewそれらのクラスプロパティを出力した後_UISearchBarShadowView、明らかに原因であるのインスタンスを見つけました。だから私が今しているのは、を見つけて_UISearchBarShadowViewそのアルファを0.0fに設定することです。

- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView
{
    [self _findAndHideSearchBarShadowInView:tableView];
}

- (void)_findAndHideSearchBarShadowInView:(UIView *)view
{
    NSString *usc = @"_";
    NSString *sb = @"UISearchBar";
    NSString *sv = @"ShadowView";
    NSString *s = [[usc stringByAppendingString:sb] stringByAppendingString:sv];

    for (UIView *v in view.subviews)
    {
       if ([v isKindOfClass:NSClassFromString(s)]) {
            v.alpha = 0.0f;
        }
        [self _findAndHideSearchBarShadowInView:v];
    }
}
于 2012-11-30T13:37:27.087 に答える
1

承認された回答はプライベートAPIを使用しているため、アプリが拒否される可能性があります。代わりに、次のように、UIImageViewのカスタムサブクラスでもあるサブビューを見つけて非表示にします。

- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView
{
    for (UIView *view in tableView.subviews) {
        if ([view.class isSubclassOfClass:[UIImageView class]]) {
            view.alpha = 0.f;
        }
    }
}
于 2013-02-18T01:27:13.380 に答える