2013-06-25 14 views
23

私は現在、自分のアプリケーション用にJasidePanelを使用しています.UIRefreshControlを持つViewable ControllerをViewControllerの1つとして使用しています。私のテーブルビューの幅はまだ320ピクセルの幅を持っているので、UIRefreshControlはビューの真ん中に置かれます。私はサイドパネルが見えるようにするときに中央に見えるように、UIRefreshControl(xを左に20ピクセル移動する)をオフセットする方法があるかどうかを調べようとしています。UIRefreshControlをオフセットする

ありがとうございます! JASidePanel

+0

あなたは、テーブルビューのフレームを変更することはできません理由があるインセットでそれを失望? – Wain

+0

私は誰かがサイドパネルの下を見ようとすると、それは不完全に見えます:( – user754905

+0

あなたのサイドパネルの幅と同じ 'x'の動きでリフレッシュコントロールにトランスフォームトランスフォームを追加することができます。 – Wain

答えて

33

UIRefreshControlのフレームを設定する必要があります。このコード

UIRefreshControl *refContr=[[UIRefreshControl alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; 
[refContr setTintColor:[UIColor blueColor]]; 
[refContr setBackgroundColor:[UIColor greenColor]]; 

[stocktable addSubview:refContr]; 
[refContr setAutoresizingMask:(UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleLeftMargin)]; 

[[refContr.subviews objectAtIndex:0] setFrame:CGRectMake(30, 0, 20, 30)]; 


NSLog(@"subViews %@",refContr.subviews); 
を使用

Output

+0

驚くばかりのヒント。 iOS 7の場合、FYIは10ポイント(左へ)です。したがって:[[refContr.subviews objectAtIndex:0] setFrame:CGRectMake(20、0、20、30)]; – Baza207

+3

UIRefreshControlはサブビューとして追加するつもりはありません...私の経験上、ターゲットが削除されていないときにクラッシュを引き起こしました... UIRefreshControlはサブビューとして追加されたときに他の問題も引き起こす可能性があります –

+1

最初のUIRefreshControlサブビューはトリックを行います。 私はSWRevealViewControllerを使用していますし、それが動作します: ' - (無効)viewWillAppear:アニメーション(BOOL) { [スーパーviewWillAppear:アニメーション]; CGFloat rearPanelWidth = self.revealViewController.rearViewRevealWidth; UIView * refreshView = self.refreshControl.subviews [0]; CGRect refreshFrame = refreshView.frame; refreshFrame.size.width = rearPanelWidth; refreshView.frame = refreshFrame; } ' –

4

UIRefreshControlのフレームで自動的ので、それは可能性が高い(特にのiOS SDKのバージョン間)予期しない結果に生じるであろう位置です変更しようとして管理します。あなたが指摘したように、コントロールは常にスーパービューのフレーム内に水平に配置されています。これを知ることで、スーパービューを相殺して状況を「活用」することができます。

場合によっては、テーブルビューのフレームをCGRect(-40, 0, 360, superViewHight)に設定します。これにより、テーブルビューはウィンドウの左側40ポイントに座ります。そのため、テーブルビューのコンテンツを調整して右に40ポイント、または余分に40ポイントを伸ばす必要がありますが、画面からレンダリングされるものはパディングする必要があります。

これを行うと、UIRefreshControlは、中央に置かれているため、希望通り左に20ポイントの座りがあります。

enter image description here

+0

Chrisさん、残念ながら私はテーブルを移動することができません。なぜなら、色付きの行が交互に表示され、ユーザーがサイドパネルの下を見るとこの外観が醜いからです。 – user754905

+0

わからない私は、水平方向のシフトが、垂直に配置された行を交互に変えることになぜ影響するのか理解していますか? –

+0

申し訳ありませんが、私は正しく答えを読んでいませんでした。これはうまくいくかもしれませんが、サブビューは正しいことに苦労するでしょう。 – user754905

48

boundsを編集してください。たとえば、コントロールを下げる+ 50px:

+2

私はこの作品が最も簡単な解決方法を確認できます – Fonix

+1

完璧に動作します! –

+0

これは、受け入れられた答えよりも速く簡単な解決策ですが、私の 'UIRefreshControl'をもっとカスタマイズしたければ、受け入れられた答えをとるでしょう。私は個人的にこのソリューションを使用しています。 – ton

11

UIRefreshControlを下に移動するには、これを行う必要がありました。私の解決策は、UIRefreshControlをサブクラス化し、layoutSubviewsメソッドを上書きして各サブビューでCAAffineTransform変換を設定することでした。残念ながら、UIRefreshControlにトランスフォームを設定することはできません。

xOffsetとyOffsetを必要に応じて変更します。

@interface MyUIRefreshControl : UIRefreshControl 
@end 

@implementation MyUIRefreshControl 

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    for (UIView *view in self.subviews) { 
     view.transform = CGAffineTransformMakeTranslation(xOffset, yOffset); 
    } 
} 

@end 
0

ここでは、Werewolfが提案した回避策に似たスウィフトバージョンがあります。私は自分自身のカスタムアクティビティビュークラス(MyCustomActivityIndicatorView)を使用しています。また、リフレッシュコントロールのサブビューでもありますので、デフォルトのサブビューのフレームだけをフレームとして扱いません。スーパーでlayoutSubviewsを呼び出した後、カスタムアクティビティビューのフレームを調整して一致させます。これはすべてカスタムUIRefreshControlサブクラスに含まれています。

override func layoutSubviews() { 

    for view in subviews { 
     if view is MyCustomActivityIndicatorView { 
      continue 
     } else { 
      // UIRefreshControl sizes itself based on the size of it's subviews. Since you can't remove the default refresh indicator, we modify it's frame to match our activity indicator before calling layoutSubviews on super 
      var subFrame = view.frame 
      subFrame.size = activityView.intrinsicContentSize() 

      // add some margins 
      subFrame.offsetInPlace(dx: -layoutMargins.left, dy: -layoutMargins.top) 
      subFrame.insetInPlace(dx: -(layoutMargins.left+layoutMargins.right), dy: -(layoutMargins.top+layoutMargins.bottom)) 

      view.frame = subFrame.integral 
     } 
    } 

    super.layoutSubviews() 

    activityView.frame = bounds 
} 

注:私は厳密には必要ではないが、息に私の活動の指標にいくつかのスペースを与えているのUIViewのレイアウトの余白に追加しています。スイフト2.2溶液について

1

は厥

let offset = -50 

let refreshControl = UIRefreshControl() 
refreshControl.bounds = CGRect(x: refreshControl.bounds.origin.x, y: offset, 
           width: refreshControl.bounds.size.width, 
           height: refreshControl.bounds.size.height) 
refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh") 
refreshControl.addTarget(self, action: #selector(networking), forControlEvents: UIControlEvents.ValueChanged) 
self.profileTable.addSubview(refreshControl) 

あります。

0
- (UIRefreshControl *)refreshControl 
{ 
    if (!_refreshControl) 
    { 
     _refreshControl = [UIRefreshControl new]; 
     _refreshControl.tintColor = [UIColor lightGrayColor]; 

_refreshControl.bounds = CGRectInset(_refreshControl.bounds、0.0、10.0)。 // 10.0

 [_refreshControl addTarget:self 
          action:@selector(pullToRefresh) 
        forControlEvents:UIControlEventValueChanged]; 
    } 
    return _refreshControl; 
} 
+0

[self.refreshControl beginRefreshing]; viewWillAppearearにアニメーションを開始する –

関連する問題