Programing

iOS에서 테이블로 스크롤되지 않는 UITableView 위에 버튼을 놓는 방법

lottogame 2020. 11. 19. 07:48
반응형

iOS에서 테이블로 스크롤되지 않는 UITableView 위에 버튼을 놓는 방법


UITableView화면의 같은 위치에있는 버튼을 놓고 스크롤하지 않습니다 UITableView. addSubview버튼을 시도하면 표시되지만으로 스크롤됩니다 UITableView.

버튼을 놓는 이유 UITableView는 사용자가 작업을 수행하도록하기 위해서입니다. 저는 셀에 버튼이 있다는 얘기가 아닙니다. 위치를 이동하지 않는 플로팅 버튼입니다.

내가 사용하고 UITableViewController, 나는이 목적을 위해 머리글이나 바닥 글을 사용하지 않습니다. 그리고 또 다른 바 ( UIToolbar예 :)는 나에게 옵션이 아닙니다.

미리 감사드립니다.


이에 대한 한 가지 해결책 UIViewControllerUITableViewController. 자신 만의 테이블 뷰를 추가하고 모든 것을 설정해야합니다. 그런 다음 테이블 뷰 대신 뷰 컨트롤러의 뷰에 버튼을 추가 할 수 있습니다.


탐색 컨트롤러를 사용하는 경우보기를 추가 할 수 있습니다.

[self.navigationController.view addSubview:yourView];

예:

UIButton *goToTopButton = [UIButton buttonWithType:UIButtonTypeCustom];
goToTopButton.frame = CGRectMake(130, 70, 60, 20);
[goToTopButton setTitle:@"Scroll to top" forState:UIControlStateNormal];
[goToTopButton addTarget:self action:@selector(goToTop) forControlEvents:UIControlEventTouchUpInside];
[goToTopButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[goToTopButton.layer setBorderColor:[[UIColor whiteColor] CGColor]];
goToTopButton.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:13];
[self.navigationController.view goToTopButton];

당신은 또한 그것을 할 수 있습니다 UITableViewController( UIViewController테이블 또는 VC를 중첩하는 일반 필요 없음 )

SafeAreas를 사용하여 업데이트 된 iOS11 +

자동 레이아웃을 사용하여보기를 하단에 유지하고 싶습니다.

{
    [self.view addSubview:self.bottomView];
    [self.bottomView setTranslatesAutoresizingMaskIntoConstraints:NO];
    UILayoutGuide * safe = self.view.safeAreaLayoutGuide;
    [NSLayoutConstraint activateConstraints:@[[safe.trailingAnchor constraintEqualToAnchor:self.bottomView.trailingAnchor],
                                              [safe.bottomAnchor constraintEqualToAnchor:self.bottomView.bottomAnchor],
                                              [safe.leadingAnchor constraintEqualToAnchor:self.bottomView.leadingAnchor]]];
    [self.view layoutIfNeeded];
}

보기가 항상 맨 위에 있도록

- (void)viewDidLayoutSubviews {

    [super viewDidLayoutSubviews];

    [self.view bringSubviewToFront:self.bottomView];

}

이전의 오래된 솔루션

표를 스크롤하여 "부동"보기의 위치를 ​​조정해야합니다.

UITableViewController에있는 경우

UITableView 상단에 뷰를 플로팅하려는 경우

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGRect frame = self.floatingView.frame;
    frame.origin.y = scrollView.contentOffset.y;
    self.floatingView.frame = frame;

    [self.view bringSubviewToFront:self.floatingView];
}

UITableView의 맨 아래에 뷰를 플로팅하려면

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGRect frame = self.floatingView.frame;
    frame.origin.y = scrollView.contentOffset.y + self.tableView.frame.size.height - self.floatingView.frame.size.height;
    self.floatingView.frame = frame;

    [self.view bringSubviewToFront:self.floatingView];
}

나는 그것이 당신의 질문에 대한 진정한 대답이라고 믿습니다.


테이블보기를 포함하는 정적 제어보기를 표시하려면 세 가지 옵션이 있습니다.

1) UITableViewController를 사용하지 마십시오. 대신 UITableView 하위보기를 사용하여 UIViewController를 만들고 테이블보기 대리자 / 데이터 소스 코드를 UIViewController에 넣으십시오. 이 옵션은 앱의 아키텍처에 따라 작동하거나 작동하지 않을 수 있습니다. 예를 들어 사용자 지정 논리가 많은 UITableViewController 하위 클래스를 구현하려는 경우 이상적이지 않습니다.

2) WWDC 2011 방법. 32:20부터 시작하는 WWDC 2011 세션 125 "UITableView 변경 사항, 팁 및 요령"을 참조하십시오. AutoLayout이 iOS에 도입되기 전과 처리해야 할 화면 크기가 너무 많기 전에 Apple에서 테이블보기 스크롤을 할 때마다보기의 위치를 ​​조정하는이 방법을 권장했습니다. 모든 다른 화면 크기에 대한 위치를 직접 관리 할 것이기 때문에 권장하지 않습니다.

3) UITableViewController가 포함될 컨테이너 뷰와 함께 UIViewController를 사용하는 것이 좋습니다. 이렇게하면 UITableViewController에서 테이블보기 논리를 별도로 유지할 수 있습니다. UIViewController는 UITableViewController에 대한 'dumb'컨테이너를 호스팅하며 정적 컨트롤 뷰도 보유합니다. 이렇게하려면 UIViewController를 스토리 보드로 드래그하고 그 안에 "컨테이너 뷰"를 드래그합니다. 컨테이너 뷰에 자동으로 첨부 된 UIViewController를 삭제 한 다음, 컨테이너 뷰에서 테이블 뷰 컨트롤러로 컨트롤을 드래그하고 "embed"를 선택하여 컨테이너 뷰에 표시 할 테이블 뷰 컨트롤러를 연결합니다. 이제 테이블보기 위에 표시 될 UIViewController에 정적 컨트롤을 하위보기로 추가 할 수 있습니다.

컨테이너보기 내부의 UITableViewController에 대한 스토리 보드

I prefer this method because UIViewController can handle the control logic and the UITableViewController handles the table view logic. Some other answers here recommend adding the static control as a subview to a Navigation Controller or Window. These only work as long as you never add another view controller to the navigation controller or window.


For swift :

override func scrollViewDidScroll(scrollView: UIScrollView){
    var frame: CGRect = self.floatingView.frame
    frame.origin.y = scrollView.contentOffset.y
    floatingView.frame = frame

    view.bringSubviewToFront(floatingView)
}

This function is called every time you scroll. Then inside you get the frame of your UIView and update its position depending on how much you scrolled. Your UIView is constantly moving with your UIScrollView so to the user it looks like its floating.


you can add buttons on UIWindow no need to extend it to UIViewController instead of UITableviewController.Just add buttons on window.

UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIButton *btn =[UIButton buttonWithType:UIButtonTypeCustom];
[btn setFrame:CGRectMake(60, 200,40, 60)];
[btn addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
[window addSubview:btn];

I've create a library in order to make it easier to add a floating button on top of a UITableView/UICollectionView/UIScrollView. Is called MEVFloatingButton.

These are the steps for use it.

1- Import category file

#import "UIScrollView+FloatingButton.h"

2 - Add delegate and the optional delegate methods.

  @interface ViewController () <MEVFloatingButtonDelegate>

  #pragma mark - MEScrollToTopDelegate Methods

  - (void)floatingButton:(UIScrollView *)scrollView didTapButton:(UIButton *)button;

2 - Create a MEVFloatingButtonobject.

MEVFloatingButton *button = [[MEVFloatingButton alloc] init];
button.animationType = MEVFloatingButtonAnimationFromBottom;
button.displayMode = MEVFloatingButtonDisplayModeWhenScrolling;
button.position = MEVFloatingButtonPositionBottomCenter;
button.image = [UIImage imageNamed:@"Icon0"];
button.imageColor = [UIColor groupTableViewBackgroundColor];
button.backgroundColor = [UIColor darkGrayColor];
button.outlineColor = [UIColor darkGrayColor];
button.outlineWidth = 0.0f;
button.imagePadding = 20.0f;
button.horizontalOffset = 20.0f;
button.verticalOffset = -30.0f;
button.rounded = YES;
button.hideWhenScrollToTop = YES;

4 - Assigned the button and delegate to the UITableView.

[self.tableView setFloatingButtonView:button];
[self.tableView setFloatingButtonDelegate:self]

Demo results

데모데모데모


I just saw WWDC 2011 TableView,Tips and Tricks videos. Floating views are exactly the same thing.All you have to do is change frame back to original position on scrollViewDidScroll.

https://developer.apple.com/videos/wwdc/2011/

Check videos TableViews tips and tricks.


이에 대한 더 나은 해결책이 있습니다. 플로팅 버튼 의 해당 Button또는 any 의 Auto Layout (button.translatesAutoresizingMaskIntoConstraints = false) 속성을 비활성화하여이를 수행 할 수 있습니다 UIView.

스위프트 4

//create a button or any UIView and add to subview
let button=UIButton.init(type: .system)
button.setTitle("NEXT", for: .normal)
let button.frame.size = CGSize(width: 100, height: 50)
self.view.addSubview(nextButton)

//set constrains
button.translatesAutoresizingMaskIntoConstraints = false
if #available(iOS 11.0, *) {
     button.rightAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.rightAnchor, constant: -10).isActive = true
     button.bottomAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.bottomAnchor, constant: -10).isActive = true
} else {
     button.rightAnchor.constraint(equalTo: tableView.layoutMarginsGuide.rightAnchor, constant: 0).isActive = true
     button.bottomAnchor.constraint(equalTo: tableView.layoutMarginsGuide.bottomAnchor, constant: -10).isActive = true
}

참고 URL : https://stackoverflow.com/questions/14689805/how-to-put-buttons-over-uitableview-which-wont-scroll-with-table-in-ios

반응형