29

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

谢谢! JASidePanel

4

9 回答 9

72

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

refreshControl.bounds = CGRectMake(refreshControl.bounds.origin.x,
                                   -50,
                                   refreshControl.bounds.size.width,
                                   refreshControl.bounds.size.height);
[refreshControl beginRefreshing];
[refreshControl endRefreshing];
于 2014-07-03T20:00:15.753 回答
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); 

输出:
输出

于 2013-06-28T04:53:13.840 回答
14

我需要这样做才能将 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
于 2015-03-30T04:10:24.367 回答
9

斯威夫特 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
于 2019-12-26T14:50:59.297 回答
3

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

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

一旦你这样做了,你的UIRefreshControl意志会坐在你想要的左边 20 点,因为它是居中的。

在此处输入图像描述

于 2013-06-28T04:55:06.773 回答
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)

而已。

于 2016-05-25T18:02:00.943 回答
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;
}
于 2016-08-16T16:11:21.637 回答
0

这是一个类似于 Werewolf 建议的解决方法的 Swift 版本。我正在使用我自己的自定义活动视图类MyCustomActivityIndicatorView(调用layoutSubviewssuper 后,我调整自定义活动视图的框架以匹配。这都包含在自定义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 的布局边距,这不是绝对必要的,但给我的活动指示器一些喘息的空间。

于 2016-03-15T14:52:54.507 回答
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
}
于 2019-09-03T07:36:54.937 回答