Có thể trên iOS rằng chế độ xem luôn luôn nổi trên tất cả các chế độ xem khác. Tôi hỏi điều này vì những gì tôi muốn đạt được là một khung nhìn nổi trên ViewController, và sau đó là một Modal View Controller sẽ xuất hiện, trong khi khung nhìn cụ thể vẫn còn trôi nổi trên Modal View Controller đó (hy vọng bạn sẽ có được những gì tôi đang cố gắng nói).Xem nổi trên tất cả các ViewControllers
5
A
Trả lời
8
Có. Bạn có thể thêm chế độ xem của mình vào chính window
và đưa nó lên phía trước khi bạn phải.
Trong mã sau được coi là _viewConroller
và _anotherView
là các thuộc tính mạnh mẽ của appDelegate - tất nhiên cấu hình có thể khác nhau.
Mã này sẽ thêm hình vuông nhỏ màu xanh lam ở góc trên bên trái của màn hình.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
_viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
_anotherView = [[UIView alloc] initWithFrame: CGRectMake (0.0,0.0,20.0,20.0)];
[anotherView setBackgroundColor: [UIColor blueColor]];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
[self.window addSubView: _anotherView];
[self.window bringSubViewToFront: _anotherView]; //not really needed here but it doesn't do any harm
return YES;
}
3
Bạn có thể làm như sau nếu bạn đang sử dụng kịch bản và autolayout (lấy cảm hứng từ trả lời đầu tiên)
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *_vc = [sb instantiateViewControllerWithIdentifier:@"FloatingController"];
_anotherView = _vc.view;
[_anotherView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.window addSubview: _anotherView];
[[VLBConstraintsGenerator sharedInstance] setWidth:200 forView:_anotherView inSuperView:_window];
[[VLBConstraintsGenerator sharedInstance] setHeight:200 forView:_anotherView inSuperView:_window];
[[VLBConstraintsGenerator sharedInstance] setLeading:0 forView:_anotherView inSuperView:_window];
[_anotherView setBackgroundColor:[UIColor grayColor]];
[[_anotherView layer] setBorderWidth:1];
[[_anotherView layer] setBorderColor:[UIColor yellowColor].CGColor];
[self.window makeKeyAndVisible];
[self.window bringSubviewToFront:_anotherView]; //not really needed here but it doesn't do any harm
tất cả các bạn cần làm là để kéo một bộ điều khiển nhìn vào bạn storyboard chính với FloatingController như một ID storyboard
Phương pháp bổ sung
-(void)setWidth:(CGFloat)theWidth forView:(UIView *)theView inSuperView:(UIView *)theSuperView
{
assert([theSuperView isEqual:theView.superview]);
NSLayoutConstraint *cn = [NSLayoutConstraint constraintWithItem:theView
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:theWidth];
// [cn setPriority:999];//make it variable according to the orientation
[theSuperView addConstraint:cn];
}
-(void)setHeight:(CGFloat)theHeight forView:(UIView *)theView inSuperView:(UIView *)theSuperView
{
assert([theSuperView isEqual:theView.superview]);
NSLayoutConstraint *cn = [NSLayoutConstraint constraintWithItem:theView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:theHeight];
[theSuperView addConstraint:cn];
}
-(void)setLeading:(CGFloat)theLeading forView:(UIView *)theView inSuperView:(UIView *)theSuperView
{
assert([theSuperView isEqual:theView.superview]);
NSLayoutConstraint *cn = [NSLayoutConstraint constraintWithItem:theView
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:theSuperView
attribute:NSLayoutAttributeLeading
multiplier:1
constant:theLeading];
[theSuperView addConstraint:cn];
}
Ok, điều này cũng sẽ hoạt động khi bạn đang sử dụng bảng phân cảnh? – thvanarkel
Tôi tin rằng nó nên, nhưng tôi đã không thử nó ra. Có thể bạn sẽ phải tạo một phương thức để mang _anotherViewToFront và gọi nó sau khi viewControllers thay đổi địa điểm. –