抵消UIRefreshControl

时间:2013-06-25 23:33:04

标签: ios ios6 uirefreshcontrol

我目前正在为我的应用程序使用JASidePanel,并且我有一个带有UIRefreshControl的UITableViewcontroller作为它的ViewControllers之一。我的tableview的宽度仍然是320像素的宽度,因此UIRefreshControl在视图中间居中。我试图找出是否有办法来偏移UIRefreshControl(将x向左移动20个像素),这样当我的侧面板可见时它看起来居中。

谢谢! JASidePanel

9 个答案:

答案 0 :(得分:55)

尝试编辑bounds。例如,要将控件向下移动+ 50px:

refreshControl.bounds = CGRectMake(refreshControl.bounds.origin.x,
                                   -50,
                                   refreshControl.bounds.size.width,
                                   refreshControl.bounds.size.height);
[refreshControl beginRefreshing];
[refreshControl endRefreshing];

答案 1 :(得分: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

答案 2 :(得分:12)

我需要这样做才能向下移动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

答案 3 :(得分:4)

UIRefreshControl的框架是自动管理的,因此尝试更改它的位置可能会产生意外结果(特别是在iOS SDK版本之间)。正如您所注意到的,控件始终水平居中于其超视图的框架中。了解这一点,您可以通过抵消您的超级视图来“利用”这种情况。

在您的情况下,将表格视图的框架设置为CGRect(-40, 0, 360, superViewHight)。这将使您的表格视图位于窗口左侧的40个点。因此,您需要相应地调整表格视图的内容,使其位于右侧40个点或仅延伸40个点,但渲染屏幕的内容应该是填充。

执行此操作后,UIRefreshControl会因为您居中而坐在左侧20点左右。

enter image description here

答案 4 :(得分:1)

对于Swift 2.2解决方案是

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)

多数民众赞成。

答案 5 :(得分:1)

- (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;
}

答案 6 :(得分:0)

这是一个Swift版本,类似于Werewolf建议的解决方法。我正在使用我自己的自定义活动视图类(MyCustomActivityIndicatorView),它也是刷新控件的子视图,所以我确保我不会弄乱它的框架,只是默认子视图的框架。在super上调用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的布局边距,其中并非绝对必要,但为我的活动指示器提供了一些可以呼吸的空间。

答案 7 :(得分:0)

您需要对UIScrollView进行子类化,以下代码将基于contentInset调整UIRefreshControl的位置(仅适用于垂直滚动,但易于采用为水平滚动)

override public func layoutSubviews() {
    super.layoutSubviews()
    guard let refreshControl = self.refreshControl else { return }

    var newFrame = refreshControl.frame

    if contentInset.top > .zero {
        let yOffset = abs(contentInset.top + contentOffset.y)

        newFrame.origin.y = -contentInset.top - yOffset
        newFrame.size.height = yOffset
    }

    guard newFrame != refreshControl.frame else { return }
    refreshControl.frame = newFrame
}

答案 8 :(得分:0)

快捷键5:

有两种方法可以更改UIRefreshControl的位置。刷新控件的设置是通过最方便的方式完成的。

刷新控件是滚动视图一部分的示例:

let refresher = UIRefreshControl()
refresher.addTarget... // Add a proper target.
scrollView.refreshControl = refresher

请注意,您可以使用tableView而不是scrollView。

选项1:您可以使用视图的边框进行游戏。

scrollView.refreshControl?.refreshControl.bounds.origin.x = 50

选项2:或您可以使用“自动布局”来实现。


scrollView.refreshControl?.translatesAutoresizingMaskIntoConstraints = false

scrollView.refreshControl?.topAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
scrollView.refreshControl?.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: -50).isActive = true