Подтвердить что ты не робот

Смещение UIRefreshControl

В настоящее время я использую JASidePanel для своего приложения, и у меня есть UITableViewcontroller с UIRefreshControl как один из ViewControllers для него. Ширина моего табличного вида по-прежнему имеет ширину 320 пикселей, поэтому UIRefreshControl центрируется прямо в середине представления. Я пытаюсь выяснить, есть ли способ компенсировать UIRefreshControl (перемещение x на 20 пикселей влево), чтобы он выглядел по центру, когда я вижу свою боковую панель.

Спасибо! JASidePanel

4b9b3361

Ответ 1

Вам необходимо установить рамку 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

Попробуйте отредактировать bounds. Например, чтобы переместить элемент управления вниз + 50px:

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

Ответ 3

Мне нужно было сделать это, чтобы переместить 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

Ответ 4

UIRefreshControl кадр автоматически управляется, поэтому попытка изменить его положение, скорее всего, приведет к неожиданным результатам (особенно между версиями SDK для iOS). Как вы отметили, элемент управления всегда находится по горизонтали в кадре супервизора. Зная это, вы можете "воспользоваться" ситуацией, компенсируя свой контроль.

В вашем случае установите ракурс таблицы в CGRect(-40, 0, 360, superViewHight). Это приведет к тому, что ваш стол будет располагаться на 40 точках слева от окна. Таким образом, вам нужно будет соответствующим образом отредактировать содержимое табличного представления так, чтобы оно находилось на 40 пунктах справа или просто увеличивало дополнительные 40 очков, но отрисовка материала с экрана должна быть дополнением.

Как только вы сделаете это, ваш UIRefreshControl будет сидеть на 20 пунктов влево, как вы пожелаете, из-за того, что он центрирован.

enter image description here

Ответ 5

Для решения 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)

Вот оно.

Ответ 6

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

Ответ 7

Здесь версия Swift похожа на обходной путь, который предложил Вервольф. Я использую свой собственный класс представления активности (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 subviews. Since you can't remove the default refresh indicator, we modify it 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, в которых это не является строго необходимым, но дает индикатору активности некоторое пространство для дыхания.

Ответ 8

Вам необходимо создать подкласс UIScrollView, следующий код будет корректировать расположение UIRefreshControl на основе contentInset (работает только для вертикальной прокрутки, но легко адаптируется для горизонтальной)

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
}