Смещение UIRefreshControl
В настоящее время я использую JASidePanel для своего приложения, и у меня есть UITableViewcontroller с UIRefreshControl как один из ViewControllers для него. Ширина моего табличного вида по-прежнему имеет ширину 320 пикселей, поэтому UIRefreshControl центрируется прямо в середине представления. Я пытаюсь выяснить, есть ли способ компенсировать UIRefreshControl (перемещение x на 20 пикселей влево), чтобы он выглядел по центру, когда я вижу свою боковую панель.
Спасибо!
![JASidePanel]()
Ответы
Ответ 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
}